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入っている事が確認できます。