ビットコインコアはどのようにしてそれが最長のチェーン上にあることを知っていますか?
クライアントを実装しようとすると、フォークを使用しているかどうかを判断するための最も効率的なアプローチは何でしょうか。
ランダムにピアを選択し、ヘッダーファーストアプローチを使用してIBDを通過するとします。チェーンの先端に達した後、これが最長のチェーンであるかどうかを確認する最も効率的な方法は何ですか?
私はあなたがあなたの仲間に彼らの最良のヘッダーが何であるかを尋ねなければならないと推測し、そして応答といくつかのヒューリスティックに基づいて、あなたが最長のチェーンにいるかどうかを決定します。これは単に経由で行われgetheaders
ますか?ヒューリスティックとは何ですか?そして、あなたがフォークに乗っていることがわかったら、あなたはどうしますか?
ビットコインまたはbtcdの関連コードへのポインタもいただければ幸いです。
ありがとう
編集:これは明白ではない場合、私はそれはそれは(それができない)最も長いチェーンであることをcertaintiyで知ることができるのではなく、何がベストエフォート型であるかどうかを尋ねていないよ試みで最も長いチェーンに残るためには、常時。
回答
まず第一に、最長のチェーンを見つけることは目標ではありませんが、最も蓄積されたプルーフオブワークを備えたチェーンです[ 1 ]
現在、最も多くの作業チェーンを見つけることが、フルノードの全体的な目標です。その存在の全体的な意味は、最も多くの作業チェーンを見つけることです。したがって、コードのネットワーキングおよび検証モジュールからほぼすべての行を選択して、それらの用語で説明できます。
もう少し具体的に言うと:
- フルノードは少なくとも8つのピアに接続します。最近のバージョンは、「ブロックのみ」モードで2つの追加ピアに接続します。ピアは、(IPサブネットまたはASマップによって)可能な限り多様になるように選択されます。特定のタイムアウト(40分だと思います)内に新しいブロックが追加されなかった場合、ビットコインコアはもう1つの発信ピアを追加します。
- フルノードは
getheaders
各ピアにリクエストを送信し、各ピアが知っている最良のブロックを追跡します。 - ピアに、現在のヒントよりも累積作業量が多い有効なブロックヘッダーがある場合は、対応するブロックを要求します。それらのブロックが有効な場合、それが新しいチェーンチップになります。その状態に到達するために、再編成が必要な場合と必要でない場合があります。
ヘッダーファースト同期がどのように機能するかを概念的に理解している場合は、関数FindNextBlocksToDownload()が次のステップです。これは、ノードがピアに現在のチェーンチップよりも多くの作業を伴うヘッダーがあるかどうかを判断し、そのピアにそれらのブロックを要求する場所です。
したがって、私たちにできることは、多くのピアに接続し、少なくとも1人が最も作業の多いチェーンについて知っていると想定することだけです。これにより、ピアの検出と接続先のピアの選択が非常に重要になります。