BIP-152として定義されているCompact Blockについて以前ブログを書いた↓
techmedia-think.hatenablog.com
簡単にいうと新しいブロックデータを受信する際、既存のblock
メッセージを使ってデータを受け取ると、そのメッセージにはブロック内の全トランザクションのRAWデータも含まれている。ただ、ブロックに入っているトランザクションの大半は既にメモリプールにあるので、重複したデータを受け取ることになり、ネットワークの帯域幅的にも無駄なので既に保持しているトランザクションデータについては受け取らないようにしようと言うもの。詳細な仕様についてや↑参照。
このCompact Block、久しぶりにBIPを見たらバージョン2が追記されてた↓
bips/bip-0152.mediawiki at master · bitcoin/bips · GitHub
内容的には、SegwitのトランザクションをサポートするCompact Blockをバージョン2としてるみたい。
バージョン2の仕様
バージョン2はほとんどバージョン1と同じだが、Segregated Witness(Segwit)のトランザクション(BIP-141、BIP-144)をサポートする。バージョン1からの変更点は以下の通り。
sendcmpct
メッセージの2つめの値(= バージョン)に1ではなく2をセットする。cmpctblock
メッセージとblocktxn
メッセージ内のトランザクションには、BIP-144で定義されているwitnessデータを含むトランザクションフォーマットが適用される。(このフォーマットはinventory typeにMSG_WITNESS_TX
を指定したgetdata
メッセージのレスポンスで使われている。)cmpctblock
メッセージとgetblocktxn
メッセージにセットされるShort transaction IDs
は、バージョン1と同じプロセスで計算されるが、txid
ではなくBIP-141で定義されたwtxid
が使われる。またノードは通常コインベーストランザクションは持ってないので(生成されたブロックのコインベーストランザクションは基本的にその時点で他のノードのメモリプールは存在しない)、当然それはShort transaction IDs
に含まれるが、そのトランザクションはBIP-141で定義されているwitnessフォーマットのトランザクションでエンコードしたトランザクションから計算されなければならない。cmpctblock
メッセージを期待するinventory typeにMSG_CMPCT_BLOCK
を指定したgetdata
メッセージがレスポンスとして帰ってこず、非Compact形式のブロックを要求するblock
メッセージは、cmpctblock
メッセージをエンコードするのに使われたバージョンが2であればwitnessを含めてエンコードし、バージョン1であればwitness無しでエンコードされる。