Slide 1

Slide 1 text

Ethereum fast sync @koropicot blockchain.tokyo #10 1

Slide 2

Slide 2 text

自己紹介 ころ @koropicot Mobile Factory, Inc. ブロックチェーン関連のなにかを やっている (IR以上のことは言えない) 2

Slide 3

Slide 3 text

ブロックチェーンの初期同期 3

Slide 4

Slide 4 text

ブロックチェーンの初期同期 4 Block 1 Block 2 Block N-1 Block N Block 3 Block 1 Remote Node New Node

Slide 5

Slide 5 text

ブロックチェーンの初期同期 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

Slide 6

Slide 6 text

ブロックチェーンの初期同期 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

Slide 7

Slide 7 text

Ethereumの初期同期 7

Slide 8

Slide 8 text

Ethereum Block 8 Tx Root Prev Hash Nonce etc. Receipt Root State Root Header Body Transaction 1 Transaction N ... ※ Uncleは省略 Transaction 2

Slide 9

Slide 9 text

Merkle Root 9 Transactions Tx Root Transaction Receipts Receipt Root World State State Root Body内の トランザクションか ら構築可能 一つ前の状態から トランザクションを 実行することで構築可能

Slide 10

Slide 10 text

素朴な同期 10 Block 1 Block N-127 Block N Block N-128 S R S R Block 1 R R Remote Node New Node

Slide 11

Slide 11 text

素朴な同期 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

Slide 12

Slide 12 text

素朴な同期 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

Slide 13

Slide 13 text

素朴な同期 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

Slide 14

Slide 14 text

素朴な同期 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 ↻ ↻ ↻

Slide 15

Slide 15 text

問題 • ブロックの取得が遅い – 1ノードからひたすらダウンロード • ブロックのnonceの検証が遅い – ASIC耐性をもたせたEthashが重い • トランザクションの再生が遅い – ブロックが伸びると線形に時間がかかる 15

Slide 16

Slide 16 text

fast synchronization algorithm 16

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

高速に同期するために • 並列なブロックダウンロード – 複数のノードから並列に取得 • nonce検証の省略 – いかに安全性を確保しつつ省くか • トランザクション再生の省略 – いかに再生をせずに状態を同期するか 18

Slide 19

Slide 19 text

並列なブロックダウンロード 19

Slide 20

Slide 20 text

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 並列なブロックダウンロード

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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)

Slide 24

Slide 24 text

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 並列なブロックダウンロード

Slide 25

Slide 25 text

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 並列なブロックダウンロード

Slide 26

Slide 26 text

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 並列なブロックダウンロード

Slide 27

Slide 27 text

27 並列なブロックダウンロード • ヘッダとボディを分けて並列に取得 • ヘッダも先に一定間隔で取得してから間を埋め ることで並列化 – まとめて取得する上限の192ブロック毎 – 間を埋めれなかったときは取得元のpeerを dropしてやり直し

Slide 28

Slide 28 text

nonce検証の省略 28

Slide 29

Slide 29 text

29 New Node nonce検証の省略 1 K K+1 2K 2K+1 3K

Slide 30

Slide 30 text

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つ

Slide 31

Slide 31 text

31 New Node nonce検証の省略 1 Rand [1,K] K K+1 2K 2K+1 3K Rand [K+1, 2K] Rand [2K+1, 3K] ✔ ✔ ✔

Slide 32

Slide 32 text

32 nonce検証の省略 • Kブロックの範囲からランダムに選んだ1ヘッダ を検証する • 十分な長さNのチェーンですべて検証が通れば 確率的に十分な安全性を確保できる – K=100, N=2048 が選択されている – 検証に失敗したらNブロックを捨てる

Slide 33

Slide 33 text

トランザクション再生の省略 33

Slide 34

Slide 34 text

34 トランザクション再生の省略 Remote Node 1 Pivot +1 N Pivot New Node S R S R 1 R R Pivot +1 N Pivot S

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

36 トランザクション再生の省略 Remote Node 1 Pivot +1 N Pivot New Node S R S R 1 R R Pivot +1 N Pivot R R S

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

40 トランザクション再生の省略 • pivotまでは再生せずに結果(receipt)のみ取得 • pivotに達したら全状態を同期 • 以降は通常通り再生して状態・結果を構築 • Sybil攻撃で状態自体を不正できてしまう – 普通は二重支払いが限度 – 安全のため初回同期のみに限定 • これでOKな理由はよくわからなかった

Slide 41

Slide 41 text

fast sync の効果 41

Slide 42

Slide 42 text

42 fast sync の効果 • pull-req (2015 Oct) に示されている値 – 今の実装だと多少変わるかも – 時間 8分の1, ストレージ 5分の1 くらいの効率化 Dataset: Olympic, 837869 blocks, 10.2M states

Slide 43

Slide 43 text

43 まとめ • ブロックチェーンの初期同期は大変 – フルノードは全部を同期する必要がある – サイズは増える一方 • Ethereum (geth) は様々な手法によって 安全性を確保しつつ高速化を実現している 間違いなどあったら @koropicot まで (⁎・‸・⁎)