本文へスキップ
buybitcoinsmart

用語集 / 開発者向けリファレンス

MSG_WITNESS_BLOCK

MSG_WITNESS_BLOCKとは?
ウィットネスブロックのインベントリ型は、SegWit対応のノードが拡張シリアライゼーションでブロックを要求する方法で、すべての署名を削除するのではなく添付した状態で取得します。

BIP-144で規定されています。

2つのノードが同じブロックを保持していても、そのバイト数について見解が分かれることがあります。MSG_WITNESS_BLOCKはコード0x40000002で、通常のブロック要求にウィットネスビットを加えたもので、2017年8月24日にブロック481,824でSegWitが有効化されて以来存在しています。ご自身でノードを運用している場合、これがマシンがチェーンを信頼する前に必要とする署名を取得する要求です。

仕組み

Bitcoin Coreは同じブロックを書き出す2つの方法を保持し、誰が要求しているかに応じて選択します。

ウィットネスフラグは1つの上位ビット0x40000000です。これをブロックのインベントリ型である2に加えると、0x40000002になります。BIP144はこのフラグと、ノードがversionメッセージでより完全なデータを提供できることを示すために広告するサービスビットNODE_WITNESS(値8)の両方を導入しました。このフラグはgetdata要求にのみ現れます。アナウンスは通常のブロックインベントリとして送信されます。アナウンスは単なるハッシュであり、ハッシュはいずれの場合も同じだからです。

この最後の点が、2つのシリアライゼーションが共存できる理由です。ブロックヘッダーはtxidから構築されたマークルルートにコミットし、txidはウィットネスを除いたトランザクションに対して計算されます。すべての署名を取り除いても、ブロックは同一の32バイトの識別子にハッシュされます。ウィットネスデータは別途、コインベーストランザクションのアウトプットでコミットされます。そのスクリプトは少なくとも38バイトで、4バイトのタグ0xaa21a9edとそれに続く32バイトのウィットネスマークルルートで始まります。

違いが効いてくるのはサイズです。ブロックの上限は4,000,000重量単位で、ストリップされたサイズの3倍に完全なサイズを加えたものとして数えられ、ウィットネスデータを多く含むブロックが回線上で4MBに近づくことを可能にします。2023年2月1日にマイニングされたブロック774,628は約3.96MBで、そのほぼすべてがウィットネス空間にある1つのインスクリプションでした。その重量の式を逆算すると、これほど大きなブロックにはストリップ形式で残るものがほとんどありません。レガシーシリアライゼーションを要求する古いピアは骨組みだけを受け取り、ペイロードを一切受け取りません。だからこそ、そのようなピアは現在のブロックを検証できないものとして扱われます。

どこで見られるか

ソースコードを読まずにMSG_WITNESS_BLOCKを見られる場所は2つあります。ノード自体のログと、そのピア統計です。

bitcoindをnetデバッグカテゴリで起動すると、初期ブロックダウンロードの間ずっとgetdataの行が流れていきます。そのすべてにウィットネスフラグが付いています。現代のノードはウィットネス対応のピアからのみブロックを取得するからです。getpeerinfo RPCは送受信バイトをメッセージタイプごとに分解するので、同期をブロックのトラフィックが支配している様子を簡単に確認できます。Bitcoin Core 23.0はgetblockfrompeerを追加しました。これは指定した1つのピアにハッシュで特定の1つのブロックを要求するもので、ウィットネス形式を取得します。

プルーニングされたノードは状況を複雑にします。プルーニングを有効にして運用されるノードは、最小の許容設定が550MiBで、NODE_NETWORK_LIMITEDを広告し、直近の288ブロック(約2日分の履歴)のみを提供します。それより古いものを要求しても何も返ってきません。

ビットコインを購入して保有する人にとって、意味は明快です。チェーンを自分で検証するとは、すべての署名をダウンロードして確認することを意味します。サーバーに問い合わせる携帯電話のウォレットはこの要求を一切送信せず、ウィットネスを一切見ず、画面に表示される残高について他人の言葉を信じているのです。

MSG_WITNESS_BLOCK vs MSG_BLOCK

MSG_BLOCKは署名を取り除いた同じブロックを要求するもので、現在はレガシーな要求です。どちらの型も同じハッシュでブロックを指定し、どちらもblockメッセージで応答されます。違いは、各トランザクション内にマーカーバイトとフラグバイト、およびウィットネススタックが存在するかどうかです。最近のブロックに対してMSG_BLOCKを要求するノードは、その中のSegWitの支払いを1つも検証できないため、Bitcoin Coreはその形式をNODE_WITNESSを一度もシグナルしなかったピアのために取ってあります。

混同しやすい用語

よくある質問

なぜブロックには2つの異なるサイズがあるのですか?

SegWitがシリアライゼーションを2つに分けたからです。ストリップ形式はすべてのウィットネススタックを取り除き、拡張形式はそれらを保持します。ヘッダーがウィットネスハッシュではなくtxidから構築されたマークルルートにコミットするため、どちらも同じブロック識別子にハッシュされます。

次に読む

関連用語

開発者向けリファレンスのその他の用語

このページを英語で読む