TXEDITORを使ってP2SHトランザクションを作る
今回はP2SH
前回はトランザクション作成ツール「TXEDITOR」を使ってOP_RETURNトランザクションを作成しました。今回はP2SH(Pay-to-Script-Hash)トランザクションを作ります。
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
2102dcf1658f38e56fcfcd0f1cab053f1c5b9ca6800420f475e7996b773f63036240ac がRedeem Scriptです。後で使います。⭐
(6) 送信元アドレス作成 (P2SH)
- Etc.HASH160.HEX = Script.Script(HEX)
- HASHボタンクリック
- BASE58 Check = C4, Etc.HASH160.HASH
- Encode (HEX > Base58Checkボタンクリック)
2NBZty5nmfujDpm8GbTnm5nvbJWC26Y1CNj が P2SHアドレスです。⭐
(7) 送信元アドレス (P2SH) にBitcoinを送付
以下サイトから送信元アドレスを入力するとTestnetで使えるBitcoinがもらえます
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
4.TXEDITOR (Signature(HASHTYPE_ALL))を入力
- Private key (WIF/HEX) = 送信元のPrivate Key (WIF)
5.TXEDITOR (Script)を入力
- Script = Signature + Hash Type<改行>Redeem Script ⭐
9.TXEDITOR (Transactionタブ)を入力
- txins[0].signature_script = Script.Hex
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