$30 off During Our Annual Pro Sale. View Details »
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
乗りこなせAI駆動開発の波
eltociear
1
1.1k
AIと二人三脚で育てた、個人開発アプリグロース術
zozotech
PRO
1
720
AI-DLCを現場にインストールしてみた:プロトタイプ開発で分かったこと・やめたこと
recruitengineers
PRO
2
100
SSO方式とJumpアカウント方式の比較と設計方針
yuobayashi
7
620
文字列の並び順 / Unicode Collation
tmtms
3
570
[JAWS-UG 横浜支部 #91]DevOps Agent vs CloudWatch Investigations -比較と実践-
sh_fk2
2
250
regrowth_tokyo_2025_securityagent
hiashisan
0
230
グレートファイアウォールを自宅に建てよう
ctes091x
0
150
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
360
Databricks向けJupyter Kernelでデータサイエンティストの開発環境をAI-Readyにする / Data+AI World Tour Tokyo After Party
genda
1
110
Challenging Hardware Contests with Zephyr and Lessons Learned
iotengineer22
0
190
AWSセキュリティアップデートとAWSを育てる話
cmusudakeisuke
0
270
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
RailsConf 2023
tenderlove
30
1.3k
Producing Creativity
orderedlist
PRO
348
40k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
70k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Practical Orchestrator
shlominoach
190
11k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
390
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
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 まで (⁎・‸・⁎)