TXEDITORを使ってP2SHトランザクションを作る

今回はP2SH

前回はトランザクション作成ツール「TXEDITOR」を使ってOP_RETURNトランザクションを作成しました。今回はP2SH(Pay-to-Script-Hash)トランザクションを作ります。

blog.yzono.com

P2SHトランザクションのscript

P2SH scriptでは、以下例のように Redeem Script が利用されます。

Redeem Script : 1 PubKey1 PubKey2 PubKey3 3 OP_CHECKMULTISIG
Locking Script : OP_HASH160 <20-byte hash of redeem script> OP_EQUAL
Unlocking Script : Sig1 Sig2 redeem script

https://github.com/bitcoinbook/bitcoinbook/blob/first_edition/ch05.asciidoc

TXEDITORによるトランザクション作成 (P2SH to P2PKH)

1.事前準備

  • (1) bitcore-libインストール
  • (2) 新規アドレス作成JS作成
  • (3) 送信元アドレス作成
  • (4) 送信先アドレス作成
  • (5) Redeem Script作成 (P2SH)
  • (6) 送信元アドレス作成 (P2SH)
  • (7) 送信元アドレス (P2SH) にBitcoinを送付

(1) bitcore-libインストール

$ mkdir /tmp/txeditor
$ cd /tmp/txeditor
$ npm install bitcore-lib
$ vi new_address.js

(2) 新規アドレス作成JS作成 (new_address.js)

var bitcore = require('bitcore-lib');
var network = 'testnet';
var privateKey = new bitcore.PrivateKey(network);
console.log("Private Key : " + privateKey.toString());
console.log("Private Key (WIF) : " +privateKey.toWIF());
console.log("Public Key : " + privateKey.toPublicKey().toString());
console.log("Bitcoin Address : " + privateKey.toPublicKey().toAddress().toString());

var script = new bitcore.Script.buildPublicKeyHashOut(privateKey.toPublicKey());
console.log("Locking Script : " + script.toString());
console.log("Locking Script (HEX) : " + script.toHex());                                          

(3) 送信元アドレス作成

$ node new_address.js 
Private Key : 4a6c409dfa5057a7a42d3d84ea9f770c9d3ca9a94482e978891648ff17924adf
Private Key (WIF) : cQ5NQnhzCYgosk6GsCboNaWQTcsyagx9pc4tXYqPxd62Bugn5E5o
Public Key : 02dcf1658f38e56fcfcd0f1cab053f1c5b9ca6800420f475e7996b773f63036240
Bitcoin Address : muTmCdJgo4EqGnXDHCMF6sNkf4YTDjshtU
Locking Script : OP_DUP OP_HASH160 20 0x98f740acefa9ab4c101431f470a2d89206c3387c OP_EQUALVERIFY OP_CHECKSIG
Locking Script (HEX) : 76a91498f740acefa9ab4c101431f470a2d89206c3387c88ac

(4) 送信先アドレス作成

$ node new_address.js 
Private Key : edbce8501b2b20b3c9219008f308c0fbdfbf6d66e76514ad043835ebd5f5fbd9
Private Key (WIF) : cVYqGma4ceBji5nbvirTgQb8szpoYZJeKKhXuVgojzsB8aNtHAuN
Public Key : 0306f08f9af356b0a9a3f9a27986c22227827fa9034921e1b0cde68b9e1d85044a
Bitcoin Address : mhG2De6Qv7hQEYxGpoXM1QbVC2mQeEqq6Q
Locking Script : OP_DUP OP_HASH160 20 0x131d49a364af8e56e9c74a1aa9f721decde76dea OP_EQUALVERIFY OP_CHECKSIG
Locking Script (HEX) : 76a914131d49a364af8e56e9c74a1aa9f721decde76dea88ac

(5) Redeem Script作成 (P2SH)

Script.Script = 送信元.pubkey<改行>OP_CHECKSIG

スクリーンショット 2017-02-17 01.06.41.png

2102dcf1658f38e56fcfcd0f1cab053f1c5b9ca6800420f475e7996b773f63036240ac がRedeem Scriptです。後で使います。⭐

(6) 送信元アドレス作成 (P2SH)

  1. Etc.HASH160.HEX = Script.Script(HEX)
  2. HASHボタンクリック
  3. BASE58 Check = C4, Etc.HASH160.HASH
  4. Encode (HEX > Base58Checkボタンクリック)

スクリーンショット 2017-02-17 01.07.24.png

2NBZty5nmfujDpm8GbTnm5nvbJWC26Y1CNj が P2SHアドレスです。⭐

(7) 送信元アドレス (P2SH) にBitcoinを送付

以下サイトから送信元アドレスを入力するとTestnetで使えるBitcoinがもらえます

http://tpfaucet.appspot.com/

2.送信元のUTXO取得

UTXOはIndieSquare APIを利用して取得します。

$ curl https://apitestnet.indiesquare.me/v2/addresses/2NBZty5nmfujDpm8GbTnm5nvbJWC26Y1CNj/utxos

[
   {
      "scriptPubKey":"a914c8fa4a29e4b4b49ff563ac72355f046fd7fd5dea87",
      "vout":1,
      "confirmations":0,
      "txid":"71d8322e2b70e0a2f561299385baed3d57ae95cb205f1f6c31699681507c9914",
      "amount":0.26
   }
]

3.TXEDITOR (Transactionタブ)を入力

  • txins[0].outpoint.hash = utxoのtxid
  • txins[0].outpoint.index = utxoのvout
  • txins[0].signature_script = Redeem Script ⭐
  • txouts[0].value = utxo.amount * 100000000 - 100000 = 25000000
  • txouts[0].pk_script = 送信先のlocking script

スクリーンショット 2017-02-17 01.12.51.png

4.TXEDITOR (Signature(HASHTYPE_ALL))を入力

  • Private key (WIF/HEX) = 送信元のPrivate Key (WIF)

スクリーンショット 2017-02-17 01.13.41.png

5.TXEDITOR (Script)を入力

  • Script = Signature + Hash Type<改行>Redeem Script ⭐

スクリーンショット 2017-02-17 01.14.50.png

9.TXEDITOR (Transactionタブ)を入力

  • txins[0].signature_script = Script.Hex

スクリーンショット 2017-02-17 01.15.18.png

10.decodeRawTransaction実行

確認のために、decodeRawTransactionを実行

curl -H "Content-Type: application/json" -X POST -d '{"tx": "010000000114997c50819669316c1f5f20cb95ae573dedba85932961f5a2e0702b2e32d871010000006c473044022003abfd471e0f5fc0c3686f40a9e150d7a414c4e1e4736854774fdbb0b42815c002207f69026252a4714b63e07f7df6c11560804139e1f8daf8a43f31f3aa33e5b32a01232102dcf1658f38e56fcfcd0f1cab053f1c5b9ca6800420f475e7996b773f63036240acffffffff0140787d01000000001976a914131d49a364af8e56e9c74a1aa9f721decde76dea88ac00000000"}' https://apitestnet.indiesquare.me/v2/transactions/decode

レスポンス

{
   "txid":"2ce380d859449b456811cb3e2d5e94395396a8a722aeecb6470f0b914b8633bf",
   "size":193,
   "version":1,
   "locktime":0,
   "vin":[
      {
         "txid":"71d8322e2b70e0a2f561299385baed3d57ae95cb205f1f6c31699681507c9914",
         "vout":1,
         "scriptSig":{
            "asm":"3044022003abfd471e0f5fc0c3686f40a9e150d7a414c4e1e4736854774fdbb0b42815c002207f69026252a4714b63e07f7df6c11560804139e1f8daf8a43f31f3aa33e5b32a[ALL] 2102dcf1658f38e56fcfcd0f1cab053f1c5b9ca6800420f475e7996b773f63036240ac",
            "hex":"473044022003abfd471e0f5fc0c3686f40a9e150d7a414c4e1e4736854774fdbb0b42815c002207f69026252a4714b63e07f7df6c11560804139e1f8daf8a43f31f3aa33e5b32a01232102dcf1658f38e56fcfcd0f1cab053f1c5b9ca6800420f475e7996b773f63036240ac"
         },
         "sequence":4294967295
      }
   ],
   "vout":[
      {
         "value":0.25,
         "n":0,
         "scriptPubKey":{
            "asm":"OP_DUP OP_HASH160 131d49a364af8e56e9c74a1aa9f721decde76dea OP_EQUALVERIFY OP_CHECKSIG",
            "hex":"76a914131d49a364af8e56e9c74a1aa9f721decde76dea88ac",
            "reqSigs":1,
            "type":"pubkeyhash",
            "addresses":[
               "mhG2De6Qv7hQEYxGpoXM1QbVC2mQeEqq6Q"
            ]
         }
      }
   ]
}

8.broadcast実行

broadcast実行

$ curl -H "Content-Type: application/json" -X POST -d '{"tx": "010000000114997c50819669316c1f5f20cb95ae573dedba85932961f5a2e0702b2e32d871010000006c473044022003abfd471e0f5fc0c3686f40a9e150d7a414c4e1e4736854774fdbb0b42815c002207f69026252a4714b63e07f7df6c11560804139e1f8daf8a43f31f3aa33e5b32a01232102dcf1658f38e56fcfcd0f1cab053f1c5b9ca6800420f475e7996b773f63036240acffffffff0140787d01000000001976a914131d49a364af8e56e9c74a1aa9f721decde76dea88ac00000000"}' https://apitestnet.indiesquare.me/v2/transactions/broadcast

レスポンス

{
   "txid":"2ce380d859449b456811cb3e2d5e94395396a8a722aeecb6470f0b914b8633bf"
}

9.broadcast実行結果

送信できました。

http://tbtc.blockr.io/tx/info/2ce380d859449b456811cb3e2d5e94395396a8a722aeecb6470f0b914b8633bf