Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ethereumのチェーン同期法 Full / Fast / Snap
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
shigeyuki azuchi
April 13, 2021
Technology
260
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ethereumのチェーン同期法 Full / Fast / Snap
GBECの解説動画の資料です。
https://goblockchain.network/2021/04/geth_sync_mode/
shigeyuki azuchi
April 13, 2021
More Decks by shigeyuki azuchi
See All by shigeyuki azuchi
FORS
azuchi
0
13
クラスターmempool
azuchi
0
32
W-OTS+
azuchi
0
36
Shorのアルゴリズム
azuchi
0
59
DahLIAS: Discrete Logarithm-Based Interactive Aggregate Signatures
azuchi
0
43
Fiat-Shamir変換と注意点
azuchi
0
230
AssumeUTXOを利用したブロックチェーンの同期
azuchi
0
55
BIP-374 離散対数の等価性証明
azuchi
0
74
BIP-353 DNS Payment Instructions
azuchi
0
91
Other Decks in Technology
See All in Technology
2年前に削除したPHPクラスが、 ある日突然決済をエラーにした
ykagano
1
730
AI時代のYAGNI:「爆速で無駄になった機能」からの学び / 20260720 Naoki Takahashi
shift_evolve
PRO
3
510
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
300
「顧客の声を聞かなければ何も始まらない」 ── 顧客の声から生まれた『AI返信補助機能』の開発プロセス / AICon2026_shikata_imai
rakus_dev
1
260
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
3
970
Aurora MySQL 8.4リリース! Rubyistが備えること / what-rubyist-should-prepare-for-aurora-mysql-8-4
fkmy
0
470
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
110k
Type-safe IaC for Dart
coborinai
0
180
データエンジニアリングとドメイン駆動設計
masuda220
PRO
14
2.4k
壊して学ぶAWS CDK: そのcdk deployで消えるもの、残るもの
k_adachi_01
1
470
凡エンジニアがこの先生きのこるためには。〜TypeScript完全に理解したい〜
alchemy1115
2
410
アップデートで何が変わった?デモで学んで使いこなすIBM Bob2.0
muehara
0
220
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
41
2.6k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
180
The untapped power of vector embeddings
frankvandijk
2
1.8k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
910
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Design in an AI World
tapps
1
260
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
Claude Code のすすめ
schroneko
67
230k
Six Lessons from altMBA
skipperchong
29
4.3k
Abbi's Birthday
coloredviolet
3
8.7k
Faster Mobile Websites
deanohume
310
32k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
180
Transcript
Ethereumのチェーン同期方法 Full / Fast / Snap
1 ブロックチェーンの同期 • Bitcoinの場合 チェーンの同期=UTXOセットの同期 • Ethereumの場合 チェーンの同期=ステートツリーの同期 Node
Node Node Node Node Local chain Local chain Local chain Local chain Local chain ネットワークに参加したばかりのノードは、 接続したピアからブロックをダウンロードし、 ローカルのブロックチェーンのコピーを構築する。 他のノードが持つ全ブロックのコピーが終わると ブロックチェーンの同期が完了する。
2 Ethereumのステート • ステートツリー 各アカウントのステートで構成されるツリー ◦ ストレージツリー 各アカウントのストレージツリー •
トランザクションツリー ブロック内のトランザクションで構成されるツリー • レシートツリー ブロック内のトランザクションレシートで構成されるツリー ↑の解説については、GBEC動画「Coparing Bitcoin and Ethereum」参照↓ https://goblockchain.network/2020/02/comparing-bitcoin-and-ethereum/ 同期のボトルネックになるのはここ
3 Merkle Patricia Trie EthereumでKey-Value形式でデータを格納し、その暗号学的なコミットメントを 提供するhex-aryツリーで、データの挿入・削除が効率的に行える
詳しいデータ構造や仕組みはGBEC動画「RLPとMerkle Patoricia Tree」参照↓ https://goblockchain.network/2020/01/rlp-merkle-patrical-tree/ Root Hash 0 1 2 ... e f 値 Hash 0 1 2 ... e f 値 Hash 0 1 2 ... e f 値 各中間ノードは最大16個の 子ノードのハッシュ値を持つ Hash 5e3(ニブル) 値 ・・・ Hash f(ニブル) 値 Hash 4c21(ニブル) 値 あるキーの値は、ルートノードから キーのデータを辿った先の リーフノードに存在。 キー「1e…f」の値
4 Full sync 最も単純なブロックチェーンの同期方法
ブロック内のトランザクションをすべて実行し、ステートツリーを更新 • 一番トラストレスにステートツリーを構築できる • ジェネシスブロックから最新ブロックまですべてのトランザクションを実行するのはヘビー ◦ 現状、性能の良いマシンで初期同期に1週間から10日 ◦ CPUリソースとディスクIOに負荷 New Block Transactions New Root EVM
5 Fast sync Geth v1.6.0から導入された高速同期モードで、ある時点のツリーを直接ダウンロードする ピボットブロックを選択 ・・ ・・
・・ ・・ IBD Node Peer GetNodeData NodeData ピボットブロックの ステートルートハッシュをトリガーに ツリーのノードデータを要求 NodeDataで対象のノードデータを送信 ルートノードから、下に すべてのノード情報をダウンロードし ステートツリーを復元 ステートツリー復元後はFull syncと同様、 トランザクションを実行してステートツリーを更新
6 Fast syncのメリットとボトルネック • Fast syncのメリット ◦ ジェネシス〜全Txを実行する必要がなくなり、同期速度が向上(約11時間) • Fast
syncのボトルネック ◦ ステートツリーの成長 ・・ ・・ ・・ 現在、mainnetのステートツリーには、約 6億7500万個の ノードが存在し、そのダウンロードがボトルネックに • 最低でも175万回の通信のラウンドトリップが発生。 → ネットワークのRTTの合計が約 150分 • ピアがGetNodeData要求に対応する際の ディスクアクセスが約2700回弱。 →構造上ランダムアクセスになり、 10ピアと並行実行しても約 108分のRead時間 • GetNodeDataによるハッシュのアップロードが約21GB、 NodeDataによ るダウンロードが2倍ちょっと。 →アップロードに56分、ダウンロードに63分 Fast syncではネットワークの帯域幅、レイテンシー、ディスクIOがボトルネックに
7 Snap sync Geth v1.10.0から利用可能になったスナップショットを利用した同期方法 SNAP protocol: https://github.com/ethereum/devp2p/blob/master/caps/snap.md
Peer ・・ ・・ ・・ Snapshot IBD Node チェーンのある時点のViewであるSnapshotを作成 GetAccountRanges AccountRange GetStorageRanges StorageRange GetByteCodes ByteCodes 取得したステートデータから ツリーを再構築 大量のツリーの中間ノードを ダウンロードせずに済み、 Fast syncのボトルネックを解消
8 Snap syncのトレードオフ • Snap syncに同期時間が短縮
• Snap syncのオーバーヘッド ◦ スナップショットの初期作成に1日〜1週間かかる (要:スナップショットを持つピアへの接続) ◦ 現状20〜25GBの追加のディスクスペースが必要 ◦ 巨大なReorgが発生するとスナップショットを再作成する必要がある ▪ Reorgに対応するためスナップショットは永続化レイヤーと インメモリの差分レイヤーで構成される。 再作成は、永続化レイヤーに影響を与えるReorgが発生した場合のみ。