gethのデータ記録モードについて

f:id:simplex-blog:20190130151637j:plain

gethのデータ記録モードについて

Go言語で実装されたEthereumのブロックチェーンクライアントであるGo-Ethereum(geth)において、起動オプションによるブロックデータの持ち方の変化について調査してみました。

ブロックデータの記録モード

3つのモードがありそれぞれ同期するデータ量が異なる。

起動オプション[--syncmode]
- full
- fast [default]
- light

Full モード [--syncmode full]

すべてのデータを同期・検証し保持する

ブロックデータの構造
[FullBlock]
 - BlockHaeder
 - BlockBody
   - Transactions[]
   - Uncles[]
 - Receipt
 - State
  • データサイズ 約667.10GB [2018/08/01]

Fast モード [--syncmode fast]

PivotBlockまでは、Blockの検証をせずStateも保持しない

ブロックデータの構造
[FastBlock]
 - BlockHaeder
 - BlockBody
   - Transactions[]
   - Uncles[]
 - Receipt
  • PivotBlock以降はFullモードと同様
  • PivotBlockは [head - 64] の位置
  • すでにFullBlockがある場合はFullモードとして起動する
  • データサイズ 約124.95GB [2019/01/23]

Light モード [--syncmode light]

基準Block以降のBlock Headerのみ保持する

ブロックデータの構造
- BlockHeader
  • 基準Block = (sectionIdx + 1) * 32768 - 1
  • sectionIdxはgethのVersionにより異なる
  • LightEthereum peerとして、LightServを有効にしたFullモードのPeerにのみ接続する

Stateの記録モード

2つのモードがあり保存するデータ量が異なる。

起動オプション[--gcmode]
- full [default]
- archive

Full モード [--gcmode full]

  • Stateをメモリ内にキャッシュする
  • [head - 128]のStateを60minごとに保存する
  • geth終了時、[head], [head - 1], [head - 127]のStateを保存する

Archive モード [--gcmode archive]

  • 毎Block Stateを保存する