이더리움 난이도 폭탄의 폭발과 해체
편집자 주: 이 기사의 출처는이더리움 애호가(ID: ethfans)편집자 주: 이 기사의 출처는
이더리움 애호가(ID: ethfans)
이더리움 애호가(ID: ethfans)
, 저자: Thomas Jay Rush, 번역 및 교정: Zeng Mi & A Jian, 승인을 받아 Odaily에서 재인쇄.

이더리움의 시한폭탄이 터질 때마다 우리 앞에는 항상 두 가지 문제가 떠오른다. 첫 번째 질문(아마도 더 중요한 질문)은 "언제 블록 생산이 느려질 것인가, 그것은 참을 수 없는 일입니다."이고 두 번째 질문은 "이번에는 얼마나 오래 폭탄을 지연시켜야 합니까?"
이 짧은 에세이에서 나는 두 번째 질문에 대한 사소하고 간단한 대답을 제안합니다. 난이도 폭탄은 얼마나 지연되어야 합니까? 내 제안은 "블록 높이 N에서 하드 포크를 수행해야 하는 경우 난이도 폭탄을 N 블록(또는 추가 보안을 위해 그 이하)으로 연기합니다."입니다.
이 기사에서는 난이도를 계산하는 방법을 설명하지 않을 것입니다(알고 싶다면 이전 기사를 참조하십시오). 아래 그림은 난이도 계산 공식을 나열한 지난번 글에 이미 등장했습니다.
(그림 속 텍스트: 현재 난이도 값 dc는 이전 난이도 값 dp와 두 부분을 더하여 구합니다. 첫 번째 부분은 현재 블록과 이전 블록 사이의 시간 간격을 기준으로 난이도를 조정합니다. s = tsc라고 합니다. - ts, s < 10일 때, 위 공식에서 factor max(x)는 1로 평가된다.(가분법 가정) 이 경우 너무 빨리 블록을 생성하면 난이도가 높아져 블록 생성 속도가 느려진다. 10<= s < 20이면 계수 max(x)가 0이 되어 s가 목표 시간인 14초에 가까워지면 더 이상 난이도가 조정되지 않으며 s>=20이면 값이 계수 max(x) 가 됩니다 계수는 점차 -99로 감소하여 난이도가 감소하여 블록 생성 속도가 증가합니다 방정식의 두 번째 부분은 이전 블록의 블록 번호를 기반으로 합니다. 100,000을 지수로 나누면 100,000 블록을 주기적 단계 함수로 사용합니다. 두 번째 부분은 우리가 종종 어려움 폭탄이라고 부르는 것입니다. 두 번째 부분이 없으면 어려움 폭탄은 이야기할 수 없습니다.)
공식의 첫 번째 부분을 "조정"(또는 A 부분)이라고 합니다. 현재 블록의 난이도를 조정하여 이전 블록의 블록 생성 시간 편차를 보정하는 부분입니다. 이 조정은 마지막 블록을 생성하는 데 걸린 시간에 따라 난이도를 낮추거나 높입니다. 위 이미지의 첫 번째 괄호는 이 부분을 강조 표시합니다. 잠시 시간을 내어 어떻게 작동하는지 알아보세요. 파트 A의 실제 효과는 설계 목표와 정확히 동일합니다.그 기능은 네트워크 운영에 대한 해시 비율 변동의 영향을 원활하게 하는 것입니다(번역자 주: 해시 비율은 컴퓨팅 성능의 단위이므로 컴퓨팅 파워) . 아래 차트에서 계산 공식의 A 부분이 예상대로 정확히 작동한다는 것을 분명히 알 수 있습니다.
A부분이 해시레이트의 영향을 배제하도록 설계된 대로 작동한다고 해서 시한폭탄을 지연시킬 방법을 생각할 때 컴퓨팅 파워의 실제 크기를 고려할 필요는 없다고 생각합니다. 즉, 컴퓨팅 파워가 너무 낮다고 해서 난이도 폭탄이 터졌을 때 블록 생성 시간이 길어지지 않고, 컴퓨팅 파워가 너무 높다고 해서 난이도 폭탄의 효과가 완화되지 않습니다. 위의 분석을 바탕으로 내 결론은 공식의 A 부분은 블록 시간을 늦추는 것과 아무 관련이 없다는 것입니다. 그리고 공식의 두 번째 부분(폭탄을 일으키는 B 부분)은 모든 문제를 일으키는 원인입니다.
다음 분석을 통해 이 두 부분을 별도로 취급하는 것이 가능하다는 것을 확신하게 될 것입니다. 이러한 분석을 통해 A 부분은 블록 생성에 영향을 미치지 않는 반면 B 부분(폭탄)은 블록 시간을 연장한다는 것을 쉽게 알 수 있습니다. 게다가 모든 포크에서 에포크를 0으로 재설정하기만 하면 폭탄을 해체하는 것이 얼마나 쉬운지 알게 될 것입니다.

보조 제목

데이터 및 형식 생성
위의 코드를 실행하면 .csv 형식의 다음과 같은 매우 간단한 데이터 파일을 생성할 수 있습니다...
위의 데이터는 EtherScan에서 얻은 일일 해시 비율 목록과 결합하여 이더리움의 난이도 계산을 이해하기에 충분합니다. RStudio와 "R"이라는 데이터 프로그래밍 언어를 사용하여 아래 차트를 작성했습니다. "R" 언어에 익숙하지 않은 경우 확인하는 것이 좋습니다. 아주 좋은 프로그래밍 언어입니다.
먼저 이더리움의 해시레이트를 살펴보자.

일일 평균 해시 비율
첫 번째 차트는 EtherScan의 데이터와 함께 이더리움 메인넷의 일일 평균 해시 비율을 보여줍니다. 데이터가 어떻게 수집/생성되었는지 모르기 때문에 진위를 보증할 수는 없지만 정확하다고 가정합니다. 이 링크를 클릭하면 관련 데이터를 볼 수 있습니다.
토론: 위의 그래프에서 이더리움의 해시레이트가 이더 가격에 따라 달라지는 것이 분명합니다. 이 그래프는 Ethereum의 가격 행동을 상기시킵니다. 2017년 여름, 해시 비율은 급등하여 2018년 1분기에 정점을 찍었습니다(통화 가격과 정확히 동일). 2016년 10월 해시레이트 변동은 당시 악명 높았던 DDos 공격에 의한 것으로, 위 그림의 회색 세로선 2개는 비잔틴 하드포크(2017년 10월)와 콘스탄티노플 하드포크(2019년 1월)를 나타냅니다. . 이 그림은 여기에서 당분간 분석하지만, 다음에 블록체인의 난이도 데이터를 논의할 때 계속 언급하겠습니다.

보조 제목

원시 난이도 데이터
난이도 데이터를 기반으로 하는 첫 번째 그래프는 Parity의 RPC 호출 get_Block에서 반환된 데이터를 보여줍니다. 먼저, 일부 표준 통계는 다음과 같습니다.
첫 번째 그래프는 매우 간단합니다.
토론: 위 그림의 데이터는 블록 8,920,000에서 생성되었습니다. 이 많은 데이터 레코드를 처리하는 것은 "R" 언어에서 케이크 조각이지만 데이터 마이닝의 반복적 특성을 고려할 때 100개 중 1개의 레코드를 샘플링하여 약 9,000개의 레코드를 그림에 표시했습니다. 이전 기사와 일관되게 위 이미지의 회색 세로선도 하드 포크를 나타냅니다.
빨간색 선의 높이(y(x) = block.x의 난이도)는 주어진 블록의 난이도 값을 나타냅니다. 모든 포크에서 난이도 폭탄을 해체하는 효과를 쉽게 볼 수 있습니다. 이전 기사에서 해시레이트에 대한 그래프로 돌아가서 2016년 가을 DDos 공격에서 난이도와 해시레이트의 관계를 볼 수 있습니다.

난이도 폭탄이 해체되지 않았다고 가정하면(실제로 난이도가 활성화된 높이에서 빨간색 선을 위쪽으로 확장) 두 하드 포크에 대해 동일한 작업을 수행하면 이것이 해시레이트 변화 그래프와 놀랍도록 일치함을 알 수 있습니다. . 즉, 해시레이트와 난이도는 밀접하게 연결되어 있어 완벽하게 이해됩니다. 그것이 난이도 공식의 A 부분이 설계된 것이기 때문입니다. 다양한 해시레이트에 대한 난이도 값을 직접 조정하기 위해 존재합니다.
채굴자의 행동은 난이도 폭탄의 해체로 인해 변경되지 않을 수 있습니다. 그들의 채광 장비는 난이도 폭탄이 소멸되기 전과 후에도 똑같이 잘 작동했습니다. 유일한 변화는 블록을 생성하는 평균 시간이 짧아졌다는 것입니다.
토론: 위의 그래프를 100,000개의 블록 그룹으로 수직선으로 나눕니다. 눈을 크게 뜨고 잘 보세요. 난이도 점프를 나타내는 곡선이 우리가 만든 수직선(구분선)과 정확히 일치합니다. 이러한 구분선 사이에서 난이도는 계속 상승하지만 구분선의 점프만큼 빠르지는 않습니다. 폭발적인 난이도 상승은 2017년 해시레이트가 급등한 것과 일맥상통한다.
폭탄이 폭발할 때마다 난이도 값이 이전 값의 두 배로 증가합니다. 이러한 점프의 주기성은 현재 진행 중인 상황을 이해하는 데 특히 중요합니다.
이 기사의 나머지 다이어그램에서 우리의 목표는 난이도 공식의 첫 번째 부분(즉, A 부분 또는 "조정")과 두 번째 부분(즉, B 또는 "폭발")을 분리하는 것입니다. 따라서 향후 어려움 폭탄을 처리하는 방법을 더 잘 이해하는 데 도움이 됩니다.


보조 제목
블록마다 난이도 변경
다음 차트에서는 각 연속 블록 사이의 난이도 변화를 살펴봅니다. 계산 공식은 y(x) = 블록 x의 난이도 값 - 블록 x-1의 난이도 값입니다.
당신에게 이 그래프는 난이도 폭탄의 첫 번째 시각적 표현일 수 있습니다. 분명히 각 폭발은 이전 폭발보다 두 배 더 어렵습니다.
그러나 제 생각에는 이 그림이 아직 명확하지 않습니다. 예를 들어, 콘스탄티노플에서 같은 패턴이 명확하게 다시 나타나지 않은 이유는 무엇입니까? 사실 해시레이트가 많이 높아졌기 때문이다. 계산의 이 부분은 차단 시간을 14초로 유지할 수 있지만 시스템은 더 심하게 변동합니다. 이것은 또한 난이도 폭탄이 콘스탄티노플 포크에 접근할 때 더 격렬한 변동에 가려져 식별할 수 없었던 이유를 설명합니다.
그렇다면 더 명확하게 볼 수 있는 다른 조치가 있습니까? 틀림없이! 이 방법은 존재하며 다음 차트에서 알려드리겠습니다.

보조 제목
난이도의 상대적 변화

기사의 이 섹션에 있는 마지막 차트는 총 블록 난이도에 대한 난이도의 백분율 변화를 보여줍니다. 계산 공식은
이전 차트는 난이도의 원시 변화를 보여줍니다. 이 그래프는 해시 비율 증가 효과를 제거한 정규화된 난이도 변화를 보여주므로 난이도 계산 공식의 두 부분인 파트 A와 파트 B를 보다 명확하게 볼 수 있습니다.
토론: 이제 이전 기사에서 난이도 폭탄을 논의할 때 컴퓨팅 성능에 대해 걱정하는 것이 비생산적일 것이라고 말한 이유를 이해해야 합니다. 이 그래프에서 똑딱거리는 시한폭탄이 "고개를 올릴" 때까지 블록 생산이 해시레이트의 증가(또는 감소)에 영향을 받지 않는다는 것을 분명히 알 수 있습니다. 공식의 파트 A는 블록 생산의 속도와 출력을 안정적인 상태로 유지합니다. 시한 폭탄이 터질 때까지 난이도(평균 및 정규화 데이터에서)는 거의 영향을 받지 않습니다.
여기에서 주목해야 할 두 가지 흥미로운 사항이 더 있습니다. (1) 위의 이미지에서 폭탄이 차트의 맨 오른쪽에서 "위를 보기" 시작하는 것을 볼 수 있습니다. .(2) 차트 하단의 줄무늬는 공식의 A 부분에서 10으로 나눈 부분 때문이며, (3) Ha가 높을수록 Hitch rate가 "head up ", Lane Rettig가 콘스탄티노플 포크 이전에 언급했듯이 위에서 언급 한 기사에서도 썼습니다.
이 사진에 대해 아직 공유할 내용이 더 많습니다. 언젠가 다시 돌아와서 글을 계속 쓸 수 있을지도 모릅니다. 하지만 미래에 폭탄을 해체할 수 있는 더 좋은 방법이 있었으면 합니다.
보조 제목

폭탄을 해체하는 더 좋은 방법
우선 시한폭탄을 걱정하면서 연산력 변동을 걱정하는 것은 역효과라는 점을 다시 한 번 강조하고 싶다. 계산 공식의 파트 A는 컴퓨팅 성능의 증가(또는 감소) 영향을 이미 배제했습니다. 이것이 바로 파트 A의 내용입니다. 거의 완벽하게 평탄한 난이도 증가(당시 블록 높이에 비례)는 파트 A가 거의 완벽하게 작동함을 증명합니다. 분명히 해시율은 블록 시간에 영향을 미치지 않습니다. 그러나 우리는 이미 이것을 알고 있습니다. 이것이 난이도 조정이 설계된 이유입니다.

폭탄은 위 공식의 끝에 추가된 추가 값으로 정의됩니다.

(역자 주: floor(x)는 내림 함수입니다. 즉, x보다 크지 않은 가장 큰 정수를 취하는 것입니다. 예를 들어 floor(3.14) = 3)
위 공식은 밑이 2인 거듭제곱 함수입니다. p = floor(현재 블록 번호/100,000)라고 하면 위 공식을 2p로 다시 쓸 수 있습니다. (공식 끝에 있는 -2를 먹은 건지 궁금할 수 있습니다. 아니요, 계산된 값을 작게 만드는 기능이 있기 때문에 당분간 무시합니다.) 마지막으로 긴 단계 함수를 얻습니다.

그러나 핵심 개발자는 폭탄을 두 번 재설정했습니다. 예, 문자 그대로 "재설정"하면 폭탄 계산의 주기 시작을 재설정합니다. 이것은 Go 코드를 사용하여 계산에 사용되는 의사 블록을 생성함으로써 달성됩니다. 지금까지 가짜 블록은 과거에 폭탄을 재설정하는 효과가 있었던 것으로 보입니다. 아래의 수정된 차트는 이 기간 동안 실제로 발생한 일을 보여줍니다.
다음 표는 재설정 후 일부 정보를 나열한 것입니다. 이상한 점을 찾으셨나요?
비잔틴 포크 이후 의사 블록 번호는 1,370,000이고 이 값을 100,000으로 나누어 주기 13을 얻습니다. 즉, 해시레이트 조정 후 각 블록의 난이도가 추가로 213씩 증가합니다. 콘스탄티노플 하드 포크가 발생했을 때 가짜 블록 번호가 2,280,000으로 재설정되었는데, 이는 기간이 22가 되었음을 의미하며, 각 블록의 난이도가 추가로 222씩 증가했음을 의미합니다. 그래서 시한폭탄이 생각보다 일찍 터진 것 같아요. 마지막으로 재설정했을 때 충분히 되돌아가지 않았기 때문입니다.
이번에 시한폭탄을 재설정하기 위한 권장 값은 69,000 블록을 롤백하여 에포크를 0으로 만드는 것입니다. 재설정할 정확한 금액입니다.
시한 폭탄을 재설정해야 할 때마다 올바른 값으로 재설정하는 매우 간단하고 쉬운 방법이 있습니다. 이런 식으로 난이도 폭탄과 관련된 대부분의 문제가 사라집니다. 난이도 폭탄을 재설정할 때 블록 수를 포크의 FORK_BLOCK_NUMBER(포크 블록 번호)와 동일하게 다시 설정(또는 약간 조정)하면 됩니다. 이렇게 하면 가짜 블록 번호가 0에 가깝게 설정되고 에포크도 0이 됩니다.

결론적으로
블록 생성 속도의 둔화는 주로 시한 폭탄의 존재로 인해 위의 방법으로 "헤드 업" 효과를 완전히 예측할 수 있게 됩니다. 파트 B의 계산은 완전히 의사 블록 번호에 따라 달라집니다. 콘스탄티노플 분기점(아래 표 참조)에 이 작업을 수행했다면 시한 폭탄이 그렇게 빨리 폭발하지 않았을 것입니다.
보조 제목
결론적으로


