Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@tnakagawa

Bitcoin Segwit Transactions(送信)

More than 3 years have passed since last update.

Segwit Transactions

Segwitscript_witnesses付き)のTransactionbitcoin-cliを使って送ってみようと思います。
Segwitscript_witnesses付き)のTransactionは、inputsegwitの「P2WPKH」か「P2WSH」のUTXOが必要となります。
まずは、「P2WPKH」と「P2WSH」に送信します。
BIP: 141 Segregated Witness (Consensus layer)

P2WPKH (version 0 pay-to-witness-public-key-hash)

Transactionoutputに設定する、scriptPubKeypk_scriptlocking 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と似ていますが、scriptPubKeywitnessは以下になります。

witness      : 0 <signature1> <1 <pubkey1> <pubkey2> 2 CHECKMULTISIG>
scriptSig    : (empty)
scriptPubKey : 0 <32-byte-hash>
               (0x0020{32-byte-hash})

<32-byte-hash>は、redeemScriptSHA256した値になります。
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には、inputvin)の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ので、createrawtransactionTransactionを作成します。
valueは、手数料(fee2,000 satoshiを引いた、0.1 BTCとしています。)

./bitcoin-cli -regtest createrawtransaction "[{\"txid\":\"<txid>\",\"vout\":0}]" "{\"myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4\":0.1}"

結果はTransactionhex<p2wpkh transaction hex>)が出ます、これをコピーしてください。
この、TransactionscriptSigに何も入っていない為、署名が必要となります。
対象の秘密鍵は以下となります。

<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ので、createrawtransactionTransactionを作成します。
valueは、手数料(fee2,000 satoshiを引いた、0.1 BTCとしています。)

./bitcoin-cli -regtest createrawtransaction "[{\"txid\":\"<txid>\",\"vout\":1}]" "{\"myAsNoo2eZZwB64xR1uAbP8tAeGf3uUDB4\":0.1}"

結果はTransactionhex<p2wsh transaction hex>)が出ます、これをコピーしてください。
この、TransactionscriptSigに何も入っていない為、署名が必要となります。
対象の秘密鍵は以下となります。

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


1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
tnakagawa
最近は、暗号ばっかやっている気がする。 数学得意だと思ってたけど、全然ダメダメだった。 もっと勉強しなければ・・・

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?