ブロックチェーン/レベル III · ネットワーク/3.1 ノード/レッスン 2
ピアツーピアのゴシップ
ゴシッププロトコル:中央を持たずにノードがピアを見つけ、データを拡散する仕組み
用意するもの稼働中のBitcoin Coreノード‘bitcoin-cli’を使ったターミナルアクセスピア情報を記録するためのテキストエディタ
問い
- 空のネットワーク上の新しいノードは、最初のピアをどのように見つけるのでしょうか?
- 誰も調整していないのに、新しいブロックはどうやって数秒のうちに数千のノードに届くのでしょうか?
- 攻撃者がノードをネットワークの他の部分から孤立させるのを防いでいるのは何でしょうか?
探究
- ビットコインは、各フルノードが独立した状態を維持する分散型のピアツーピアネットワークとして動作します。新しいノードがこのネットワークに参加するには、既存のピアとTCP接続を確立しなければなりません。メインネットでは、これらの接続にポート8333が使用されます。最初のピア探索は、長年活動しているコミュニティメンバーが運用しソフトウェアに登録されているDNSシードと、ハードコーディングされたフォールバック用アドレスに依存します。接続が確立すると、ノードは「getaddr」でアドレスを要求し、「addr」メッセージでそれを受け取れます。これにより他の稼働中の参加者を知り、ピアの集合を動的に広げていくことができます。
- Bitcoin Coreは特定のトポロジーで接続を管理しています。トランザクションとブロックの伝播用に8つのアウトバウンドのフルリレー接続を持ち、加えて帯域幅の使用量を抑えるために2つのブロックリレー専用接続を持ちます。インバウンドとアウトバウンドを合わせて最大125の接続が可能です。この構造により冗長性が確保され、あるピアが切断されたり応答しなくなったりしても、他のピアを通じて接続が維持されます。ブロックリレー専用接続はトランザクションやアドレスを運ばないため、観察者がネットワークのトポロジーを把握しにくくなります。
- データの伝播はアナウンスの仕組みに従います。ノードが新しいトランザクションを受信すると、ハッシュ値を含みデータ本体は含まない「inv」(インベントリ)メッセージでそれをアナウンスします。一方、新しいブロックは現在、通常はヘッダーまたはコンパクトブロックを直接送信することでアナウンスされます。このアナウンスを受け取ったピアは、そのオブジェクトを自分が持っていないことを認識し、「getdata」リクエストを送信します。すると元の保持者が完全なペイロードを送信します。この2段階のプロセスにより、ピアが必要性を確認する前に冗長で大容量のペイロードがネットワークに溢れるのを防ぎ、分散システム全体で効率的な帯域幅の利用が実現されます。
- 2016年に導入されたコンパクトブロック(BIP152)は、これをさらに最適化しています。ブロック内のほとんどのトランザクションはメンプールでの伝播を通じてすでにピアに知られているため、ブロック全体を送信するのは無駄です。代わりに、ノードはブロックヘッダーと、各トランザクションの短い識別子(それぞれ6バイト)を、コインベースとともに送信します。受信側は自身のメンプールからブロックを再構築し、不足しているわずかなトランザクションだけを要求します。これによりブロック伝播の遅延が大幅に削減され、トランザクション量が多いときでも、ネットワークはより迅速にコンセンサスに達することができます。
- エクリプス攻撃は、ピアの多様性がいかに脆弱であるかを示しています。Heilmanら(2015年)は、ノードのすべての接続を掌握した攻撃者が、そのノードを誠実なネットワークから孤立させ、チェーンについて偽りの情報を与えられることを示しました。Bitcoin Coreはバージョン0.10.1から彼らの対策を採用し、フィーラー接続やより慎重なアドレステーブルからの削除処理などを実装しました。その後、再起動後も維持されるアンカー接続も追加されました。Torのみで稼働させると、ノードはエクリプス攻撃を受けにくくなるどころか、むしろ受けやすくなる可能性があります。
- ローカルのBitcoin Coreインスタンスに接続されたターミナルで「bitcoin-cli getpeerinfo」を実行し、ノードの接続状況を確認してください。出力結果には、各ピアのアドレス、その「connection_type」(例:outbound-full-relayやblock-relay-only)、ソフトウェアのバージョン、そして同期の進行度(「synced_headers」「synced_blocks」)が記載されます。正常なノードでは、8つのfull-relayと2つのblock-relay-onlyからなる約10個のアウトバウンド接続が確認できます。
重要な事実
- ビットコインメインネットは、ピアツーピア通信にTCPポート8333を使用しています。
- 新しいノードは、ゴシップを通じてピアを知る前に、DNSシードとハードコーディングされたアドレスを使ってブートストラップします。
- Bitcoin Coreのデフォルトでは、アウトバウンドのフルリレー接続が8つ、ブロックリレー専用接続が2つで、合計接続数の上限は125です。
- 「inv」メッセージはデータのハッシュ値を通知し、「getdata」はそれを保持しているピアに実際のペイロードを要求します。
- コンパクトブロック(BIP152)により、ピアはローカルのメンプールからブロックを再構築でき、ネットワーク通信量が削減されます。
- エクリプス攻撃は、ノードのすべての接続を奪取しようとします。Bitcoin Coreは2015年以降、いくつかの対策を追加しています。
演習 九・六・三・一
9集めるビットコインのP2Pブートストラップおよび伝播プロセスにおける9つの異なる構成要素をリストアップしてください(例:DNSシード、‘inv’メッセージ)。
6まとめるこれら9つの構成要素を、機能に基づいてディスカバリー、接続管理、データ通知、データ取得、最適化、セキュリティの6つのカテゴリーに分類してください。
3絞り込む6つのグループを、効率的かつ安全なネットワーク伝播を支える3つの核となる原則にまとめてください。
1結晶化するノードがエクリプス攻撃に耐えるために、なぜ多様なアウトバウンド接続を維持しなければならないのかを1文で説明してください。
事実確認
日付、数字、主張は、下記に記載された公表資料と照合して確認しました。