Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ethereum fast sync
Search
ころ
July 24, 2018
Technology
3
5.1k
Ethereum fast sync
blockchain.tokyo #10 LT資料
Ethereum fast sync アルゴリズムの説明
ころ
July 24, 2018
Tweet
Share
More Decks by ころ
See All by ころ
Enjoy Building a Blockchain
koropicot
1
5.5k
(*・◞◟・*)
koropicot
0
320
Other Decks in Technology
See All in Technology
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.3k
「Managed Instances」と「durable functions」で広がるAWS Lambdaのユースケース
lamaglama39
0
300
年間40件以上の登壇を続けて見えた「本当の発信力」/ 20251213 Masaki Okuda
shift_evolve
PRO
1
100
非CUDAの悲哀 〜Claude Code と挑んだ image to 3D “Hunyuan3D”を EVO-X2(Ryzen AI Max+395)で動作させるチャレンジ〜
hawkymisc
1
170
ML PM Talk #1 - ML PMの分類に関する考察
lycorptech_jp
PRO
1
790
生成AI活用の型ハンズオン〜顧客課題起点で設計する7つのステップ
yushin_n
0
120
Reinforcement Fine-tuning 基礎〜実践まで
ch6noota
0
170
eBPFとwaruiBPF
sat
PRO
4
2.5k
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
340
[デモです] NotebookLM で作ったスライドの例
kongmingstrap
0
130
形式手法特論:CEGAR を用いたモデル検査の状態空間削減 #kernelvm / Kernel VM Study Hokuriku Part 8
ytaka23
2
450
Kubernetes Multi-tenancy: Principles and Practices for Large Scale Internal Platforms
hhiroshell
0
120
Featured
See All Featured
Thoughts on Productivity
jonyablonski
73
5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
70k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Balancing Empowerment & Direction
lara
5
790
Site-Speed That Sticks
csswizardry
13
990
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
A better future with KSS
kneath
240
18k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
Designing for Performance
lara
610
69k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Transcript
Ethereum fast sync @koropicot blockchain.tokyo #10 1
自己紹介 ころ @koropicot Mobile Factory, Inc. ブロックチェーン関連のなにかを やっている (IR以上のことは言えない) 2
ブロックチェーンの初期同期 3
ブロックチェーンの初期同期 4 Block 1 Block 2 Block N-1 Block N
Block 3 Block 1 Remote Node New Node
ブロックチェーンの初期同期 5 Block 1 Block 2 Block N-1 Block N
Block 3 Block 1 Block 2 Block N-1 Block N Block 3 Remote Node New Node
ブロックチェーンの初期同期 6 Block 1 Block 2 Block N-1 Block N
Block 3 Block 1 Block 2 Block N-1 Block N Block 3 ✔ Remote Node New Node
Ethereumの初期同期 7
Ethereum Block 8 Tx Root Prev Hash Nonce etc. Receipt
Root State Root Header Body Transaction 1 Transaction N ... ※ Uncleは省略 Transaction 2
Merkle Root 9 Transactions Tx Root Transaction Receipts Receipt Root
World State State Root Body内の トランザクションか ら構築可能 一つ前の状態から トランザクションを 実行することで構築可能
素朴な同期 10 Block 1 Block N-127 Block N Block N-128
S R S R Block 1 R R Remote Node New Node
素朴な同期 11 Block 1 Block N-127 Block N Block N-128
S R S R Block 1 R R Block N-127 Block N Block N-128 Remote Node New Node
素朴な同期 12 Block 1 Block N-127 Block N Block N-128
S R S R Block 1 R R Block N-127 Block N Block N-128 ✔ ✔ ✔ ✔ Remote Node New Node
素朴な同期 13 Block 1 Block N-127 Block N Block N-128
S R S R Block 1 R R Block N-127 Block N Block N-128 R ↻ S Remote Node New Node
素朴な同期 14 Remote Node Block 1 Block N-127 Block N
Block N-128 New Node S R S R Block 1 R R Block N-127 Block N Block N-128 S R S R R R ↻ S S ↻ ↻ ↻
問題 • ブロックの取得が遅い – 1ノードからひたすらダウンロード • ブロックのnonceの検証が遅い – ASIC耐性をもたせたEthashが重い •
トランザクションの再生が遅い – ブロックが伸びると線形に時間がかかる 15
fast synchronization algorithm 16
fast sync algorithm • 状態の同期とnonce検証の高速化 – pull-req: https://github.com/ethereum/go-ethereum/pull/1889 • gethの初期同期のデフォルトモード
• eth/63プロトコル を使って同期 – https://github.com/ethereum/wiki/wiki/Ethereum-Wire-Protocol#fast-sy nchronization-pv63 • 以下ではそれ以前からの手法も含めて説明 17
高速に同期するために • 並列なブロックダウンロード – 複数のノードから並列に取得 • nonce検証の省略 – いかに安全性を確保しつつ省くか •
トランザクション再生の省略 – いかに再生をせずに状態を同期するか 18
並列なブロックダウンロード 19
1 1 2 2 3 3 N-M N-M N-M+1 N-M+1
N N 20 1 Node A Node B New Node 1 2 2 3 3 N-M N-M N-M+1 N-M+1 N N 1 1 並列なブロックダウンロード
1 1 2 2 3 3 N-M N-M N-M+1 N-M+1
N N 21 1 Node A Node B New Node 1 2 2 3 3 N-M N-M N-M+1 N-M+1 N N 1 1 N-M N 並列なブロックダウンロード fetch header N-M fetch header N
22 Node A Node B New Node 並列なブロックダウンロード skeleton 1
1 2 2 3 3 N-M N-M N-M+1 N-M+1 N N 1 1 2 2 3 3 N-M N-M N-M+1 N-M+1 N N 1 1 N-M N
1 1 2 2 3 3 N-M N-M N-M+1 N-M+1
N N 23 1 Node A Node B New Node 1 2 2 3 3 N-M N-M N-M+1 N-M+1 N N 1 1 2 3 N-M N-M+1 N 並列なブロックダウンロード fetch header (1, M) fetch header (N-M, N)
1 1 2 2 3 3 N-M N-M N-M+1 N-M+1
N N 24 1 Node A Node B New Node 1 2 2 3 3 N-M N-M N-M+1 N-M+1 N N 1 1 2 3 N-M N-M+1 N 並列なブロックダウンロード
1 1 2 2 3 3 N-M N-M N-M+1 N-M+1
N N 25 1 Node A Node B New Node 1 2 2 3 3 N-M N-M N-M+1 N-M+1 N N 1 1 2 3 3 3 N-M N-M N-M+1 N-M+1 N N fetch body 2 fetch body 3 fetch body N-M fetch body N-M+1 fetch body N 並列なブロックダウンロード
1 1 2 2 3 3 N-M N-M N-M+1 N-M+1
N N 26 1 Node A Node B New Node 1 2 2 3 3 N-M N-M N-M+1 N-M+1 N N 1 1 2 3 3 3 N-M N-M N-M+1 N-M+1 N N 並列なブロックダウンロード
27 並列なブロックダウンロード • ヘッダとボディを分けて並列に取得 • ヘッダも先に一定間隔で取得してから間を埋め ることで並列化 – まとめて取得する上限の192ブロック毎 –
間を埋めれなかったときは取得元のpeerを dropしてやり直し
nonce検証の省略 28
29 New Node nonce検証の省略 1 K K+1 2K 2K+1 3K
30 New Node nonce検証の省略 1 Rand [1,K] K K+1 2K
2K+1 3K Rand [K+1, 2K] Rand [2K+1, 3K] Kブロックの範囲からランダムに1つ
31 New Node nonce検証の省略 1 Rand [1,K] K K+1 2K
2K+1 3K Rand [K+1, 2K] Rand [2K+1, 3K] ✔ ✔ ✔
32 nonce検証の省略 • Kブロックの範囲からランダムに選んだ1ヘッダ を検証する • 十分な長さNのチェーンですべて検証が通れば 確率的に十分な安全性を確保できる – K=100,
N=2048 が選択されている – 検証に失敗したらNブロックを捨てる
トランザクション再生の省略 33
34 トランザクション再生の省略 Remote Node 1 Pivot +1 N Pivot New
Node S R S R 1 R R Pivot +1 N Pivot S
35 トランザクション再生の省略 Remote Node 1 Pivot +1 N Pivot New
Node S R S R 1 R R Pivot +1 N Pivot R R S fetch tx receipt fetch tx receipt
36 トランザクション再生の省略 Remote Node 1 Pivot +1 N Pivot New
Node S R S R 1 R R Pivot +1 N Pivot R R S
37 トランザクション再生の省略 Remote Node 1 Pivot +1 N Pivot S
R S R 1 R R Pivot +1 N Pivot R R S sync state trie S ※ 全アカウントの全状態を同期 New Node
38 トランザクション再生の省略 Remote Node 1 Pivot +1 N Pivot S
R S R 1 R R Pivot +1 N Pivot R R S S New Node
39 トランザクション再生の省略 Remote Node 1 Pivot +1 N Pivot New
Node S R S R 1 R R Pivot +1 N Pivot S R S R R R S ↻ ↻ S
40 トランザクション再生の省略 • pivotまでは再生せずに結果(receipt)のみ取得 • pivotに達したら全状態を同期 • 以降は通常通り再生して状態・結果を構築 • Sybil攻撃で状態自体を不正できてしまう
– 普通は二重支払いが限度 – 安全のため初回同期のみに限定 • これでOKな理由はよくわからなかった
fast sync の効果 41
42 fast sync の効果 • pull-req (2015 Oct) に示されている値 –
今の実装だと多少変わるかも – 時間 8分の1, ストレージ 5分の1 くらいの効率化 Dataset: Olympic, 837869 blocks, 10.2M states
43 まとめ • ブロックチェーンの初期同期は大変 – フルノードは全部を同期する必要がある – サイズは増える一方 • Ethereum
(geth) は様々な手法によって 安全性を確保しつつ高速化を実現している 間違いなどあったら @koropicot まで (⁎・‸・⁎)