이더리움의 consensus 패키지

in ethereum •  6 years ago  (edited)

consensus package는 개념상으로 합의엔진을 정의하고 구현하는데, 엔진으로서 구현해야하는 기능은 다음과 같습니다.

  • 헤더 검증
    • 블록 난이도의 검증: 부모+타임스템프
    • 블록넘버: 부모+1
    • 인장 검증: 논스 검증
    • 가스 사용량
    • DAO, fork처리
  • 엉클 검증: 엉클블록에 대한 처리(7세대까지만 허용하는 부분)
  • 인장(seal) 검증: 블록이 난이도 조건을 만족하는지 확인하고, 논스값을 업데이트한 헤더로 블록헤더를 교체한다
  • 블록 준비: 헤더의 난이도를 계산하고 필드를 초기화한다
  • 블록 최종화(finalize) - 블록 리워드 같은 상태 변화의 후처리를 담당

해당 기능을 구현한 패키지는 블록체인에 consensus Engine으로서 사용될수 있게 되는데, 현재 이러한 기능을 구현한 패키지가 Ethash(PoW)와 clique( PoA) 입니다. 이글에서는 ethash만 우선 분석해보고자 합니다.

그림과 같이 ethash는 크게 알고리즘부와 합의엔진부로 나뉘어져 있고요, 합의엔진부는 위에 언급된 합의에 관련한 기능들을 구현하고 있습니다 인장 검증과정이 헤더검증 내부에도 있고, 단일과정으로서도 있는데요

  • 헤더 검증에서의 인장검증은 다른 노드가 찾은 논스를 검증할때 쓰이는것이고, hashimotoLight라는 알고리즘 함수를 사용하고요.
  • 인장검증 자체는 mine함수에서 블록의 논스를 찾기위해 hashimotoFull함수를 사용합니다. 논스를 찾게되면 블록이 완성되는것이죠( sealing, 인장이 찍힌다고 표현하겠습니다)

결국 ethash 알고리즘은 위 그림에서 처럼 합의 엔진의 논스와 관련된 것이라고 한정해도 될것 같습니다. ethash 알고리즘의 특성은 아래와 같다고 합니다.

https://github.com/ethereum/wiki/wiki/Ethash
https://github.com/ethereum/wiki/wiki/Dagger-Hashimoto
초반에 dagger-hashimoto POW 알고리즘은 메모리를 많이 쓰는 연산을 통해 asic으로 연산이 가속되는걸 막으면서, light클라이언트도 검증이 가능한 알고리즘을 만들었고 지금의 Ethash에서 사용하는 알고리즘으로 발전했다고 합니다.
하시모토 시절에는 블록을 N개 고르고 그안에 트렌젝션들을 모두모아 XOR을 한 이후에, 해싱을 했다고 하고,
ethash에서는 데이터를 모아서 xor을 하긴 하는데 FNV해시로 xor을 대신했다고 하네요.

아무튼 데이터를 모아서 뭔가를 하는 알고리즘의 구현을 seed, cache, dataset(item) 을 통해 구현하고 있습니다.
*seed(seedhash): 블록 넘버를 이용해 계산한 해시
*cache: seed로 부터 keccack512로 초기화 한 32MB의 캐시(64byte-524288개)
*dataset Item: cache에서 256개를 랜덤하게 선택하여 하나로 만든값을 해시한다 (64byte)
*dataset: data item(64byte)들의 모임으로 1GB (= 16M개), 블록 30000개마다 교체

논스는 seed값부터 시작해서 난이도조건을 만족하는 논스가 찾아질때까지 +1씩 증가하고요
마이닝시 dataset에서 item을 가지고 가서 해싱하는 과정에서 hashimotoFull함수는
주어진 데이터셋을 가지고 가서 해싱과정을 거친다음 최종 값을 만들어 내는데,
이 최종값이 난이도 값보다 크면 난이도에 적합한 논스를 찾았다고 판단하고 블록을 seal하게 됩니다.

값이 어떻고 해싱을 어떻게 하는지는 다루지 않겠습니다(이건 그냥 하는거라..)
결국 PoA도 알고리즘 구현부만 달라졌을텐데, 어떤형태로 달라졌을지 궁금하네요

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Congratulations @sigmoid! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of posts published

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Do not miss the last post from @steemitboard:
SteemitBoard World Cup Contest - The semi-finals are coming. Be ready!


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


Do you like SteemitBoard's project? Then Vote for its witness and get one more award!