シリアライズされた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) |