이더리움 Level DB를 까보자(3) - state root 까보기

in #ethereum6 years ago (edited)

안녕하세요, 이더리움 코드보는 SigmoiD입니다.
오늘은 기존에 분석하던 LevelDB 데이터를 그대로 사용하지 않고, 트렌젝을 추가한 DB를 가지고 분석해보려고 합니다.

이전 글은 여기로
https://steemit.com/ethereum/@sigmoid/level-db-1
https://steemit.com/ethereum/@sigmoid/level-db-2-db-schema

1번글의 동일 환경에서 트렌젝션을 하나 추가했습니다. 0번 계정에서 1번계정으로 1 이더를 전송하는 것이고
0번 계정의 경우 2번블록까지 마이닝을 했기 때문에 마이닝 보상으로 받은 이더리움을 가지고 있는 상태구요.

Screenshot_20190114-102058_Termux.jpg

어카운트 현황, 트렌젝션을 전송하기 위해 0번 계정을 unlock한 상태

Screenshot_20190114-102043_Termux.jpg

트렌젝션을 생성하여 전송

Screenshot_20190114-102139_Termux.jpg

트렌젝션이 채굴되어 1번계정의 잔액이 늘어난 상태

Screenshot_20190114-103745_Termux.jpg

3번블록에 포함된 트렌젝션

이 상태의 DB를 덤프한 결과는 아래와 같습니다.
https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/output_tx.txt

분석에 들어가기 전에, DB스키마의 prefix를 다시한번 체크합니다.

0x44: [DatabaseVersion, ]
0x48: [블록해시, 블록번호]
0x4C: [LastXXX, 블록해시]
0x62: [블록해시 + 블록번호, 블록바디]
0x65: [chain-config-, config]
0x68: [블록번호 + 0x6e, 블록 헤시]
0x68: [블록번호 + 0x6e + 블록해시, 블록 헤더]
0x68: [블록번호 + 0x6e + 블록해시 + 0x74, 채굴 난이도]
0x72: [블록번호 + 블록해시, 영수증]
이번 DB에서 새롭게 보이는 prefix
6c : transaction lookup

우선 3번블록을 rlp decoding해봅니다.
https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/block_header_3_with_tx.txt

state root: 0d9348243d7357c491e6a61f4b1305e77dc6acacdb8cc708e662f6a9bab6ca02
transaction root: f520abd5cf4fe1a16378bdf7d12fbabe6642a6f33996000e5763b39e15eca9bb
receipt root: a1a8122d87dcbe1634df20264274ed8f072e0eb3d7a608859689df9cb5f100d9

먼저 스테이트 루트는 1번라인에 있네요.
https://github.com/NAKsir-melody/eth-function-tests/blob/db43eb53b27215f4ae25fd2d3a3b325faf9f248a/go-ethdb/output_tx.txt#L1
값은 아마 trie일것 같으니, 한번 파싱해 보겠습니다.
간단한 코드를 작성하고 결과를 확인합니다.
Screenshot_20190114-124245_Samsung Internet.jpg

출력값은 아래와 같습니다.
[56c093a349d905ad74b68851304d5dc5f111fbab2c24c4b4d02e96d2fc0727fd, f84c80880de0b6b3a7640000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470][761d5c42184a02cc64585ed2ff339fc39a907e82731d70313c83d2212b2da36b, f84c0188c249fdd327780000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470]

3번블록에 해당하는 스테이트 루트의 트라이에는 2개의 키값 쌍이 들어있는데,
이 키 앞쪽에는 "secure-key-" 프리픽스를 붙여서 35,36번 db line에 저장되어 있습니다.
값은 1번라인과 30번라인에서 얻어왔네요?

1번라인과 30번 라인의 키 값은 각각 18e3b46e84b35270116303fb2a33c853861d45d99da2d87117c2136f7edbd0b9과
717aef38e7ba4a0ae477856a6e7f6ba8d4ee764c57908e6f22643a558db737ff 입니다.

그리고 1번라인의 값에서 다음과 같은 값을 보실수 있습니다.
f8518080808080a0
18e3b46e84b35270116303fb2a33c853861d45d99da2d87117c2136f7edbd0b9
80a0
717aef38e7ba4a0ae477856a6e7f6ba8d4ee764c57908e6f22643a558db737f
f808080808080808080

Screenshot_20190114-150107_Slides.jpg

트라이의 노드값을 rlp인코딩하려면 복잡하니까.. stateDB로 직접 접근해서 계정들을 찍어보도록 합니다.
Screenshot_20190114-142946_Termux.jpg

논스(1)과 잔액(14000000000000000000)이 잘출력된다.

비슷한 형태로 2번블록의 트렌젝션 루트도 까보면 논스(0)과 잔액(10000000000000000000)이 잘출력됩니다.
참조: https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/go-state-history.go

트렌젝션 루트랑. 영수증도 비슷하게 까질것으로 예상하는데..
추후에 업데이트 하도록 하겠습니다.