読者です 読者をやめる 読者になる 読者になる

Develop with pleasure!

福岡でCloudとかBlockchainとか。

トランザクションのシリアライズフォーマット仕様

Bitcoin

シリアライズされたBitcoinトランザクションのフォーマット仕様について、いつもライブラリ任せだったのでちゃんと仕様を読む。

https://bitcoin.org/en/developer-reference#raw-transaction-format

フォーマット仕様

バイト数 名前 データタイプ 定義
4 version 32bitの符号無し整数 トランザクションのバージョン番号で、現在のバージョンは1(32bitのリトルエンディアン)。
新しいコンセンサスルールによって作成されたトランザクションの場合は1より大きいバージョンになる。
可変 tx_in count 可変長整数 トランザクションに含まれる入力の数
可変 tx_in txIn トランザクションの入力。
フォーマット仕様は以下のTxIn参照。
可変 tx_out count 可変長整数 トランザクションに含まれる出力の数
可変 tx_out txOut トランザクションの出力。
フォーマットについては以下のTxOut参照。
4 lock_time 32bitの符号無し整数 UNIXのエポックタイムもしくはブロックNo(32bitのリトルエンディアン)

トランザクション複数の入力と複数の出力を持つ。
可変長整数(CompactSize unit)のフォーマット仕様については以下を参照。

https://bitcoin.org/en/developer-reference#compactsize-unsigned-integers

(非コインベースの)TxIn

コインベースではない各入力はその元となるトランザクションの出力(outpoint)への参照を持つ。

バイト数 名前 データタイプ 定義
36 previous_output outpoint この入力が参照するトランザクションのoutpoint。フォーマット仕様は以下のOutPoint参照。
可変 script bytes 可変長整数 署名スクリプトのバイト数(最大10,000バイト)
可変 signature script char[] outpointの公開鍵スクリプトを使用できるか判定する署名スクリプト
4 sequence 32bitの符号無し整数 シーケンス番号。デフォルト値は0xffffffff。
Outpoint

トランザクションには複数の出力をセットできるので、それを指すoutpointの構造にはTXIDと出力のインデックス番号が含まれる。

バイト数 名前 データタイプ 定義
32 hash char[32] 使用するUTXOのトランザクションのTXID。
4 index 32bitの符号無し整数 使用するUTXOのインデックス番号(32bitのリトルエンディアン)。最初の出力の場合は0x00000000。

TxOut

バイト数 名前 データタイプ 定義
8 value 64bit長整数 送付するsatoshiの量(64bitのリトルエンディアン)。全出力のsatoshiの合計が全入力に含まれるsatoshiの合計を超えるようなトランザクションは作れない。0を指定することも可能。(OP_RETURNなどメタデータを定義した出力のsatoshiは基本的に0)
1+ pk_script bytes 可変長整数 公開鍵スクリプトのバイト数(最大10,000バイト)
可変 pk_script char[] この出力のsatoshiを使用する際の条件を定義する。

パース例

入力、出力ともに1つである以下の署名済みのトランザクション

01000000011963ac59aa1ac19bf202d5e5b6e50a6a1b0acdd3321c05c2dacd91f779b0e85f0100000072473044022052d68836c106c76d5691e605ac58f144f5647c9d759dea031379884ddddbe1b7022053b29154b601adb541e9866cde400d0d0177d20ab48d46f359eebdfa1209d0f8012903fe3a0db1752103e39299dcced3f711fd5042bb491d6351ec38b1e051408179ca579f1d7b4ac80bac0000000001e47e0100000000001976a91465259d8fad44dddf5d137c6fe4f77f5281b255ae88acfe3a0d00

以下のようにパースできる。

名前
version 01000000
tx_in count 01
hash 1963ac59aa1ac19bf202d5e5b6e50a6a1b0acdd3321c05c2dacd91f779b0e85f
(txid=5fe8b079f791cddac2051c32d3cd0a1b6a0ae5b6e5d502f29bc11aaa59ac6319)
index 01000000
script bytes 72(=114)
signature script 473044022052d68836c106c76d5691e605ac58f144f5647c9d759dea031379884ddddbe
1b7022053b29154b601adb541e9866cde400d0d0177d20ab48d46f359eebdfa1209d0f8
012903fe3a0db1752103e39299dcced3f711fd5042bb491d6351ec38b1e051408179ca
579f1d7b4ac80bac
sequence 00000000
tx_out count 01
value e47e010000000000(=98020 satoshi)
pk_script bytes 19(=25)
pk_script 76a91465259d8fad44dddf5d137c6fe4f77f5281b255ae88ac
lock_time fe3a0d00(=867070)