ビットコインコアはどのようにしてそれが最長のチェーン上にあることを知っていますか?

Aug 23 2020

クライアントを実装しようとすると、フォークを使用しているかどうかを判断するための最も効率的なアプローチは何でしょうか。

ランダムにピアを選択し、ヘッダーファーストアプローチを使用してIBDを通過するとします。チェーンの先端に達した後、これが最長のチェーンであるかどうかを確認する最も効率的な方法は何ですか?

私はあなたがあなたの仲間に彼らの最良のヘッダーが何であるかを尋ねなければならないと推測し、そして応答といくつかのヒューリスティックに基づいて、あなたが最長のチェーンにいるかどうかを決定します。これは単に経由で行われgetheadersますか?ヒューリスティックとは何ですか?そして、あなたがフォークに乗っていることがわかったら、あなたはどうしますか?

ビットコインまたはbtcdの関連コードへのポインタもいただければ幸いです。

ありがとう

編集:これは明白ではない場合、私はそれはそれは(それができない)最も長いチェーンであることをcertaintiyで知ることができるのではなく、何がベストエフォート型であるかどうかを尋ねていないよ試みで最も長いチェーンに残るためには、常時。

回答

5 pinhead Aug 23 2020 at 22:09

まず第一に、最長のチェーンを見つけることは目標ではありませんが、最も蓄積されたプルーフオブワークを備えたチェーンです[ 1 ]

現在、最も多くの作業チェーンを見つけることが、フルノードの全体的な目標です。その存在の全体的な意味は、最も多くの作業チェーンを見つけることです。したがって、コードのネットワーキングおよび検証モジュールからほぼすべての行を選択して、それらの用語で説明できます。

もう少し具体的に言うと:

  • フルノードは少なくとも8つのピアに接続します。最近のバージョンは、「ブロックのみ」モードで2つの追加ピアに接続します。ピアは、(IPサブネットまたはASマップによって)可能な限り多様になるように選択されます。特定のタイムアウト(40分だと思います)内に新しいブロックが追加されなかった場合、ビットコインコアはもう1つの発信ピアを追加します。
  • フルノードはgetheaders各ピアにリクエストを送信し、各ピアが知っている最良のブロックを追跡します。
  • ピアに、現在のヒントよりも累積作業量が多い有効なブロックヘッダーがある場合は、対応するブロックを要求します。それらのブロックが有効な場合、それが新しいチェーンチップになります。その状態に到達するために、再編成が必要な場合と必要でない場合があります。

ヘッダーファースト同期がどのように機能するかを概念的に理解している場合は、関数FindNextBlocksToDownload()が次のステップです。これは、ノードがピアに現在のチェーンチップよりも多くの作業を伴うヘッダーがあるかどうかを判断し、そのピアにそれらのブロックを要求する場所です。

したがって、私たちにできることは、多くのピアに接続し、少なくとも1人が最も作業の多いチェーンについて知っていると想定することだけです。これにより、ピアの検出と接続先のピアの選択が非常に重要になります。