Block chain download
目次
Bitcoin Chainのダウンロード
概要については、Satoshi Client Block Exchangeも参照してください。
ダウンローダの動作
- inv(インベントリメッセージ)を受信すると、
- 各ブロック
- orphanとして既に持っている場合は、 getblocks(locator(chainHead)、 orphanRoot
- まだ持っていない場合
- send getdata(ブロック)
- 既に持っていてこれがメッセージの最後のブロックである場合(注:これはピアgetdataの特定の動作を引き起こします)
- send getdata(ブロック)
- 各ブロック
- ブロック受信時
- 既に持っている場合は、無視してください
- メインチェーンにない親を持つ場合は、それ以外の場合
- 孤児としてストア
- 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
|