create account

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

View this thread on: hive.blogpeakd.comecency.com
· @sigmoid · (edited)
$1.44
이더리움 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번블록까지 마이닝을 했기 때문에 마이닝 보상으로 받은 이더리움을 가지고 있는 상태구요.

![Screenshot_20190114-102058_Termux.jpg](https://cdn.steemitimages.com/DQmbPBoD5ES2thU8NSZWN3SCW8bxFxgfkJNNMsCZDdx4rZo/Screenshot_20190114-102058_Termux.jpg)
> 어카운트 현황, 트렌젝션을 전송하기 위해 0번 계정을 unlock한 상태

![Screenshot_20190114-102043_Termux.jpg](https://cdn.steemitimages.com/DQmezckS5MoyMoK3iMaKmYfcegGYwXQ4SgeuyZLstHurnjN/Screenshot_20190114-102043_Termux.jpg)
> 트렌젝션을 생성하여 전송

![Screenshot_20190114-102139_Termux.jpg](https://cdn.steemitimages.com/DQmdQyN4Ytpm86ztNAMYLhqTQ8JWSiMrUt5TzkicSFxMZGv/Screenshot_20190114-102139_Termux.jpg)
> 트렌젝션이 채굴되어 1번계정의 잔액이 늘어난 상태

![Screenshot_20190114-103745_Termux.jpg](https://cdn.steemitimages.com/DQmWH6K8cm2M42A33Wuw7kHpmWq3edQMeeos1sAd7K9hsem/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](https://cdn.steemitimages.com/DQmXGtJEPAxMUn8N9v7a9CQYpaXStxtBzNc2x8rPsKMuA15/Screenshot_20190114-124245_Samsung%20Internet.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](https://cdn.steemitimages.com/DQmWnVvbBGQKcEkxMdmH1iW8TnFYMSsyyYPzpXsJ5k7LD7W/Screenshot_20190114-150107_Slides.jpg)

트라이의 노드값을 rlp인코딩하려면 복잡하니까.. stateDB로 직접 접근해서 계정들을 찍어보도록 합니다.
![Screenshot_20190114-142946_Termux.jpg](https://cdn.steemitimages.com/DQmbPggQd8qFf2nq4FUUsXYfBeFBGBZoJXDrzzzk6VXMZvV/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

트렌젝션 루트랑. 영수증도 비슷하게 까질것으로 예상하는데..
추후에 업데이트 하도록 하겠습니다.
👍  , , , , , , , , , , ,
properties (23)
authorsigmoid
permlinklevel-db-3
categoryethereum
json_metadata{"image":["https://cdn.steemitimages.com/DQmbPBoD5ES2thU8NSZWN3SCW8bxFxgfkJNNMsCZDdx4rZo/Screenshot_20190114-102058_Termux.jpg","https://cdn.steemitimages.com/DQmezckS5MoyMoK3iMaKmYfcegGYwXQ4SgeuyZLstHurnjN/Screenshot_20190114-102043_Termux.jpg","https://cdn.steemitimages.com/DQmdQyN4Ytpm86ztNAMYLhqTQ8JWSiMrUt5TzkicSFxMZGv/Screenshot_20190114-102139_Termux.jpg","https://cdn.steemitimages.com/DQmWH6K8cm2M42A33Wuw7kHpmWq3edQMeeos1sAd7K9hsem/Screenshot_20190114-103745_Termux.jpg","https://cdn.steemitimages.com/DQmXGtJEPAxMUn8N9v7a9CQYpaXStxtBzNc2x8rPsKMuA15/Screenshot_20190114-124245_Samsung%20Internet.jpg","https://cdn.steemitimages.com/DQmWnVvbBGQKcEkxMdmH1iW8TnFYMSsyyYPzpXsJ5k7LD7W/Screenshot_20190114-150107_Slides.jpg","https://cdn.steemitimages.com/DQmbPggQd8qFf2nq4FUUsXYfBeFBGBZoJXDrzzzk6VXMZvV/Screenshot_20190114-142946_Termux.jpg"],"tags":["ethereum","leveldb","stateroot"],"app":"steemit/0.1","format":"markdown","links":["https://steemit.com/ethereum/@sigmoid/level-db-1","https://steemit.com/ethereum/@sigmoid/level-db-2-db-schema","https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/output_tx.txt","https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/block_header_3_with_tx.txt","https://github.com/NAKsir-melody/eth-function-tests/blob/db43eb53b27215f4ae25fd2d3a3b325faf9f248a/go-ethdb/output_tx.txt#L1","https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/go-state-history.go"]}
created2019-01-14 03:05:09
last_update2019-01-14 06:02:27
depth0
children0
last_payout2019-01-21 03:05:09
cashout_time1969-12-31 23:59:59
total_payout_value1.082 HBD
curator_payout_value0.355 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length3,898
author_reputation643,977,730,212
root_title"이더리움 Level DB를 까보자(3) - state root 까보기"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,342,953
net_rshares2,582,874,915,686
author_curate_reward""
vote details (12)