이더리움 Level DB를 까보자(3) - state root 까보기
안녕하세요, 이더리움 코드보는 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번블록까지 마이닝을 했기 때문에 마이닝 보상으로 받은 이더리움을 가지고 있는 상태구요.
어카운트 현황, 트렌젝션을 전송하기 위해 0번 계정을 unlock한 상태
트렌젝션을 생성하여 전송
트렌젝션이 채굴되어 1번계정의 잔액이 늘어난 상태
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일것 같으니, 한번 파싱해 보겠습니다.
간단한 코드를 작성하고 결과를 확인합니다.
출력값은 아래와 같습니다.
[56c093a349d905ad74b68851304d5dc5f111fbab2c24c4b4d02e96d2fc0727fd, f84c80880de0b6b3a7640000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470][761d5c42184a02cc64585ed2ff339fc39a907e82731d70313c83d2212b2da36b, f84c0188c249fdd327780000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470]
3번블록에 해당하는 스테이트 루트의 트라이에는 2개의 키값 쌍이 들어있는데,
이 키 앞쪽에는 "secure-key-" 프리픽스를 붙여서 35,36번 db line에 저장되어 있습니다.
값은 1번라인과 30번라인에서 얻어왔네요?
1번라인과 30번 라인의 키 값은 각각 18e3b46e84b35270116303fb2a33c853861d45d99da2d87117c2136f7edbd0b9과
717aef38e7ba4a0ae477856a6e7f6ba8d4ee764c57908e6f22643a558db737ff 입니다.
그리고 1번라인의 값에서 다음과 같은 값을 보실수 있습니다.
f8518080808080a0
18e3b46e84b35270116303fb2a33c853861d45d99da2d87117c2136f7edbd0b9
80a0
717aef38e7ba4a0ae477856a6e7f6ba8d4ee764c57908e6f22643a558db737f
f808080808080808080
트라이의 노드값을 rlp인코딩하려면 복잡하니까.. stateDB로 직접 접근해서 계정들을 찍어보도록 합니다.
논스(1)과 잔액(14000000000000000000)이 잘출력된다.
비슷한 형태로 2번블록의 트렌젝션 루트도 까보면 논스(0)과 잔액(10000000000000000000)이 잘출력됩니다.
참조: https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/go-state-history.go
트렌젝션 루트랑. 영수증도 비슷하게 까질것으로 예상하는데..
추후에 업데이트 하도록 하겠습니다.