$30 off During Our Annual Pro Sale. View Details »

Ethereum fast sync

ころ
July 24, 2018

Ethereum fast sync

blockchain.tokyo #10 LT資料
Ethereum fast sync アルゴリズムの説明

ころ

July 24, 2018
Tweet

More Decks by ころ

Other Decks in Technology

Transcript

  1. Ethereum
    fast sync
    @koropicot
    blockchain.tokyo #10
    1

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. Ethereumの初期同期
    7

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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



    View Slide

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

    View Slide

  16. fast synchronization
    algorithm
    16

    View Slide

  17. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. 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

    View Slide

  22. 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

    View Slide

  23. 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)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. nonce検証の省略
    28

    View Slide

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

    View Slide

  30. 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つ

    View Slide

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



    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. 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

    View Slide

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

    View Slide

  37. 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

    View Slide

  38. 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

    View Slide

  39. 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

    View Slide

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

    View Slide

  41. fast sync の効果
    41

    View Slide

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

    View Slide

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

    View Slide