BitcoinJS (bitcoinjs-lib)を使ってCounterpartyのAssetを作成する

f:id:yzono:20140924161448j:plain

はじめに

Counterpartyのフォーラムに、@alexnskがCounterpartyとBitcoinJSの連携について書いていました。今回はBitcoinJSとCounterpartyのRPC-APIの連携について書きます。

目次

  • BitcoinJSとは
  • CounterpartyのAssetを作成

BitcoinJSとは

Hive Wallet、Blockchain.info、Dark Walletなど多数のWeb Walletで利用されているJavascriptBitcoinライブラリ。

Bitcoinアドレス作成、トランザクション作成といったよくある機能だけでなく、マルチシグのアドレス作成、ステルスアドレス作成など面白そうな機能がたくさんあり、これらのソースを見るだけでも楽しそうです。以下は私が気になった機能です。

  • Create an OP RETURN transaction

  • Create a 2-of-3 multisig P2SH address

  • Spend from a 2-of-2 multisig P2SH address

  • Generate a single-key stealth address

  • Generate a dual-key stealth address

  • Recover a BIP32 parent private key from the parent public key and a derived non-hardened child private key

CounterpartyのAssetを作成

BitcoinJSとCounterpartyのRPC APIを組み合わせて、Assetを作成するスクリプトが以下です。新規でビットコインアドレスを作成しているため、Asset作成時にBTC不足エラーになります..が、ひととおりの流れはみれると思います。

npm install bitcoinjs-lib
npm install node-json-rpc
var Bitcoin = require('bitcoinjs-lib')
var rpc = require('node-json-rpc');

// RPC接続情報
var options = {
  port: 4000,
  host: 'XXXXXX.vs.sakura.ne.jp',
  path: '/',
  strict: true,
  login: 'rpc',
  hash: 'xcppw1234'
};

// Bitcoinアドレス作成
var key = Bitcoin.ECKey.makeRandom();
var pk = key.toWIF(); // Private Key
var address = key.pub.getAddress();
address.version = 0x00; // 0x00 — mainnet, 0x6F — testnet
console.log(address.toString()); // Bitcoinアドレス

// Bitcoinアドレス Base58Check
try{
  var addr = Bitcoin.Address.fromBase58Check(address.toString());
  console.log("Base58Check OK");
}catch(e){ // Invalid address
  console.log(e);
}

// Asset作成 ※BTC不足のためエラーになります...
var client = new rpc.Client(options);

// Asset作成API(RPC)
client.call(
  {"jsonrpc":"2.0", "id":0, "method":"create_issuance", "params":{"source":"address.toString()", "quantity":10, "asset":"A15128863744940229000"}},
  function (err, res) {
    if (err) {
      console.log(err);
    } else {
      console.log(res);

      if (res.code == -32000) {
        return;
      }

      // サイン(BitcoinJS)
      var key = Bitcoin.ECKey.fromWIF(pk);
      var tx=Bitcoin.Transaction.fromHex(res.result);
      tx.sign(0, key);
      tx.toHex(); // HEX-data of signed transation

      // ブロードキャスト(RPC)
      client.call(
        {"jsonrpc":"2.0", "id":0, "method":"broadcast_tx", "params":{"signed_tx_hex":tx.toString()}},
        function (err, res) {
          if (err) {
            console.log(err);
          } else {
            console.log(res);
          }
        }
      );
     }
   }
);

まとめ

次回は、BitcoinJSの各機能をそれぞれ見ていきます。

参考

Sample of using bitcoinjs-lib with Counterparty

BitcoinJS

Github BitcoinJS (bitcoinjs-lib)

政府が解読できない通信アプリは禁止を 英キャメロン首相 ステルスアドレスを見てふっと思い出しました..