EIP-100 엉클 포함 블록 시간 기준 난이도 조정 (Change difficulty adjustment to target mean block time including uncles)

최종 확정 · 합의·스테이킹 · 원문 상태 Final · 2016-04-28 작성

작업증명 시절 난이도 조정 공식을 바꿔 메인 체인 블록만이 아니라 엉클 블록까지 포함한 평균 블록 생산 속도를 일정하게 유지합니다. 비잔티움 포크부터 적용됐습니다.

왜 필요한가

이 EIP가 나온 당시 이더리움은 채굴로 블록을 만드는 작업증명 방식이었고 채굴됐지만 메인 체인에 오르지 못한 엉클(uncle) 블록에도 보상이 주어졌습니다. 그런데 난이도 조정 공식은 메인 체인 블록 사이의 시간 간격만 보고 엉클 블록은 전혀 반영하지 않았습니다. 그 결과 엉클 블록이 많아져도 난이도는 그대로여서 엉클을 포함한 전체 블록 생산 속도와 그에 따른 이더 발행 속도가 흔들릴 수 있었습니다. 특히 엉클 비율을 일부러 조작해 발행량을 위로 끌어올릴 여지가 있었고 원문은 이를 다룬 '언클 마이닝' 합의 프로토콜 결함 분석 글을 참고 자료로 인용합니다. 이 EIP는 난이도 조정이 엉클까지 포함한 블록 생산 속도를 기준으로 삼게 바꿔 발행 속도를 예측 가능하게 만듭니다.

무엇이 바뀌나

지금

EIP-100 이후

누구에게 영향이 있나

심층 설명

기존 난이도 조정 공식

기존 공식은 adj_factor = max(1 - ((timestamp - parent.timestamp) // 10), -99)로 조정 계수를 구합니다. 부모 블록과의 타임스탬프 간격을 10초 단위로 나눠 블록이 빨리 나오면 난이도를 올리고 늦게 나오면 내리되 한 번에 -99 아래로는 내리지 않습니다. 자식 블록 난이도는 child_diff = int(max(parent.difficulty + (parent.difficulty // BLOCK_DIFF_FACTOR) * adj_factor, min(parent.difficulty, MIN_DIFF)))로, 부모 난이도의 BLOCK_DIFF_FACTOR분의 1을 단위로 조정 계수를 곱해 더하고 MIN_DIFF 밑으로 내려가지 않게 합니다. 이 공식은 메인 체인 블록 간격만 보고 엉클 블록은 반영하지 않습니다.

새 공식: 엉클 유무 반영과 분모 변경

block.number >= BYZANTIUM_FORK_BLKNUM이면 첫 줄을 adj_factor = max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99)로 바꿉니다. 달라지는 점은 두 가지입니다. 첫째, 부모 블록에 엉클이 하나라도 있으면 기준값이 1에서 2로 올라가 난이도가 더 크게 오릅니다. 둘째, 시간 간격을 나누는 분모가 10에서 9로 줄어듭니다. 하한 -99와 그 아래의 난이도 계산식은 그대로 둡니다.

정확한 공식 대신 근사 공식을 쓴 이유

엉클 개수를 정확히 반영하는 공식 adj_factor = max(1 + len(parent.uncles) - ((timestamp - parent.timestamp) // 9), -99)도 원문에 제시됩니다. 이 공식은 엉클 k개를 가진 블록을 같은 타임스탬프로 연달아 나타난 k+1개 블록과 동일하게 취급하는 것과 약 3/4194304 오차 안에서 수학적으로 동등하며 원하는 효과를 내는 가장 단순한 방법일 것이라고 원문은 설명합니다. 다만 이 공식은 엉클 개수를 알아야 하므로 블록 헤더만으로는 계산할 수 없고 블록 전체가 필요합니다. 채택된 근사 공식은 엉클의 유무만 따지므로 헤더만으로 계산할 수 있습니다. 헤더의 엉클 해시를 빈 해시와 비교하면 엉클이 있는지 확인할 수 있기 때문입니다.

분모를 10에서 9로 바꾼 이유

시간 간격을 나누는 분모를 10에서 9로 바꾸면 블록 시간이 대체로 지금과 비슷하게 유지됩니다. 엉클을 난이도에 반영하면서 생기는 변화를 분모 조정으로 맞춘 것입니다. 원문은 작성 당시 엉클 비율 7%를 기준으로 하면 블록 시간이 오히려 약 3% 줄어들 것이라고 계산합니다.

발행률 조작 방지 효과

새 공식은 난이도 조정이 엉클을 포함한 블록 생산 속도를 일정하게 유지하도록 만듭니다. 그 결과 발행 속도가 높은 수준으로 예측 가능해지고 엉클 비율을 조작하는 방법으로는 발행량을 위로 끌어올릴 수 없게 됩니다. 원문 참고 자료는 EIP 100 논의 스레드와 함께, 엉클을 이용한 채굴 전략을 이더리움 합의 프로토콜의 결함으로 분석한 2016-04-28자 bitslog 글을 인용합니다.

적용 시점과 현재 상태

이 EIP는 Vitalik Buterin이 2016-04-28에 작성했고 상태는 Final입니다. 명세의 조건 block.number >= BYZANTIUM_FORK_BLKNUM대로 비잔티움(Byzantium) 하드포크 블록부터 새 공식이 적용됩니다. 이 변경에 대한 별도의 코어 개발자 콜 결정 기록은 이번 자료에 포함되어 있지 않습니다.

EIP 원문 · ← EIPs