本文へスキップ
buybitcoinsmart

用語集 / ノードとソフトウェア

スタートストリング

別名はStart stringです。

スタートストリングとは?
スタートストリングとは、ビットコインのネットワークメッセージの先頭にある4バイトのプレフィックスであり、ほかの内容が読み取られる前に、送信者がどのネットワークにいるのかを示すものです。

この4バイトによって、ビットコインの並行する各ネットワークが誤って互いに通信してしまうことを防いでいます。メインネットはf9beb4d9、regtestはfabfb5daを使用しており、想定外の値を読み取ったノードはそのメッセージを破棄し、通常はその接続も破棄します。このチェックが捉えるのは攻撃者ではなく設定の誤りです。正しい4バイトは誰でも送信できるためです。

仕組み

スタートストリングはメッセージの先頭から4バイトを占め、ノードが後続の内容のためにメモリを確保する前に検査されます。

Bitcoin Coreはチェーンごとに1つの値をハードコードしています。メインネットは0xf9beb4d9です。testnet3は0x0b110907です。Bitcoin Core 28.0でBIP94とともに追加されたtestnet4は0x1c163f28です。regtestは0xfabfb5daです。興味深いのはsignetです。定数ではなく、その4バイトは、そのsignetのブロックに誰が署名できるかを定めるチャレンジスクリプトをハッシュ化することで導出されるため、公開されているデフォルトのsignetと、テスト用に立ち上げたプライベートなsignetは、自動的に互いに通信することを拒否します。

これらの値は見栄えが良くなるよう選ばれたものではありません。通常のストリームデータには現れにくいバイト列であるため、破損したり同期がずれたりしたTCPストリームを読み取るクライアントは、パターンを再び見つけるまで前方に走査し、すべてを破棄するのではなくその時点から再開できます。

同じ4バイトはディスクにも書き込まれます。生のブロックを保持するblk00000.datファイル内では、保存される各ブロックの前に、そのネットワークのスタートストリングと4バイトの長さが置かれます。このフレーミングにより、ノードは書き込みが完了しなかったブロックファイルを走査し、レコード間の境界を特定し、ファイル全体ではなく切り詰められた末尾だけを破棄できます。

目にする場面

スタートストリングは、ビットコインのトラフィックを単に利用するのではなく検査するたびに現れます。

ポート8333でパケットキャプチャを開くと、その通信のすべてのフレームがf9 be b4 d9で始まります。プロトコルアナライザーはまさにこのシグネチャを手がかりにトラフィックを分類します。コードベースをフォークしたすべてのプロジェクトは、最初の作業の1つとしてこの4バイトを変更しており、そのためフォーク同士はハンドシェイクがほかの点で同一であっても相互接続できません。

通常のユーザーにとっては、役に立たない沈黙という形で一度だけ表面化します。testnet用に設定されたウォレットをメインネットのノードに向けると、エラーも拒否の通知も接続も得られません。ノードは認識しない4バイトを読み取り、メッセージを破棄し、最終的にピアを切断します。ノードとウォレットが互いを認識しないときは、まず両端が同じネットワーク上にあることを確認してください。

スタートストリングvsメッセージヘッダー

スタートストリングは1つのフィールドであり、メッセージヘッダーはその4つすべてです。ヘッダーは24バイトで、スタートストリング、次にASCIIの12バイトのコマンド名、次に4バイトのペイロード長、次に4バイトのチェックサムで構成されます。スタートストリングはどのネットワークか、コマンドはどの種類のメッセージか、長さはあとどれだけ読み取るかに答えます。人々はメッセージヘッダーを指してこの2つの名称を同じ意味で使いますが、16進ダンプでバイトオフセットを数え始めた瞬間に、それがはっきりと混乱を招きます。

混同しやすい用語

よくある質問

ビットコインのネットワークマジックバイトとは何ですか?

メインネットは0xf9beb4d9、testnet3は0x0b110907、testnet4は0x1c163f28、regtestは0xfabfb5daを使用しています。signetには固定値がありません。その4バイトは、そのsignetのブロックに誰が署名できるかを定めるチャレンジスクリプトのハッシュから導出されます。

ウォレットがノードへの接続に失敗しても何も表示されないのはなぜですか?

多くの場合、両者が異なるネットワーク上にあるためです。想定外のスタートストリングを読み取ったノードは、エラーを送信せずにメッセージを破棄するため、メインネットのノードに向けられたtestnetのウォレットは警告ではなく沈黙を生みます。

関連用語

ノードとソフトウェアのその他の用語

このページを英語で読む