이더리움 Level DB를 까보자(4) - 손으로 rlp디코딩 하기

in #ethereum6 years ago (edited)

안녕하세요, 이더리움 코드보는 Sigmoid입니다.

이더리움은 데이터를 저장하기 위해 trie 구조를 사용하며,
해당 구조를 DB에 저장할땐, 다음그림과 같이 RLP인코딩을 한다고 알려져 있는데요,

Screenshot_20190115-122502_Slides.jpg

지난 번 포스팅에서 아래 보이는 데이터를 우리가 확보했잖아요?

Screenshot_20190114-150107_Slides.jpg

그래서 직접 손으로 RLP 디코딩 해 보았습니다.
https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/state_trie.txt

먼저 스테이트 루트를 키로하는 값을 디코딩해봅니다.
Screenshot_20190115-122922_Samsung Internet.jpg

첫 노드부터 extension node네요 15개의 빈값과 2개의 해시값이 저장되어 있습니다.
이제 첫번째 해시값을 키로가진 데이터를 파싱합니다.
Screenshot_20190115-123141_Samsung Internet.jpg

스테이트 루트이기 때문에 어카운트 구조체가 보이네요.
잔액이 1이더인것으로 봐서는 A로 부터 1이더를 수신한 계정입니다. nonce는 0이죠(트렌젝션을 발생시킨적이 없으므로)
또한 스토리지루트와 코드해시가 디폴트 값임을 알수 있습니다.

두번째 해시를 키로 가지는 값도 마져 디코딩해봅니다.
Screenshot_20190115-123343_Samsung Internet.jpg

논스가 1인 계정의 상태가 나왔습니다.
(잔액 계산이 좀 이상해서 확인이 필요함, 이전 스테이트의 참조일지도?)
이 계정 스토리지루트와 코드해시가 디폴트 값임을 알수 있습니다.

이더리움에서는 이렇게 db에 저장된 내용을 읽어들여, trie로 다시 만든후, 클라이언트의 요청에 응답합니다.
이정도선에서 스테이이트 루트는 마무리 하기로 합니다.

이더리움 공부에 도움이 되시길 바랍니다!

Sort:  

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

You received more than 10 as payout for your posts. Your next target is to reach a total payout of 50

Click here to view your Board
If you no longer want to receive notifications, reply to this comment with the word STOP

Support SteemitBoard's project! Vote for its witness and get one more award!