July 21, 2021
해당 글은 이더리움에 대한 기본적 이해를 요구합니다.
ethereum.org에서는 노드를 아래와 같이 설명합니다.
노드란 "실행 중"인 '클라이언트 소프트웨어'
클라이언트는 각 블록의 모든 트랜잭션을 확인하여,
네트워크와 데이터를 정확하게 유지하는 Ethereum의 구현체
먼저 노드(실행중인 클라이언트)는 크게 3가지 타입으로 구분됩니다.
다시말해, Archive node와 Full Node의 차이점은 과거 State 저장 여부입니다. 아래 사진을 통해 차이점을 명확히 확인 가능합니다.
이더리움 State에 대해서 궁금하다면
아래는 실제 이더리움 클라이언트의 구현체 목록입니다.
Sync strategies, State Pruning라는 새로운 단어가 등장합니다. 이 단어들을 Geth의 동기화 과정을 통해 알아보겠습니다.
--syncmode # ("fast", "full", "snap" or "light") (default: snap)
Geth Command Line Option Geth의 Sync Strategies는 Fast
와 Full
로 나눠지는 것을 알 수 있습니다. (그외에도 Snap, Light 동기화 전략이 있습니다)
Full Sync Mode는 모든 블록 데이터(headers, transactions, receipts)를 다운받아 모든 트랜잭션을 재실행하며, 검증하고 직접 모든 블럭의 State를 만들어 나가는 전략입니다. 하지만 제네시스 블록부터 모든 트랜잭션을 재실행해나가는 것은 엄청나게 오랜 시간이 소요됩니다. (현재 매우 강력한 시스템에 7~8일이 소요됩니다)
Fast Sync Mode는 Full Sync처럼 모든 블록 데이터(headers, transactions, receipts)를 다운받습니다. 하지만 트랜잭션을 직접 실행하지 않고 PoW 검증(블록 헤더 검증)을 할 뿐입니다.
트랜잭션을 직접 실행하지 않으면 어떻게 State를 만들까요? 답은 간단합니다.
최신 State(Head - 64, pivot point
)를 다른 노드에게 직접 다운로드 받습니다 (동기화 과정을, 다른 노드에 거의 의존하지 않는 Full Sync에 비해 불안전합니다)
한번 동기화에 성공하면 Full Sync Mode로 전환됩니다. (즉 동기화 성공 후, 트랜잭션을 직접 실행하며 State를 만들어 나갑니다) 즉 Sync Mode란 ‘실행’에 관한 전략이 아닙니다. 말 그대로 ‘동기화’에 대한 전략입니다 (어떻게 안정적으로, 빠르게 이더리움 네트워크에 참여할 것인지 동기화 전략을 선택할 수 있습니다)
Imported state entries [...]
로그를 통해 확인 가능합니다.--gcmode # garbage collection mode
# ("full", "archive") (default: "full")
Pruning Mode는 Pruning을 하는 전략이고, Archive Mode는 반대로 Pruning을 하지 않는 전략입니다.
Pruning이란 쉽게 말해 이더리움 State Trie의 Garbage collection
입니다. (상태 정리)
예를들어 특정 Account의 “1년전” Balance가 필요한 경우가 있을까요? 대부분 그렇지 않습니다.
이렇게 필요가 없어진 State Trie를 정리하는 작업이 Pruning입니다. (Trade Off)
사실 Pruning을 진행했어도 Full Sync Mode라면, 블록 데이터를 통해 과거 상태를 다시 만들 수 있습니다. 다만 매우 힘든 작업이 될 것입니다 (아래에서 설명합니다)
Pruning이 어려운 작업인 이유
왜
—-gcmode=full
이 Pruning을 진행하는 옵션일까요? 개인적으로 생각하기엔 full은 모든걸 저장할 것 같은 이름인데 말이죠… GC를 Full로 돌린다는 의미일라나요…
앞서 말했듯 노드(실행중인 클라이언트)는 크게 3가지 타입으로 구분된다고 했습니다. (Full Node, Light Node, Archive Node) 이제 우리는 어떤 옵션으로 Geth를 실행시켜야 Full Node로, 또는 Archive Node로 만들 수 있는지 알게 되었습니다.
syncmode=full gcmode=full
으로 genesis 블록 부터 실행하고 8만번째 블록에 도달하면 노드를 멈추고 gcmode=archive
로 변경하여 실행하면 됩니다.gcmode=full
로 실행했지만 archive Node로 전환하고 싶습니다. 즉, 전체 State를 다운로드 하고 싶습니다gcmode=archive
로 실행했어야 합니다. (gcmode default value는 “full”)syncmode=full, gcmode=full
로 실행했다면, Earlier Point부터 다시 계산하여 필요한 State를 만들 수 있습니다.gcmode=archive
를 통해 다시 실행했다면, 그 이후의 상태 데이터는 메모리 상에서 제거되는게 아니라, disk에 flush()됩니다NoPruning
옵션과 gcmode
옵션의 차이점이 무엇일까요?NoPruning
이라는 이름이 너무 헷갈립니다.모든 내용은 요약되었기 때문에, 아래 링크를 통해 자세한 내용을 읽어보는 것을 추천합니다.