gethのデータ記録モードについて
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を保存する