用語集 / ノードとソフトウェア
メッセージヘッダー
- メッセージヘッダーとは?
- ビットコインのメッセージヘッダーは、各ピアツーピアメッセージを包む24バイトの固定された封筒です。ネットワーク開始文字列、コマンド名、ペイロード長、チェックサムで構成されます。
ピアプロトコルには自分自身を記述する仕組みがないため、その役割は封筒が担います。4つのフィールドはサイズも順序も決して変わらないため、ノードはちょうど24バイトを読み取るだけで、あとどれだけ続くのかを把握し、Bitcoin Coreが受け入れる4,000,000バイトを超えると主張するものとの接続を切ることができます。読者が目にすることはありませんが、ヘッダーが不正な形式であると、ピア接続が理由もなく切れることがあります。
仕組み
ヘッダーの4つのフィールドは決まった順序で読み取られ、それぞれが次に起こることを左右します。
0バイト目から3バイト目までは、ネットワークを識別する開始文字列です。4バイト目から15バイト目まではコマンドです。小文字のASCII名を12文字までヌルバイトで埋めたもので、ビットコインのすべてのメッセージ種別が簡潔な名前を持つのはこのためであり、10文字のcmpctblockは上限に近い位置にあります。16バイト目から19バイト目までは、ペイロード長をリトルエンディアンの符号なし整数で表します。20バイト目から23バイト目まではチェックサムで、ペイロードに対して計算した二重SHA-256の先頭4バイトです。
長さをペイロードの前に置くことが、この設計の実質的な安全策です。24バイトを読み終えたノードは、送信側が不合理な内容を主張しているかどうかをすでに把握しており、Bitcoin Coreは4,000,000バイトを超えるものはすべて拒否して切断します。バッファを確保することも、届かないかもしれないデータを待つこともありません。長さを本体の後ろに置けば、送信側が止まることを信頼することになります。
チェックサムは、一般に与えられているほどの信頼に値しません。4バイトのハッシュは、不良リンク上でのビット反転を検出できますが、嘘をつくピアに対しては何の効果もありません。悪意ある送信者は、自分が送ると決めたものに対してチェックサムを計算するだけだからです。ビットコインにおける完全性は、内容をコンセンサスルールに照らして検証することから得られるものであり、このフィールドから得られるものではありません。
新しいソフトウェアでは、この構造全体が任意です。BIP324のバージョン2のトランスポートは接続を暗号化し、平文の封筒を、難読化した長さによるフレーミングと、最も一般的なメッセージ種別に対する1バイトの短縮識別子に置き換えるため、受動的な傍受者はもはや回線上でコマンド名を読み取れません。Bitcoin Coreはバージョン26.0で任意設定として搭載し、後のリリースで既定で有効にしました。
どこで見られるか
メッセージヘッダーは、パケットキャプチャやノード自身の診断に現れます。
Bitcoin Coreを-debug=net付きで実行すると、ログに各ピアのメッセージ種別とサイズが記録されます。接続が実際に何をしているかを観察する実用的な方法です。PROCESSMESSAGE: INVALID MESSAGESTARTと記されたエントリは、ピアがこのネットワークの開始文字列で始まらないバイトを送ったことを意味し、これはほぼ常に攻撃ではなく相手側の設定ミスによるものです。Wiresharkのビットコイン用ディセクタは、同じ24バイトを解析して各フレームにラベルを付けます。
メッセージヘッダーvsブロックヘッダー
メッセージヘッダーはトランスポートの梱包であり、ブロックヘッダーはコンセンサスデータであり、両者に共通するのは名前だけです。メッセージヘッダーは24バイトで、1回の配送の間だけ存在し、ペイロードを読み終えるとすぐに破棄されます。ブロックヘッダーは80バイトで、バージョン、前のブロックのハッシュ、マークルルート、タイムスタンプ、難易度ターゲット、ナンスを保持し、ハッシュ化することでそのブロックを恒久的に特定するプルーフ・オブ・ワークを生成します。一方は小包の宛先ラベルであり、もう一方はその中身です。