Ethereum에서 사용하는 immutable 자료구조
나는 하스켈을 좋아하고, immutable한 자료구조의 특징을 좋아한다. 변경했을 때 이전의 값들이 남아 있어서 쉽게 snapshot 기능을 구현할 수 있다는 점이 좋다. 값이 안바뀌기 때문에 쉽게 여러 쓰레드에 공유하기 편한것도 장점이다. 성능 느리다고 싫어하는 사람들도 있던데, 나는 성능 좀 느려도 괜찮다고 생각한다. 정 느리면 제일 느린 몇 몇 부분만 고치면 된다.
이더리움을 공부하다가 State Trie를 만났을 때 반가웠다. 이렇게 유명한 곳에서 쓰고있는 immutable 자료구조라니. 먼 타향에서 만난 고향 친구 같은 느낌이었다.
블록체인의 요구사항과 immutable한 자료구조의 특징이 잘 맞다. 블록체인은 거대한 스테이트를 꾸준히 조금씩 수정한다. 이더리움의 스테이트 트라이는 모든 유저의 이더리움 양, 스마트 컨트랙트의 변수들을 저장하고 있다. 트랜잭션을 하나 하나 실행할 때마다 이 스테이트의 값을 하나 혹은 몇개씩 수정한다.
과거의 데이터도 자주 읽는다. 어플리케이션 입장에서 가장 최신의 블록은 쉽게 바뀔 수 있기 때문에 일부러 과거의 데이터를 읽는다. 블록체인 엔진 입장에서도 과거의 데이터를 자주 읽는다. PoW에서 과거의 블록에 이어 붙인 블록을 실행하려면, 과거 블록의 데이터를 읽어야 한다.
따라서 전체 데이터는 거대한데, 실시간으로 조금씩 업데이트 되고 있고, 업데이트하기 전 정보도 쉽게 읽을 수 있는 자료구조가 필요하다. 딱 immutable한 트리를 쓰기 좋다. immutable 트리는 값을 수정할 때 새 트리를 만든다. 하지만 전체 데이터를 복사하는 건 아니고, 대부분의 데이터를 이전 트리에서 재활용한다. 값이 바뀐 노드부터 root까지의 노드만 수정하고 나머지는 그대로 사용할 수 있다.