TXEDITORを使ってP2PKトランザクションを作る
今回はP2PK
前回はP2PKHトランザクションをトランザクション作成ツール「TXEDITOR」で作成しました。今回はP2PKトランザクションも作ってみます。(飽きるまでいろいろなパターン試してみます)
P2PKH vs P2PK
Pay to public key script (P2PK) は、P2PKHの簡易版です。一般的にはP2PKHが使われています。P2PKHはOUTPUTを支払うまで公開鍵を公開しないためP2PKよりセキュアです。
P2PKトランザクションのscript
P2PKの場合はlocking scriptが <Public Key A> OP_CHECKSIG
、unlocking scriptが <Signature from Private Key A>
となっている部分がP2PKHとの違いです。
以下手順の ⭐ マークがあるところがP2PKHと異なる部分です。
TXEDITORによるトランザクション作成
1.事前準備
(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); // var privateKey = new bitcore.PrivateKey("929f890e36a725449e53945b1f7a64a124a9fb4b31d735426a2d9ac8166ff1f9", 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()); var script = new bitcore.Script.buildPublicKeyOut(privateKey.toPublicKey()); console.log("Locking Script (P2PK) : " + script.toString()); console.log("Locking Script (P2PK) (HEX) : " + script.toHex());
(3) 送信元アドレス作成
$ node new_address.js Private Key : 42f1a1a307c722448d2daed5b03d5522e878dbcce64e05bee875366a26dcd952 Private Key (WIF) : cPpqCN748doS6ot2WtnoXueueQAGTnaZBgihDd1pHxGj5brqpfVq Public Key : 0234b9aae1d3600e0e6c0b1be3ac87a82b5ec030d1680faff6eee8735de63f28c8 Bitcoin Address : mrLM6FazFDupo54qmS4z1YgCKg9grkTiTe Locking Script : OP_DUP OP_HASH160 20 0x76a7d66e4617d488c39c1bd56ec546865059f4a8 OP_EQUALVERIFY OP_CHECKSIG Locking Script (HEX) : 76a91476a7d66e4617d488c39c1bd56ec546865059f4a888ac Locking Script (P2PK) : 33 0x0234b9aae1d3600e0e6c0b1be3ac87a82b5ec030d1680faff6eee8735de63f28c8 OP_CHECKSIG Locking Script (P2PK) (HEX) : 210234b9aae1d3600e0e6c0b1be3ac87a82b5ec030d1680faff6eee8735de63f28c8ac
(4) 送信先アドレス作成
$ node new_address.js Private Key : 74b3fc6da793578599176679648211af7efb2c66da26b6b6a35102ba9e7085df Private Key (WIF) : cRVZGY8uUHfMCGiV9xb6vc3JT5tf1EP5GaVNkiDH2dvA297hk1YC Public Key : 02515ca98f0e0fc6ecf5a20554bbef48f86b249ec75154a4259e6d4ea8f1f4d654 Bitcoin Address : mqDJGWqwWghJvjqmp4sGRbhL6E1UtC7niY Locking Script : OP_DUP OP_HASH160 20 0x6a5a718bd46e8998bf61963d9f52303b370ada1e OP_EQUALVERIFY OP_CHECKSIG Locking Script (HEX) : 76a9146a5a718bd46e8998bf61963d9f52303b370ada1e88ac Locking Script (P2PK) : 33 0x02515ca98f0e0fc6ecf5a20554bbef48f86b249ec75154a4259e6d4ea8f1f4d654 OP_CHECKSIG Locking Script (P2PK) (HEX) : 2102515ca98f0e0fc6ecf5a20554bbef48f86b249ec75154a4259e6d4ea8f1f4d654ac
(5) 送信元アドレスにBitcoinを送付
以下サイトから送信元アドレスを入力するとTestnetで使えるBitcoinがもらえます
2.送信元のUTXO取得
UTXOはIndieSquare APIを利用して取得します。
$ curl https://apitestnet.indiesquare.me/v2/addresses/mrLM6FazFDupo54qmS4z1YgCKg9grkTiTe/utxos [ { "scriptPubKey":"76a91476a7d66e4617d488c39c1bd56ec546865059f4a888ac", "vout":0, "confirmations":0, "txid":"e99ed03edec61d216dd2c2318ff7f7d5d0450b81b48671c0aad5338711930e09", "amount":0.21 } ]
3.TXEDITOR (Transactionタブ)を入力
- txins[0].outpoint.hash = utxoのtxid
- txins[0].outpoint.index = utxoのvout
- txins[0].signature_script = utxoのscriptPubKey
- txouts[0].value = utxo.amount * 100000000 - 100000 = 20900000
- txouts[0].pk_script = 送信先アドレスのLocking Script (P2PK) (HEX)⭐
4.TXEDITOR (Signature(HASHTYPE_ALL))を入力
- Private key (WIF/HEX) = 送信元のPrivate Key (WIF)
5.TXEDITOR (Script)を入力
- Script = Signature + Hash Type<改行>送信元のPublic Key
6.TXEDITOR (Transactionタブ)を入力
- txins[0].signature_script = Script.Hex
7.decodeRawTransaction実行
decodeRawTransaction実行
$ curl -H "Content-Type: application/json" -X POST -d '{"tx": "0100000001090e93118733d5aac07186b4810b45d0d5f7f78f31c2d26d211dc6de3ed09ee9000000006a47304402206443cded856f293b3d0375c4c04119f1fd0c81eb265e8fb4e371fea851955de802206e675726f6ddb609c1a641418d82df9f4c5c902bc63ad23cd3ec57eb450b04c701210234b9aae1d3600e0e6c0b1be3ac87a82b5ec030d1680faff6eee8735de63f28c8ffffffff01a0e83e0100000000232102515ca98f0e0fc6ecf5a20554bbef48f86b249ec75154a4259e6d4ea8f1f4d654ac00000000"}' https://apitestnet.indiesquare.me/v2/transactions/decode
レスポンス
{ "txid":"030a05cd13f2b8cdacaafcc1391b54f78110c44036f5aea6c4963533815ad203", "size":201, "version":1, "locktime":0, "vin":[ { "txid":"e99ed03edec61d216dd2c2318ff7f7d5d0450b81b48671c0aad5338711930e09", "vout":0, "scriptSig":{ "asm":"304402206443cded856f293b3d0375c4c04119f1fd0c81eb265e8fb4e371fea851955de802206e675726f6ddb609c1a641418d82df9f4c5c902bc63ad23cd3ec57eb450b04c7[ALL] 0234b9aae1d3600e0e6c0b1be3ac87a82b5ec030d1680faff6eee8735de63f28c8", "hex":"47304402206443cded856f293b3d0375c4c04119f1fd0c81eb265e8fb4e371fea851955de802206e675726f6ddb609c1a641418d82df9f4c5c902bc63ad23cd3ec57eb450b04c701210234b9aae1d3600e0e6c0b1be3ac87a82b5ec030d1680faff6eee8735de63f28c8" }, "sequence":4294967295 } ], "vout":[ { "value":0.209, "n":0, "scriptPubKey":{ "asm":"02515ca98f0e0fc6ecf5a20554bbef48f86b249ec75154a4259e6d4ea8f1f4d654 OP_CHECKSIG", "hex":"2102515ca98f0e0fc6ecf5a20554bbef48f86b249ec75154a4259e6d4ea8f1f4d654ac", "reqSigs":1, "type":"pubkey", "addresses":[ "mqDJGWqwWghJvjqmp4sGRbhL6E1UtC7niY" ] } } ] }
8.broadcast実行
broadcast実行
$ curl -H "Content-Type: application/json" -X POST -d '{"tx": "0100000001090e93118733d5aac07186b4810b45d0d5f7f78f31c2d26d211dc6de3ed09ee9000000006a47304402206443cded856f293b3d0375c4c04119f1fd0c81eb265e8fb4e371fea851955de802206e675726f6ddb609c1a641418d82df9f4c5c902bc63ad23cd3ec57eb450b04c701210234b9aae1d3600e0e6c0b1be3ac87a82b5ec030d1680faff6eee8735de63f28c8ffffffff01a0e83e0100000000232102515ca98f0e0fc6ecf5a20554bbef48f86b249ec75154a4259e6d4ea8f1f4d654ac00000000"}' https://apitestnet.indiesquare.me/v2/transactions/broadcast
レスポンス
{ "txid":"030a05cd13f2b8cdacaafcc1391b54f78110c44036f5aea6c4963533815ad203" }
9.broadcast実行結果
問題なく送信できました。
http://tbtc.blockr.io/tx/info/030a05cd13f2b8cdacaafcc1391b54f78110c44036f5aea6c4963533815ad203
TXEDITORによるトランザクション作成 (P2PK to P2PKH)
P2PKのUTXOが作成されたので、今度はこれを支払います。
1.送信元のUTXO取得
UTXOはBlockcypherAPIを利用して取得します。(IndieSquareAPIだと空になっていた… バグ?)
$ curl https://api.blockcypher.com/v1/btc/test3/addrs/mqDJGWqwWghJvjqmp4sGRbhL6E1UtC7niY { "address": "mqDJGWqwWghJvjqmp4sGRbhL6E1UtC7niY", "total_received": 20900000, "total_sent": 0, "balance": 20900000, "unconfirmed_balance": 0, "final_balance": 20900000, "n_tx": 1, "unconfirmed_n_tx": 0, "final_n_tx": 1, "txrefs": [ { "tx_hash": "030a05cd13f2b8cdacaafcc1391b54f78110c44036f5aea6c4963533815ad203", "block_height": 1088643, "tx_input_n": -1, "tx_output_n": 0, "value": 20900000, "ref_balance": 20900000, "spent": false, "confirmations": 1, "confirmed": "2017-02-13T10:04:53Z", "double_spend": false } ], "tx_url": "https://api.blockcypher.com/v1/btc/test3/txs/" }
2.TXEDITOR (Transactionタブ)を入力
- txins[0].outpoint.hash = utxoのtxid
- txins[0].outpoint.index = utxoのvout
- txins[0].signature_script = UTXOのLocking Script (P2PK) (HEX)
- txouts[0].value = utxo.value - 100000 = 20800000
- txouts[0].pk_script = 送信先アドレスのLocking Script (HEX)
3.TXEDITOR (Signature(HASHTYPE_ALL))を入力
- Private key (WIF/HEX) = 送信元のPrivate Key (WIF)
4.TXEDITOR (Script)を入力
- Script = Signature + Hash Type⭐
5.TXEDITOR (Transactionタブ)を入力
txins[0].signature_script = Script.Hex
6.decodeRawTransaction実行
decodeRawTransaction実行
$ curl -H "Content-Type: application/json" -X POST -d '{"tx": "010000000103d25a81333596c4a6aef53640c41081f7541b39c1fcaaaccdb8f213cd050a03000000004847304402202d8e368701b932088af02e0732452ba7e2d2772b30646a3bce30c3c40cec99e002207b84e3962056b733c2e506a787c34817ef99bfc9e535fe662a1e00c484b7f6b101ffffffff0100623d01000000001976a91476a7d66e4617d488c39c1bd56ec546865059f4a888ac00000000"}' https://apitestnet.indiesquare.me/v2/transactions/decode
レスポンス
{ "txid":"85cbbe9c15ba34e126a66f324c346f861ff5ec7995db376c25915332d53dfe94", "size":157, "version":1, "locktime":0, "vin":[ { "txid":"030a05cd13f2b8cdacaafcc1391b54f78110c44036f5aea6c4963533815ad203", "vout":0, "scriptSig":{ "asm":"304402202d8e368701b932088af02e0732452ba7e2d2772b30646a3bce30c3c40cec99e002207b84e3962056b733c2e506a787c34817ef99bfc9e535fe662a1e00c484b7f6b1[ALL]", "hex":"47304402202d8e368701b932088af02e0732452ba7e2d2772b30646a3bce30c3c40cec99e002207b84e3962056b733c2e506a787c34817ef99bfc9e535fe662a1e00c484b7f6b101" }, "sequence":4294967295 } ], "vout":[ { "value":0.208, "n":0, "scriptPubKey":{ "asm":"OP_DUP OP_HASH160 76a7d66e4617d488c39c1bd56ec546865059f4a8 OP_EQUALVERIFY OP_CHECKSIG", "hex":"76a91476a7d66e4617d488c39c1bd56ec546865059f4a888ac", "reqSigs":1, "type":"pubkeyhash", "addresses":[ "mrLM6FazFDupo54qmS4z1YgCKg9grkTiTe" ] } } ] }
7.broadcast実行
broadcast実行
$ curl -H "Content-Type: application/json" -X POST -d '{"tx": "010000000103d25a81333596c4a6aef53640c41081f7541b39c1fcaaaccdb8f213cd050a03000000004847304402202d8e368701b932088af02e0732452ba7e2d2772b30646a3bce30c3c40cec99e002207b84e3962056b733c2e506a787c34817ef99bfc9e535fe662a1e00c484b7f6b101ffffffff0100623d01000000001976a91476a7d66e4617d488c39c1bd56ec546865059f4a888ac00000000"}' https://apitestnet.indiesquare.me/v2/transactions/broadcast
レスポンス
{ "txid":"85cbbe9c15ba34e126a66f324c346f861ff5ec7995db376c25915332d53dfe94" }
8.broadcast実行結果
問題なく送信できました。
http://tbtc.blockr.io/tx/info/85cbbe9c15ba34e126a66f324c346f861ff5ec7995db376c25915332d53dfe94
参考
https://programmingblockchain.gitbooks.io/programmingblockchain-japanese/content/other_types_of_ownership/p2pk[h]pay_to_public_key[hash].html https://bitcore.io/api/lib/script