이더리움의 state 패키지

in #ethereum6 years ago (edited)

오늘은 state패키지를 알아보고자 합니다.
state 패키지는 코어 패키지의 내부에 구현이 되어있는데, 주석을 읽어 보면 "이더리움 상태 트라이의 최상위 캐싱 레이어" 라고 되어있습니다. (나름 코어!)
무슨말인지 모르겠으니 하나하나 살펴보도록 하겠습니다.

먼저 상태(state)에 대해 간략하게 짚고 넘어가 보겠습니다.
"이더리움은 상태머신(StateMachine)이다"라는 말을 많이 들어보셨을텐데요.
아래 그림이 상태란 무엇인가를 잘 보여주는것 같습니다.

(출처: https://github.com/ethereum/wiki/wiki/White-Paper)

블록체인 체인상에 4개의 계정이 있고, 계정 4개의 정보를 통틀어 STATE라고 표현했네요 그리고 트렌젝션이 일어나서 첫번째 계정이 두번째 계정으로 무언가를 보냈습니다.(10이더와 '찰리'메시지) 그러면 각 어카운트의 정보가 갱신될 것이고 이 변환된 계정들을 모두 포함하는 체인의 현재 모습을 STATE' 이라고 표현했습니다.

즉 상태(state)라는것은, 블록체인상의 모든 계정의 정보를 포함하는 순간의 스냅샷 정도라고 보면되고
상태를 처리한다는 것은 트렌젝션의 적용을 통해 어카운트를 변화시키고 또다른 상태를 생성해 내는것이라고 이해해도 될것 같습니다.

이러한 상태 관리/처리를 담당하는 것이 state 패키지 입니다. 사실 상태처리 뿐만아니라 , 처리를 더 잘하기 위해 상태DB/상태Trie/상태캐시 를 관리하는 여러가지 방법을 정의해 둔 패키지입니다.

블록체인의 상태는 아까처럼 어카운트들의 변화에 따라 결정됩니다. 어카운트의 변화 상태를 이 패키지에서는 StateObject라고 표현하는데요, 아까 트렌젝션을 적용하면 변경되는 어카운트들의 변경 상태를 이곳에 저장해둡니다.
전에 Account package를 다룰때 내 잔고는 어디로 갔을까? 라는 질문을 가질수 있다고 말씀드렸는데, 그 잔고가 이렇게 계정의 상태정보에 저장되는 것입니다. 이러한 각 계정의 상태 오브젝트를 트라이로 관리하면서, 상태 DB에 rlp 인코딩된 형태로 저장하게 되는거죠. 그림으로 보면 다음과 같아집니다.

다들 이미 아시겠지만 상태트라이는 블록체인 전체에 걸쳐 1개이죠?
상태 DB에 stateObject의 map이 보이시나요 저 하나의 맵이 모든 이더리움 계정의 정보를 담고 있고, 트라이 형태로 관리되는 것입니다.

그리고 그림상 오른쪽에 account 구조체가 또다시 나타났는데, Account패키지의 account구조체는 주소와, 물리적 위치만 나타내고 있고요 State패키지의 account구조체는 계정의 상태를 나타내는 논스, 잔고, 루트해시, 코드해시 정보를 가지고 있습니다. state패키지의 account구조체의 루트는 계정의 저장소 트라이입니다. 계약 계정일 경우 저장해야할 값들이 트라이 형태로 저장되는 거죠(계약에 관련된 계정들의 상태를 따로 가지고 있다던지)
아무튼, 이런 구조로 상태를 관리합니다.

상태의 처리는 결국 트렌젝션의 처리가 될텐데요, 예전에 insert체인에서 transaction을 처리한다고 말씀드렸던 적이 있습니다. (기억이 안나시는 분들은 https://steemit.com/ethereum/@sigmoid/1 를 참조해주세요 )

그당시에는 잔고의 처리가 궁금했어서 그림을 저렇게 그렸던건데, 이제 state패키지도 알게 되었으니 그림을 업데이트 해야합니다. 잔고도 업데이트하고, 상태트라이도 업데이트하고 상태 DB에 저장하는 형태로요(빨간색)

상태 DB와 상태 Trie 부분은 이정도로 마무리합니다.
앞서서 이야기 했던 static패키지의 세가지 기능중 마지막 한가지가 캐시부분인데요.
물리적 DB에 바로 상태를 업데이트 하는건 비싸기도하고, 롤백하기도 어렵기 때문에 우선 캐시(메모리죠) 에서 작업을 합니다. 변경된 상태들을 캐시에 보관하고있다가 최종적으로 commit이라는 함수를 통해 물리적인 level DB에 쓰고요.
캐시 운용 관련해서 세대값을 통한 관리방법을 정의하고 있는데 그렇게 자세하게 알필요는 없을것 같고요.

이제서야 "상태 트라이의 (최상위)캐싱" 이라는 말이 이해가 가네요
글이 좀 길어졌는데, 주저리 주저리 한 글을 여기까지 읽어주셨다면
오히려 제가 감사드리겠습니다^^

여러분의 up vote 가 큰 도움이 됩니다.
후원: 0x62467Ca1b449c854c4720395Dd9a7c6Ed5df47B7(ethereum)
account.png

Sort:  

올려주신 연재 큰 도움이 됩니다. :)
한동안 저도 geth 코드 보다가 회사 프로젝트가 바빠져서 못봤는데.. 이제 다시 조금씩 시간을 낼 수 있을 것 같네요

공유해 주신 내용들 잘 보겠습니다.

Coin Marketplace

STEEM 0.25
TRX 0.11
JST 0.032
BTC 62062.59
ETH 3002.04
USDT 1.00
SBD 3.77