이더리움 Level DB를 까보자(2) - 데이터 분석하여 DB schema 보기

in #ethereum6 years ago (edited)

안녕하세요, 이더리움 코드 보는 sigmoid입니다.
오늘은 지난 블로그에 이어, level DB상의 데이터를 분석해보려 합니다.

전체 데이터 파일 위치: https://github.com/NAKsir-melody/eth-function-tests/blob/839c75fe897bb91e0e60d9a08833fb68326e688f/go-ethdb/output.txt

DB상의 첫줄을 핵사값을 스트링으로 변경해주는 사이트를 참조해서 값을 바꿔보면 DatabaseVersion으로 변환됩니다.
처음 레벨디비를 만들고나서 써주는 값입니다.
Screenshot_20190111-114839_Samsung Internet.jpg

다음 2~9줄은 0x48로 시작되는 데, 이 prefix는 "헤더의 번호를 담고 있다"는 뜻으로 [H]입니다. H뒤에 우리가 이전 포스트에서 보았던 블록의 해시값이 붙어있고, 값으로는 블록의 번호가 0~7까지 써져있네요.
Screenshot_20190111-131319_Samsung Internet.jpg

10, 11, 12는 각각 LastBlock, LastFast, LastHead 블록에 대한 정보로 블록해시를 담고 있습니다.
현재는 full sync 모드이기 때문에, 모든 해시값이 7번블록의 블록해시와 같아야 겠죠
[7837651... ]로 서로 같네요 (9번라인의 블록해시와도 같음!)
Screenshot_20190111-131517_Samsung Internet.jpg

13 ~ 20은 각 블록의 바디를 rlp한 정보입니다. 앞에 60은 블록바디를 뜻하는 [ b]이고요, 그 뒤에 블록번호(8byte)가 옵니다.
그뒤에 블록의 해시값이오고, 해당 해시에 해당하는 바디의 값이 쓰여져야 할텐데, 현재는 c2c0c0로 모든 값이 같네요 (아래처럼 정의된 블록이 모두 비었으니까요 트렌젝션없음 영수증 없음)

c2c0c0를 rlp decoding해보면 바이트어레이 두개로 구성되었는데, 첫번째 바이트어레이는 nil, 두번째 바이트어레이도 nil이다. 로 해석 가능합니다.
Screenshot_20190111-130559_Termux.jpg

21번 라인은 ethereum-config- + 제네시스 블록 해시입니다. 값 필드를 디코딩해보면 아래와 같이 나오네요.
{"chainId":33,"homesteadBlock":0,"eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block":0,"eip158Block":0}

22,23,24번은 0x68로 시작하고, 헤더라는 의미입니다. 블록번호와 0x6e[n]까지만 표현했을때는 블록의 해시를 값으로 가지며, 6e뒤에 블록해시까지 붙었을때는 블록 헤더가 값으로, 그뒤에 숫자가 0 x74[t]가 붙으면 값으로 블록의 채굴난이도를 나타냅니다. 현재 난이도가 821000이니까. 2바이트 정수(0x10000)이므로 블록의 난이도는 4096입니다.

이전 블로그에서 첫번째 블록의 난이도 확인바람 = 4096 맞음

인코딩된 블록 헤더값을 까보기 위해 간단한 테스트 코드를 작성합니다.
https://github.com/NAKsir-melody/eth-function-tests/blob/master/go-ethdb/go-rlp.go
Screenshot_20190111-143129_Samsung Internet.jpg

1번블록의 헤더를 파싱해보니 다음과 같은 결과가 나오는데요. 헤더구조체와 한번 맞춰볼까요?
Screenshot_20190111-143435_Termux.jpg
{be1919e148bae41b9ce2ddae6c4cf0a3c3d725f30230657ad3bcd6ed0767efe1 - 부모해시가 제네시스 블록의 해시다
1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347 - 엉클해시 (확인필요)
25634703e7df2581514d6980cf6543f455513b3d - 채굴자주소(코인베이스 맞음)
83e871d143f7086460664e33d4e6b6b00fff4120eb1fb443abed7262ae413d23 - 루트해시
56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421 - 트렌젝션해시(빈해시값)
56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421 - 영수증해시(빈해시값)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 블룸필터(아무것도 안했으므로 로그 없어서 없음)
493e0 - 난이도
1 - 블록번호
7fe0001 - 가스한도
0 - 가스 사용량
5c36a149 - 시간
d88301080d846765746888676f312e31302e31856c696e7578 - 엑스트라 (؃„gethˆgo1.10.1
linux)
d2ea5df5292054ab839f168e298c17d6c5618762bb7ab274a9d5f40a7369d63e - mix digest
05e5e0ca5343c906 - 논스
}

Screenshot_20190110-185009_Termux.jpg

잘 맞는다!

결과의 46번 라인은 0x72[r]인 영수증결과입니다. r + 블록번호 + 블록해시로 키가 구성되고, 값인 C0는 실행한게 없는 바이트 어레이라는 의미로 해석하시면 됩니다.
다음 블로깅에서는 트렌젝션을 추가하고, db가 어떻게 변화하는지, 상태는 어떻게 읽히는지 등을 확인해보려고 합니다.

이멘.

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.026
BTC 58216.02
ETH 2614.69
USDT 1.00
SBD 2.45