Y

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

今回はP2PK

前回はP2PKHトランザクショントランザクション作成ツール「TXEDITOR」で作成しました。今回はP2PKトランザクションも作ってみます。(飽きるまでいろいろなパターン試してみます)

blog.yzono.com

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インストール
  • (2) 新規アドレス作成JS作成
  • (3) 送信元アドレス作成
  • (4) 送信先アドレス作成
  • (5) 送信元アドレスに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);
// 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がもらえます

http://tpfaucet.appspot.com/

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)⭐

スクリーンショット 2017-02-13 18.56.02.png

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

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

スクリーンショット 2017-02-13 18.56.29.png

5.TXEDITOR (Script)を入力

  • Script = Signature + Hash Type<改行>送信元のPublic Key

スクリーンショット 2017-02-13 18.56.51.png

6.TXEDITOR (Transactionタブ)を入力

  • txins[0].signature_script = Script.Hex

スクリーンショット 2017-02-13 18.57.10.png

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)

スクリーンショット 2017-02-13 19.31.41.png

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

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

スクリーンショット 2017-02-13 19.32.08.png

4.TXEDITOR (Script)を入力

  • Script = Signature + Hash Type⭐

スクリーンショット 2017-02-13 23.32.16.png

5.TXEDITOR (Transactionタブ)を入力

txins[0].signature_script = Script.Hex

スクリーンショット 2017-02-13 23.32.38.png

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