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

Blockchain Core Camp に参加しました

Blockchain(ビットコイン)コア実装を体験するワークショップに参加しました。

bc-2.jp

TXEDITORによるトランザクション作成

ビットコイントランザクションをWeb画面で作成する面白い体験がありましたので家に帰ってから復習した結果を共有します。

# Digital Garageの方が作成されたトランザクション作成ツール「TXEDITOR」を利用します。

1.事前準備

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

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

$ 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());

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

$ node new_address.js
Private Key : bc32f5abc11358b684aaddf879d5de547102d32f87a4e9b61cc01198e36729ed
Private Key (WIF) : cTtY3S5SKLzmGsoySfmHbNb2FwTq3bCw67qQ2oZ4ZRpyt4gqSaia
Public Key : 0328df82ba5d3086703ccf4dc66f59370895abc9dc3e2786243b6bd4f47752668e
Bitcoin Address : mpMvEqrLGGRtSrPFbmxnWC4Fxz95TwP5C8
Locking Script : OP_DUP OP_HASH160 20 0x6103ac34044e1a01842ed9bfc442812bdbd482e3 OP_EQUALVERIFY OP_CHECKSIG
Locking Script (HEX) : 76a9146103ac34044e1a01842ed9bfc442812bdbd482e388ac

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

$ node new_address.js
Private Key : bef4ad11ac5ebc6cb2be164395b6e0e47b3c88bacc3d0f4d276d568be103f1b4
Private Key (WIF) : cTytr1cdcWKucVpZ5vSiQnfiVJxngBDwxPzkhkmYByGHHzbpfjCd
Public Key : 0357f0e2adfcfa7288da1e71f9705a6d544f4b526efa3d8c2f59f74f7729852df2
Bitcoin Address : mnNzTHyXRpKJyszKuFenXDtRVwchsK9uBu
Locking Script : OP_DUP OP_HASH160 20 0x4b475af403bb8e544bcca29dc5212c7775fa818f OP_EQUALVERIFY OP_CHECKSIG
Locking Script (HEX) : 76a9144b475af403bb8e544bcca29dc5212c7775fa818f88ac

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

以下サイトから「mpMvEqrLGGRtSrPFbmxnWC4Fxz95TwP5C8」を入力するとTestnetで使えるBitcoinがもらえます

http://tpfaucet.appspot.com/

2.送信元のUTXO取得

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

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

[
   {
      "scriptPubKey":"76a9146103ac34044e1a01842ed9bfc442812bdbd482e388ac",
      "vout":0,
      "confirmations":0,
      "txid":"70c459dfd852b85f49e8c64a3af29e554cd1fffacf7bcccd28ac1d8ef99b55be",
      "amount":0.043
   }
]

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 * 1000000 - 100000 = 4200000
  • txouts[0].pk_script = 送信先アドレスのLocking Script (HEX)

スクリーンショット 2017-02-12 19.36.28.png

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

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

スクリーンショット 2017-02-12 19.36.51.png

5.TXEDITOR (Script)を入力

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

スクリーンショット 2017-02-12 19.37.15.png

6.TXEDITOR (Transactionタブ)を入力

  • txins[0].signature_script = Script.Hex

スクリーンショット 2017-02-12 19.37.33.png

7.decodeRawTransaction実行

decodeRawTransaction実行

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

レスポンス

{
   "txid":"40e2b155bb7b73623b2b2f8866a455699b76aeab077cd8d310a495e629ad2d6f",
   "size":191,
   "version":1,
   "locktime":0,
   "vin":[
      {
         "txid":"70c459dfd852b85f49e8c64a3af29e554cd1fffacf7bcccd28ac1d8ef99b55be",
         "vout":0,
         "scriptSig":{
            "asm":"304402207674f93be33f2a8b4a9fbdde81ffc9b6421e8854a17891a5a9db64f3a68e2a7902202f1eed603863afd62806468712ba4eada73bff41b310c1deed485112fc8b996f[ALL] 0328df82ba5d3086703ccf4dc66f59370895abc9dc3e2786243b6bd4f47752668e",
            "hex":"47304402207674f93be33f2a8b4a9fbdde81ffc9b6421e8854a17891a5a9db64f3a68e2a7902202f1eed603863afd62806468712ba4eada73bff41b310c1deed485112fc8b996f01210328df82ba5d3086703ccf4dc66f59370895abc9dc3e2786243b6bd4f47752668e"
         },
         "sequence":4294967295
      }
   ],
   "vout":[
      {
         "value":0.042,
         "n":0,
         "scriptPubKey":{
            "asm":"OP_DUP OP_HASH160 4b475af403bb8e544bcca29dc5212c7775fa818f OP_EQUALVERIFY OP_CHECKSIG",
            "hex":"76a9144b475af403bb8e544bcca29dc5212c7775fa818f88ac",
            "reqSigs":1,
            "type":"pubkeyhash",
            "addresses":[
               "mnNzTHyXRpKJyszKuFenXDtRVwchsK9uBu"
            ]
         }
      }
   ]
}

8.broadcast実行

broadcast実行

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

レスポンス

{
   "txid":"40e2b155bb7b73623b2b2f8866a455699b76aeab077cd8d310a495e629ad2d6f"
}

9.broadcast実行結果

問題なく送信できました。

http://tbtc.blockr.io/tx/info/40e2b155bb7b73623b2b2f8866a455699b76aeab077cd8d310a495e629ad2d6f

参考

https://developer.indiesquare.me/#broadcast-transaction http://tpfaucet.appspot.com/ http://qiita.com/you21979@github/items/5d3bd71ae2107d03973a