안녕하세요, 이더리움 코드보는 Sigmoid입니다.
이미 많은 분들이 황서나 여러 정리 자료를 통해 이더리움 블록의 헤더가 어떤 역할을 하는지, 또 각 필드에 어떤 값이 들어가는지 충분히 알고 계실것 같습니다.
과연 우리의 geth는 잘 해내고 있을까요? 그래서 오늘은 코드를 통해 정말 그렇게 채우고 있는지 더블체크하는 시간을 가지려고 합니다.
먼저 , 이더리움 블록헤더는 이렇게 생겼습니다. (참 잘그린 그림이네요)
출처: https://ethereum.stackexchange.com/questions/268/ethereum-block-architecture
geth에서 이 블록헤더를 채우는 시작함수는 Miner.Start(coinbase)입니다. 그럼 하나하나 따라가면서 각 필드를 어떻게 채우는지
살펴 보도록 하겠습니다.
현재 블록의 번호와 블록 생성타임을 확인하고, parent로 지정합니다.
부모해시 필드와 블록 번호(부모 +1), 가스한도, 엑스트라 데이터와 시스템시간을 이용해
새 헤더를 생성/초기화합니다. 채굴보상을 받을 coinbase의 값도 설정해줍니다.
Extra data는 특별히 config로 설정하지 않는한, geth정보나 os버전등으로 초기화 됩니다.
ethash의 prepare함수를 호출합니다. 헤더의 난이도필드에 값을 계산하여 채웁니다.
트렌젝션 풀에서 블록에 담을 트렌젝션들을 가져와서, 적용해서 스테이트를 만듭니다.
또한 영수증을 생성하고 총 가스 사용량을 체크합니다. (다음에 자세히..아직 헤더를 채우지 않았습니다.)엉클 블록을 처리합니다. (다음에 자세히..아직 헤더를 채우지 않았습니다.)
4,5번에서 생성한 스테이트와 트렌젝션 엉클정보, 영수증을 가지고 최종 블록을 작성합니다.
먼저 헤더의 루트에 스테이트의 루트값을 넣습니다.
그다음 블록을 만드는 과정에서 트렌젝션 해시 필드를 채우고
영수증해시와 영수증 블룸을 채우고
엉클해시 필드를 채웁니다.
이렇게 해서 채굴과정에서 채워지는두 필드 (nonce, mix) 만 빼고 모두 잘 채워졌습니다.
각 필드의 값에 대해서 몇가지 알아두면 더 좋을만한 정보를 추가해 봅니다.
a. PrevHash는 부모의 헤더를 통째로 rlp인코딩하여 hash한 값입니다.
b. 스테이트루트 = trie를 해시한 값입니다. 트라이의 해시는 구성된 노드들을 통째로 rlp인코딩한후 collapse하여 만들어 냅니다. (머클의 효과!)
c. 트렌젝션 트라이의 키값은 블록 내 번호입니다. 0부터 순차적으로 증가합니다.
d. 트렌젝션 루트는 트렌젝션들을 통째로 deriveSha하는 것으로 보이지만, 내부적으로 다시 트라이를 만들고 트라이 해시를 만듭니다. (평소 저장은 트라이에 그냥하고 헤더에 루트를 넣을때만 머클루트를 생성하는것이지요)
e. 영수증도 트렌젝션과 동일하게 처리됩니다.
부족한 글 읽어주셔서 늘 감사합니다.
여러분의 up vote 가 큰 도움이 됩니다.
후원: 0x62467Ca1b449c854c4720395Dd9a7c6Ed5df47B7(ethereum)
Congratulations @sigmoid! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
Click here 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:
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit