Transaction(まとめ)
ビットコインのブロックチェーン上でやり取りされるトランザクションの作成方法、種類、特徴について
ざっくり表にまとめました。
(言うてバイブルのトランザクション関連をぱっと見できるようにしただけ) 特徴と詳しい説明はまた今度
1. トランザクションの基本構成
https://gyazo.com/e4ee4d3e22fed55dd95d53a424ddd3a5
図1:インプット-アウトプットの接続関係
table:Tx全体
フィールド名 バイト数 フォーマット
version 4 32bit符号なし整数(リトルエンディアン)
tx_in_count 1~9 可変長整数
tx_in 可変 TxIn
tx_out_count 1~9 可変長可変長整数
tx_out 可変 TXOut
locktime 4 32bit符号なし整数(リトルエンディアン)
<説明>
version
通常は1(OP_CSVの場合は2)
tx_in_count
インプットに含まれるアイテム数
tx_in
インプットのリスト
tx_out_count
アウトプットに含まれるアイテム数
tx_out
アウトプットのリスト
locktime
適用する場合は00000001 適用しない場合は00000000
table:OutPut
フィールド名 バイト数 フォーマット
value 8 6bit符号なし整数(リトルエンディアン)
ScriptPubey bytes 可変 可変長整数
ScriptPubkey 可変 char[]
<説明>
value
送付するsatoshiの量
ScriptPubey bytes
公開鍵スクリプトのバイト数
ScriptPubkey
このアウトプットのsatoshiを利用する際の条件を定義する公開鍵スクリプト
table:InPut(not coinbase)
フィールド名 バイト数 フォーマット
index 4 32bit符号なし整数(リトルエンディアン)
script bytes 可変 可変長整数
ScriptSig 可変 char[]
seaquence 4 32bit符号なし整数(リトルエンディアン)
<説明>
hash
使用するUTXOのハッシュ
index
使用するUTXOのインデックス番号(最初の出力は0)
script bytes
署名スクリプトのバイト数
ScriptSig
UTXOに使用できるか判定する署名スクリプト.Txoutに含まれる公開鍵スクリプトと合わせて検証する
seaquence
ようわからんけど、0xffffffff
table:InPut(coinbase)
フィールド名 バイト数 フォーマット
index 4 32bit符号なし整数(リトルエンディアン)
coinbase data bytes 可変 可変長整数
coinbase data 可変 char[]
seaquence 4 32bit符号なし整数(リトルエンディアン)
<説明>
hash
全てのbitが0(UTXOは参照しないため)
index
0xffffffff
coinbase data bytes
コインベースデータのバイト数(2-100の間の値を取る)
coinbase data
任意のデータを設定。
seaquence
ようわからんけど、0xffffffff
2.電子署名
<署名の流れ>
https://gyazo.com/8b1fd3dae77c7d8a5934919016ac185d
図2:署名のフローチャート
table:signature hashの元ネタ
項目 説明
version トランザクションのバージョン
in_count インプットの数
in_list インプットをシリアライズしたもののリスト
out_count アウトプットの数
out_list アウトプットをシリアライズしたもののリスト
lock_time ロックタイム
signature hash type 署名の種類
table:signature hash type(署名の種類)
種類 署名対象 Input 署名対象 Output
SIGHASH_ALL 全てのInput 全てのOutput
SIGHASH_NONE 全てのInput
SIGHASH_SINGLE 一つのInput 一つのOutput
SIGHASH_ALL + SIGHASH_ANYONE-CANPAY 一つのInput 全てのOutput
SIGHASH_NONE + SIGHASH_ANYONE-CANPAY 一つのInput
SIHASH_SINGLE + SIGHASH_ANYONE-CANPAY 一つのInput 全てのOutput
<署名検証>
Bitcoinではトランザクションの有効性を検証するためにScript言語というものを用いています。
ScriptPubKeyには電子署名をする命令、インプットのScriptSigには電子署名をスクリプト言語で記述します
スクリプト言語はスタック(先入後出し)で構成されます。
記述されたスクリプトの実行後のスタックの状態をみて、署名検証の成功を判断します
スタックが1なら成功、それ以外は失敗です
https://gyazo.com/3dfe7e2a418d4b51caee5df399c042ef
図3:署名の最終スタック状態
3.スクリプト
スクリプトの命令はOpcodeで記述されます。また、スクリプト意外にも公開鍵のデータも埋め込まれます。
<スクリプトの設定方式>
支払い方法によって選ぶスクリプトの種類は変わってきます。
大きくわけて、P2PKH、マルチシグ、P2SHに別れます。
table:P2PKH
スクリプト 内容
ScriptPubKey (locking script) OP_DUP OP_HASH160 <Public key Hash A> OP_CHECKSIG OP_EQUALVERIFY
ScriptSig (unlocking script) <Signature A> <Public Key A>
検証されるスクリプト <Signature A> <Public Key A> OP_DUP OP_HASH160 <Public key Hash A>
OP_EQUALVERIFY OP_CHECKSIG
https://gyazo.com/99731f78812e6e7e316f7607dcbdb889
図4:P2PKH検証時のスタック状態遷移
table:マルチシグ
スクリプト 内容
ScriptPubKey (locking script) 2 <Public key A> <Public key B> <Public key C> 3
OP_CHECKMULTSIG
ScriptSig (unlocking script) OP_0 <Signature A> <Signature B>
検証されるスクリプト OP_0 <Signature A> <Signature B> 2 <Public key A>
<Public key B> <Public key C> 3 OP_CHECKMULTSIG
https://gyazo.com/6c5fb8ca65ca2e916975e98eb8a227d0
図5:2-of-3マルチシグのスタック状態遷移
<P2SH>
Script PubKeyにスクリプトのハッシュを設定し、トランザクションに含まれるデータを少なくしたもの。
マルチシグなんかで使う。
table:P2SH
スクリプト 内容
redeam Script 2 <Public key A> <Public key B> <Public key C> 3
OP_CHECKMULTSIG
ScriptPubKey (locking script) OP_HASH160 <redeam script hash> OP_EQUAL
ScriptSig (unlocking script) OP_0 <Signature A> <Signature B> <redeam scripy>
https://gyazo.com/3aa853bc6be862bab16d7550f6ff314d
図6:P2SH検証時の流れ
4.タイムロック
table:OP_CLTV
スクリプト 内容
ScriptPubKey (locking script) <ブロック高またはUNIXタイム> OP_CHECKLOCKTIMEVERIFY OP_DROP
<Public key A> OP_CHECKSIG
ScriptSig (unlocking script) <Signature A>
検証されるスクリプト <Signature A> <ブロック高またはUNIXタイム> OP_CHECKLOCKTIMEVERIFY
OP_DROP <Public key A> OP_CHECKSIG
table:OP_CSV
スクリプト 内容
ScriptPubKey (locking script) <ブロック高または512s単位の時間> OP_CHECKLOCKTIMEVERIFY OP_DROP
<Public key A> OP_CHECKSIG
ScriptSig (unlocking script) <Signature A>
検証されるスクリプト <Signature A> <ブロック高または512s単位の時間> OP_CHECKLOCKTIMEVERIFY
OP_DROP <Public key A> OP_CHECKSIG