Block chain download

提供: tezos-wiki
移動先: 案内検索

Bitcoin Chainのダウンロード[編集]

概要については、Satoshi Client Block Exchangeも参照してください。

ダウンローダの動作[編集]

  • ブロック受信時
    • 既に持っている場合は、無視してください
    • メインチェーンにない親を持つ場合は、それ以外の場合
      • 孤児としてストア
      • getblocks(locator(chainHead)、orphanRoot(block))
    • その他
      • ブロックを受け入れる
      • これに依存する孤立ブロックを受け入れる
  • ピアからダウンロードを開始するとき
    • getblocks(locator(chainHead)、0)

レスポンダーの行動[編集]

  • getdataを受け取ると、要求されたブロックごとに
    • 送信ブロック
    • block == hashContinue(peer)の場合**
      • send inv(chainHead)
      • set hashContinue(peer)= 0
  • getblocks(locator、hashStop)を受け取ると、
    • ロケート(ロケータ)→次へ進む、チェーン内を進む
      • ハッシュストップに達したか、チェーンの終わりを走ってしまった場合は、
      • 限界値500またはバッファ限界に達した場合
        • 現在のブロックハッシュに現在のhashContinue(ピア)を設定する
        • ブレーク
      • ブロックのためにinvを送る
  • getheadersを受け取ったとき(hashLocator、hashStop)
    • hashLocator = 0の場合、ブロック(hashStop)を返します。
    • 最大2000個のブロックヘッダを送信し、ブロック(hashLocator)からhashStop

ロケータ[編集]

ダウンローダ:作成ロケータ(ブロック)

  • 1.10用
    • block = block-> prev
    • ブロック - >ハッシュを追加する
  • ステップ= 1
  • 行う
    • block = block-> prev 'step' times
    • ブロック - >ハッシュを追加する
    • ステップ=ステップ* 2
  • genesis-> hashを追加する

レスポンダ:locate(ロケータ)

  • ロケータのForeachハッシュ
    • ハッシュがメインチェーンに存在する場合、ブロックを返す
  • そうでなければ、起源ブロックを返す

分析[編集]

観察:

  • ロケータはダウンローダチェーンの頭の近くで密であり、起点に向かうにつれて指数関数的に疎です
  • ダウンロードは協力して行います:
    • ダウンローダはダウンローダのチェーンヘッドに基づいてロケータを使用してgetblocksを送信します
    • レスポンダは、最新の共通ブロックから前方に進む最初の500ブロックの呼び出しを送信します(ロケータあたりの概算)
    • ダウンローダは、持っていないブロックのgetdataを送信します
    • レスポンダーは、ブロックとレスポンダーチェーンヘッドの無礼なinvを送信します
    • ダウンローダはブロックをチェーンに組み込み、新しいチェーンヘッドを持つようになりました
    • ダウンローダは、新しいチェーンヘッドに基づいて新しいロケータを使用して無益なinvに応答して別のgetblocksを送信します

いくつかのケースがあります。 dChainHeadはダウンローダチェーンヘッド、rChainHeadはレスポンダチェーンヘッドです。

単一のブロックケース[編集]

  • レスポンダは、新しく解決されたブロックのinvを送信します
  • ダウンローダーはgetdataを送信します
  • Responderがブロックを送信する

小さなキャッチアップケース[編集]

  • ダウンローダは、getblocks(locator(dChainHead)、0)
  • レスポンダはdChainHeadからrChainHeadにブロックのinvを送信します
  • Downloaderは各invに対してgetdataを送信します
  • レスポンダは各getdataのブロックを送信します

大きなキャッチアップケース[編集]

  • ダウンローダは、getblocks(locator(dChainHead)、0)
  • レスポンダはdChainHeadからdChainHead + 500までブロックのinvsを送信します
  • (getdata /レスポンダによって送信されたブロック/ダウンローダによってチェーンに追加されたブロック)
  • 最後のgetdataがinv(rChainHead)をトリガーし、
  • ダウンローダはgetdata(rChainHead)
  • Responderがブロックを送信する
  • Downloaderは孤児のリストをブロックする
  • Downloaderがgetblocks(locator(dChainHead)、rChainHead)を送信します。
  • goto step 2

サイドチェーンケース[編集]

  • ダウンローダは、getblocks(locator(dChainHead)、0)
  • レスポンダにはdChainHeadが一番良いチェーンではありません。レスポンダは、2つのチェーンに共通のブロックが見つかるまで、ロケータを反復処理します。
  • レスポンダは、commonBlockからrChainHeadにブロックのinvを送信します
  • ダウンローダは、持っていないブロックを追加して再編成する

これが機能するためには、invはネットワークバッファに収まる必要があります。

大きなサイドチェーンケース[編集]

より多くのinvsネットワークバッファに適合します。

側鎖にネットワークバッファのサイズよりもブロックがある場合、これは機能していないようです。 getblocks(locator(dChainHead)、rChainHead)は、Downloaderがチェーンを切り替えるのに十分なブロックを返しません。ダウンローダがチェーンを切り替えない場合、同じgetblocksメッセージを再度送信します。


Category:技術 Category:Vocabulary