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 fast sync
Search
ころ
July 24, 2018
Technology
3
4.7k
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.3k
(*・◞◟・*)
koropicot
0
300
Other Decks in Technology
See All in Technology
手軽に始める? おうちサーバーのすゝめ
nyagasan
0
180
Eventual Detection Engineering
ken5scal
0
390
デジタル化・DX推進あるある
y150saya
0
220
リクルート新人研修2024 テキスト生成AI活用
recruitengineers
PRO
10
420
Autonomous Database Cloud 技術詳細 / adb-s_technical_detail_jp
oracle4engineer
PRO
15
39k
HolidayJp.jl を作りました
mrkn
0
110
Namespace, Now and Then
tagomoris
0
170
中規模・ミドルTier開発組織におけるDevRelの戦略と実行と成果 - DevRel Guild Conference Mini -
leveragestech
2
260
GraphQLとスキーマファーストで切り開く ライドシェアの未来
ku0522a
0
490
データウェアハウス製品のSnowflakeでPythonが動くって知ってました?
foursue
1
150
Oracle Database 23ai 新機能 #3 Oracle Globally Distributed Database(GDD)
oracle4engineer
PRO
1
160
ことばをそろえる / Bridging the Terminology Gap
amaotone
5
1k
Featured
See All Featured
Optimizing for Happiness
mojombo
375
69k
The Power of CSS Pseudo Elements
geoffreycrofte
71
5.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
248
20k
Build your cross-platform service in a week with App Engine
jlugia
228
18k
Design by the Numbers
sachag
277
19k
A Modern Web Designer's Workflow
chriscoyier
690
190k
Rebuilding a faster, lazier Slack
samanthasiow
78
8.5k
How GitHub (no longer) Works
holman
309
140k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
Building Adaptive Systems
keathley
36
2.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
46
48k
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 まで (⁎・‸・⁎)