Develop with pleasure!

福岡でCloudとかBlockchainとか。

Compact Blockバージョン2

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からの変更点は以下の通り。

  1. sendcmpctメッセージの2つめの値(= バージョン)に1ではなく2をセットする。
  2. cmpctblockメッセージとblocktxnメッセージ内のトランザクションには、BIP-144で定義されているwitnessデータを含むトランザクションフォーマットが適用される。(このフォーマットはinventory typeにMSG_WITNESS_TXを指定したgetdataメッセージのレスポンスで使われている。)
  3. cmpctblockメッセージとgetblocktxnメッセージにセットされるShort transaction IDsは、バージョン1と同じプロセスで計算されるが、txidではなくBIP-141で定義されたwtxidが使われる。またノードは通常コインベーストランザクションは持ってないので(生成されたブロックのコインベーストランザクションは基本的にその時点で他のノードのメモリプールは存在しない)、当然それはShort transaction IDsに含まれるが、そのトランザクションはBIP-141で定義されているwitnessフォーマットのトランザクションエンコードしたトランザクションから計算されなければならない。
  4. cmpctblockメッセージを期待するinventory typeにMSG_CMPCT_BLOCKを指定したgetdataメッセージがレスポンスとして帰ってこず、非Compact形式のブロックを要求するblockメッセージは、cmpctblockメッセージをエンコードするのに使われたバージョンが2であればwitnessを含めてエンコードし、バージョン1であればwitness無しでエンコードされる。

バージョン2の参照実装

https://github.com/bitcoin/bitcoin/pull/8393