Segwit Transactions
Segwit
(script_witnesses
付き)のTransaction
をbitcoin-cli
を使って送ってみようと思います。
Segwit
(script_witnesses
付き)のTransaction
は、input
にsegwit
の「P2WPKH
」か「P2WSH
」のUTXO
が必要となります。
まずは、「P2WPKH
」と「P2WSH
」に送信します。
BIP: 141 Segregated Witness (Consensus layer)
P2WPKH (version 0 pay-to-witness-public-key-hash)
Transaction
のoutput
に設定する、scriptPubKey
(pk_script
やlocking script
など呼び方は様々)
は、下記の最下段にある形式となります。
また、使用するときに設定する、witness
は下記の最上段にある形となります。
witness : <signature> <pubkey>
scriptSig : (empty)
scriptPubKey : 0 <20-byte-key-hash>
(0x0014{20-byte-key-hash})
<20-byte-key-hash>
は、<pubkey>
をHASH160
した値になります。
(※:HASH160
は、「Bitcoinで使われる技術要素」で解説しています。)
以下の値を使います。
<pubkey> : 027592aab5d43618dda13fba71e3993cd7517a712d3da49664c06ee1bd3d1f70af
scriptPubKey : 0014925d4028880bd0c9d68fbc7fc7dfee976698629c
P2WSH (version 0 pay-to-witness-script-hash)
P2WPKH
と似ていますが、scriptPubKey``witness
は以下になります。
witness : 0 <signature1> <1 <pubkey1> <pubkey2> 2 CHECKMULTISIG>
scriptSig : (empty)
scriptPubKey : 0 <32-byte-hash>
(0x0020{32-byte-hash})
<32-byte-hash>
は、redeemScript
をSHA256
した値になります。
redeemScript
は、2つの公開鍵(pubkey
)のどちらかの署名で良いものとします。
以下の値となります。
<pubkey1> : 02e5740e63bad28081ed7cf654dd6c19029ca03382fc05ab5f5dda81f2c55b845b
<pubkey2> : 02ec6d499aefd540e90357f1004a136049d1f7df5ad99c44c46e3ed4169e40acb6
redeemScript : OP_1 <pubkey1> <pubkey2> OP_2 OP_CHECKMULTISIG
redeemScript : 512102e5740e63bad28081ed7cf654dd6c19029ca03382fc05ab5f5dda81f2c55b845b2102ec6d499aefd540e90357f1004a136049d1f7df5ad99c44c46e3ed4169e40acb652ae
scriptPubKey : 00202db15af9e9bf2c0de55ab1935098229eb59389dc00b66b2828230b208ca767d7
Transactionの送信
「P2WPKH
」と「P2WSH
」に送信してみましょう。
本当は、createrawtransaction
を利用して作成したいのですが、「P2WSH
」に対応していないので、
Transaction hex
を作成しました。
010000000002509e980000000000160014925d4028880bd0c9d68fbc7fc7dfee976698629c509e9800000000002200202db15af9e9bf2c0de55ab1935098229eb59389dc00b66b2828230b208ca767d700000000
input
は空、output
は「P2WPKH
」と「P2WSH
」にそれぞれ0.10002 BTC
送信するようなTransaction
にないます。
内容を調べたい場合は、decoderawtransaction
を使って確認してください。
このTransaction
を送信する為に、fundrawtransaction
を使って、必要なinput
を追加します。
「"{\"changePosition\":2}"
」オプションは、お釣りのoutput
を一番最後にする為のものです。
./bitcoin-cli -regtest fundrawtransaction 010000000002509e980000000000160014925d4028880bd0c9d68fbc7fc7dfee976698629c509e9800000000002200202db15af9e9bf2c0de55ab1935098229eb59389dc00b66b2828230b208ca767d700000000 "{\"changePosition\":2}"
※:ここからは、input
がそれぞれの環境で違うので、結果が異なります。自身の環境での結果を利用してください。
結果が以下のように表示されます。
{
"hex": "<transaction hex>",
"changepos": 2,
"fee": 0.00005320
}
このTransaction
には、input
(vin
)のscriptSig
に何も入っていない為、署名する必要がありあます。
<transaction hex>
をsignrawtransaction
を用いて、署名します。
./bitcoin-cli -regtest signrawtransaction <transaction hex>
結果が以下のように出ます。
{
"hex": "<signed transaction hex>",
"complete": true
}
この<signed transaction hex>
をsendrawtransaction
を使って送信します。
./bitcoin-cli -regtest sendrawtransaction <signed transaction hex>
結果は、<txid>
が出ます。(32byte、hexで64文字の値が出ます。)
この<txid>
をコピーしておいてください。
Transactionの利用
送信アドレスは以下のアドレスを利用します。
address : myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4
P2WPKH (version 0 pay-to-witness-public-key-hash)
送信した、<txid>
の0
番目がP2WPKHので、createrawtransaction
でTransaction
を作成します。
(value
は、手数料(fee
)2,000 satoshi
を引いた、0.1 BTC
としています。)
./bitcoin-cli -regtest createrawtransaction "[{\"txid\":\"<txid>\",\"vout\":0}]" "{\"myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4\":0.1}"
結果はTransaction
のhex
(<p2wpkh transaction hex>
)が出ます、これをコピーしてください。
この、Transaction
はscriptSig
に何も入っていない為、署名が必要となります。
対象の秘密鍵は以下となります。
<p2wpkh prvkey> : cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN8kokULeTxo
<p2wpkh transaction hex>
と<txid>
から、signrawtransaction
を使って署名します。
./bitcoin-cli -regtest signrawtransaction <p2wpkh transaction hex> "[{\"txid\":\"<txid>\",\"vout\":0,\"scriptPubKey\":\"0014925d4028880bd0c9d68fbc7fc7dfee976698629c\",\"redeemScript\":\"76a914925d4028880bd0c9d68fbc7fc7dfee976698629c88ac\",\"amount\":0.10002000}]" "[\"cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN8kokULeTxo\"]"
結果が以下のように出ます。
{
"hex": "<signed p2wpkh transaction hex>",
"complete": true
}
この<signed p2wpkh transaction hex>
をsendrawtransaction
を使って送信します。
./bitcoin-cli -regtest sendrawtransaction <signed p2wpkh transaction hex>
結果は、<p2wpkh txid>
が出ます。(32byte、hexで64文字の値が出ます。)
このままでは、ブロックに入らないので、generate
してブロックに入れます。
<p2wpkh txid>
をgetrawtransaction
で見てみます。
./bitcoin-cli -regtest generate 1
./bitcoin-cli -regtest getrawtransaction <p2wpkh txid> 1
P2WSH (version 0 pay-to-witness-script-hash)
送信した、<txid>
の1
番目がP2WSHので、createrawtransaction
でTransaction
を作成します。
(value
は、手数料(fee
)2,000 satoshi
を引いた、0.1 BTC
としています。)
./bitcoin-cli -regtest createrawtransaction "[{\"txid\":\"<txid>\",\"vout\":1}]" "{\"myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4\":0.1}"
結果はTransaction
のhex
(<p2wsh transaction hex>
)が出ます、これをコピーしてください。
この、Transaction
はscriptSig
に何も入っていない為、署名が必要となります。
対象の秘密鍵は以下となります。
<p2wsh prvkey1> : cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN9QKPG3J8w2
<p2wsh transaction hex>
と<txid>
から、signrawtransaction
を使って署名します。
./bitcoin-cli -regtest signrawtransaction <p2wsh transaction hex> "[{\"txid\":\"<txid>\",\"vout\":1,\"scriptPubKey\":\"00202db15af9e9bf2c0de55ab1935098229eb59389dc00b66b2828230b208ca767d7\",\"redeemScript\":\"512102e5740e63bad28081ed7cf654dd6c19029ca03382fc05ab5f5dda81f2c55b845b2102ec6d499aefd540e90357f1004a136049d1f7df5ad99c44c46e3ed4169e40acb652ae\",\"amount\":0.10002000}]" "[\"cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN9QKPG3J8w2\"]"
結果が以下のように出ます。
{
"hex": "<signed p2wsh transaction hex>",
"complete": true
}
この<signed p2wsh transaction hex>
をsendrawtransaction
を使って送信します。
./bitcoin-cli -regtest sendrawtransaction <signed p2wsh transaction hex>
結果は、<p2wsh txid>
が出ます。(32byte、hexで64文字の値が出ます。)
このままでは、ブロックに入らないので、generate
してブロックに入れます。
<p2wsh txid>
をgetrawtransaction
で見てみます。
./bitcoin-cli -regtest generate 1
./bitcoin-cli -regtest getrawtransaction <p2wpkh txid> 1
確認
以下を実行して、アドレスに送信された事を確認してみましょう。
./bitcoin-cli -regtest importaddress myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4
./bitcoin-cli -regtest getreceivedbyaddress myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4
./bitcoin-cli -regtest listunspent 1 9999999 "[\"myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4\"]"
0.2 BTC
入っている事が確認できます。