Counterpartydの参照系APIを実行する

f:id:yzono:20141218165317j:plain

はじめに

前回はCounterpartydをセットアップしてAPI(get_running_info)を実行しましたが、今回はそれ以外のReadAPIを実行します。

ローカルPC(Mac)からCounterpartydサーバーにRPC接続します。Node.jsを利用します。Node.jsの細かい説明は省略します。

Counterpartyを使ったサービスを開発する人への情報共有を目的とします。

目次

  • 準備(外部からのRPCアクセス。Node.js設定)
  • get_{table}
  • get_asset_info
  • get_asset_names
  • get_messages
  • get_messages_by_index
  • get_xcp_supply
  • get_block_info
  • get_blocks

準備(外部からのRPCアクセス。Node.js設定)

(1) 外部からのアクセスを許可

外部からのアクセスを可能にするために。counterpartyd.confを変更してcounterpartydを再起動してください。

rpc-host=0.0.0.0

ローカルPC(Mac)からCounterpartydサーバーにRPC接続ができるか確認

curl http://XXXXXXXX.vs.sakura.ne.jp:4000/api/ --user rpc:xcppw1234 -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript' --data-binary '{"jsonrpc":"2.0","id":0,"method":"get_running_info"}'

(2) Node.js設定

JSON-RPCのライブラリはnode-json-rpcを利用します。

$ npm install node-json-rpc

(3) Node.jsサンプル起動(get_running_info)

counterpartyd-api.jsファイルを作成。

var rpc = require('node-json-rpc');

var options = {
  port: 4000,
  host: 'XXXXXXX.vs.sakura.ne.jp',
  path: '/',
  strict: true,
  login: 'rpc',
  hash: 'xcppw1234'
};

var client = new rpc.Client(options);

client.call(
  {"jsonrpc":"2.0", "id":0, "method":"get_running_info"},
  function (err, res) {
    if (err) {
       console.log(err);
    } else {
       console.log(res);
    }
  }
);

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0',
  id: 0,
  result: 
   { 
     version_minor: 49,
     bitcoin_block_count: 311432,
     version_major: 9,
     db_caught_up: true,
     last_message_index: 479193,
     running_testcoin: false,
     running_testnet: false,
     version_revision: 1,
     last_block: 
      { 
        previous_block_hash: '0000000000000000001e79a361bb06c861ec527e9d57e3cdf176b6fdb0784e4b',
        block_index: 334553,
        txlist_hash: 'e3abb6ae9f22e51afcfab5c7da1067ae3a6815c29c369cdfed26876975fae6ee',
        block_time: 1418729720,
        block_hash: '000000000000000008a3b7780f566e2f8ddb1378f758cee28e6857bf4cf57c3b',
        ledger_hash: '396e6c9be5b6e99dacc8a0f1cc1213812bc0ae552b0ce457d41327d90c9846df',
        difficulty: '40007470271.2713' 
       } 
    } 
}

get_{table}

{table}にはbalances, credits, debitsなどを選択できます。ここではget_balancesを利用して、ビットコインアドレスに対する残高を取得します。

デフォルトの検索結果件数は最大1000件です。抽出条件は細かく設定できます。

client.call(
  {"jsonrpc":"2.0", "id":0, "method":"get_balances", "params":{"filters": {'field': 'address', 'op': '==', 'value': "17sdLuNtD7ZpFCVZ3Doz58fwxFF6i6CKk2"}}},
  function (err, res) {
    if (err) {
       console.log(err);
    } else {
       console.log(res);
    }
  }
);

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0',
  id: 0,
  result: 
   [ { address: '17sdLuNtD7ZpFCVZ3Doz58fwxFF6i6CKk2',
       quantity: 30000000,
       asset: 'XCP' },
     { address: '17sdLuNtD7ZpFCVZ3Doz58fwxFF6i6CKk2',
       quantity: 99900,
       asset: 'XZCOIN' 
     } 
   ] 
 }

私の保有するXCPとXZCOINの残高が表示されます。quantityは100000000倍の値が表示されます。実際は0.3XCP保持しています。

get_asset_info

指定したアセットの情報を返します。

リクエスト(ざくっと省略します。counterpartyd-api.js内のリクエストJSON部分をこれに変更してください)

{"jsonrpc":"2.0", "id":0, "method":"get_asset_info", "params":{"assets": ["XZCOIN", "GEMZ"]}},

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0',
  id: 0,
  result: 
   [ { issuer: '17sdLuNtD7ZpFCVZ3Doz58fwxFF6i6CKk2',
       owner: '17sdLuNtD7ZpFCVZ3Doz58fwxFF6i6CKk2',
       call_date: 0,
       asset: 'XZCOIN',
       supply: 100000,
       call_price: 0,
       divisible: false,
       callable: false,
       description: '',
       locked: false },
     { issuer: '1FUWt93FcNtWv2sqhGVK81QVgaGgPUaYis',
       owner: '1FUWt93FcNtWv2sqhGVK81QVgaGgPUaYis',
       call_date: 0,
       asset: 'GEMZ',
       supply: 10000000000000000,
       call_price: 0,
       divisible: true,
       callable: false,
       description: 'The GEMS Mobile App',
       locked: true 
     } 
    ] 
}

get_asset_names

全アセット名の一覧が表示されます。(XCP名を決める時に使えるかな..)

リクエストJSON

{"jsonrpc":"2.0", "id":0, "method":"get_asset_names"},

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0',
  id: 0,
  result: 
   [ 'A100000000000000000',
     'A1000000000000000000',
.
.
(省略)

get_messages

ブロック内のメッセージを表示します。細かい取引の内容が確認できます。

リクエストJSON

{"jsonrpc":"2.0", "id":0, "method":"get_messages", "params":{"block_index": 334553}},

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0',
  id: 0,
  result: 
   [ { bindings: '{"action": "open order", "address": "19HgcRygeivCz5faiVzFniC9GjW3DFyXG2", "asset": "XCP", "block_index": 334553, "event": "adba05c012f18e93f8d00590f0b5723f26a4ccb0dd546995cd1dbfe38b13a332", "quantity": 1046921}',
       block_index: 334553,
       timestamp: 1418869725,
       category: 'debits',
       command: 'insert',
       message_index: 479175 },
.
.
(省略)

get_messages_by_index

リクエストJSON

{"jsonrpc":"2.0", "id":0, "method":"get_messages_by_index", "params":{"message_indexes": [479175]}},

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0',
  id: 0,
  result: 
   [ { bindings: '{"action": "open order", "address": "19HgcRygeivCz5faiVzFniC9GjW3DFyXG2", "asset": "XCP", "block_index": 334553, "event": "adba05c012f18e93f8d00590f0b5723f26a4ccb0dd546995cd1dbfe38b13a332", "quantity": 1046921}',
       block_index: 334553,
       timestamp: 1418869725,
       category: 'debits',
       command: 'insert',
       message_index: 479175 
     } 
   ] 
}

get_xcp_supply

現在存在するXCPの総量を返します。

リクエストJSON

{"jsonrpc":"2.0", "id":0, "method":"get_xcp_supply"},

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0', id: 0, result: 264671268477850 }

get_block_info

block_indexを指定してblockの情報を返します。

リクエストJSON

{"jsonrpc":"2.0", "id":0, "method":"get_block_info", "params":{"block_index": 334553}},

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0',
  id: 0,
  result: 
   { previous_block_hash: '0000000000000000001e79a361bb06c861ec527e9d57e3cdf176b6fdb0784e4b',
     block_index: 334553,
     txlist_hash: 'e3abb6ae9f22e51afcfab5c7da1067ae3a6815c29c369cdfed26876975fae6ee',
     block_time: 1418729720,
     block_hash: '000000000000000008a3b7780f566e2f8ddb1378f758cee28e6857bf4cf57c3b',
     ledger_hash: '396e6c9be5b6e99dacc8a0f1cc1213812bc0ae552b0ce457d41327d90c9846df',
     difficulty: '40007470271.2713' 
   } 
 }

get_blocks

複数のblock_indexを指定してblockの情報を返します。

リクエストJSON

{"jsonrpc":"2.0", "id":0, "method":"get_blocks", "params":{"block_indexes": [334553]}},

実行と結果。

$node counterpartyd-api.js 
{ jsonrpc: '2.0',
  id: 0,
  result: 
   [ { previous_block_hash: '0000000000000000001e79a361bb06c861ec527e9d57e3cdf176b6fdb0784e4b',
       block_index: 334553,
       txlist_hash: 'e3abb6ae9f22e51afcfab5c7da1067ae3a6815c29c369cdfed26876975fae6ee',
       _messages: [Object],
       block_time: 1418729720,
       block_hash: '000000000000000008a3b7780f566e2f8ddb1378f758cee28e6857bf4cf57c3b',
       ledger_hash: '396e6c9be5b6e99dacc8a0f1cc1213812bc0ae552b0ce457d41327d90c9846df',
       difficulty: '40007470271.2713' 
     } 
  ] 
}

まとめ

次回はAction/Write API について書きます。

参考URL

Counterpartyd API Reference

node-json-rpc