結論:https://mpchain.info/api/cbに所定の引数を渡してPOSTする。

この引数がわからなかったのでmpurseのコードを読んだ。

結論

curl -X POST -H "Content-Type: application/json" -d '{"id":0,"jsonrpc":"2.0","method":"proxy_to_counterpartyd","params":{"method":"search_raw_transactions", "params":{"address":"MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"}}}' https://mpchain.info/api/cb/

経緯 🔗

前回mpurse.counterPartyメソッドを使えば、指定したアドレスの全トランザクション情報が取得できると判明した。

たとえば以下で私のトランザクション情報が取得できる。

await window.mpurse.counterParty('search_raw_transactions', {address: 'MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu'});

今度はこれを、mpurse APIを介さず、mpchain APIだけで実現してみたい。けれどドキュメントsearch_raw_transactionsを読んでも、どうリクエストすればいいかわからなかった。そこで、mpurseのソースコードを読むことにした。

READMEを読む 🔗

mpurseのREADMEによると、mpurse.counterPartyメソッドは以下のAPIを叩いてるらしい。

  • https://mpchain.info/api/cb

これはmpchain APIのようだ。cbって何の略? counterBlockの略なの? でも叩きたいのはcounterPertyのほうなんだが? まあいい。これをそのままブラウザのURL欄で叩くと以下のようになった。なにがなんやらサッパリだ。

{"ERROR":null,"counterblock":"OK","counterblock_caught_up":true,"counterblock_check_elapsed":0.011597633361816406,"counterblock_cur_block":{"block_hash":"b6a832eeb6a3a655c3196630f75585aea0f9cf7937f038af61a00fe8cd5ca1fd","block_index":2674400},"counterblock_error":null,"counterblock_last_message_index":2268056,"counterblock_last_processed_block":{"block_hash":"b6a832eeb6a3a655c3196630f75585aea0f9cf7937f038af61a00fe8cd5ca1fd","block_index":2674400},"counterblock_ver":"1.4.2+mona001","counterparty-server":"OK","counterparty-server_caught_up":true,"counterparty-server_check_elapsed":0.030118465423583984,"counterparty-server_last_block":{"block_hash":"b6a832eeb6a3a655c3196630f75585aea0f9cf7937f038af61a00fe8cd5ca1fd","block_index":2674400,"block_time":1653718218,"difficulty":3945550.9642691817,"ledger_hash":"db0af1db66073f9042a2d4afcad9e20c8fc4ea8a3721d5207680f3226ba8858d","messages_hash":"acc14f03fdba46250a45f5663cbb86c79f3c539a6136c7ae64b469dd1a3b51e6","previous_block_hash":"faa858e9d9597855ee422c56544d3baa7edb9152baf8d8fe9c08775dcad004bd","txlist_hash":"41baf79144e6f010f40cc4e29c2a191ebd70355a1ca682ae49cf7f13ff9a221a"},"counterparty-server_last_message_index":2268056,"counterparty-server_ver":"9.5812.0"}

ちなみにhttps://mpchain.info/api/cpとやると以下のように怒られた。あ、そう。違うんだ。じゃあcounterParty APIもこのcbで叩くのかな? READMEにはそう書いてあるし。

{"error":"Method not found"}

mpchain APIドキュメントによるとhttps://mpchain.info/api/cbはHTTP POSTするAPIらしい。ブラウザのURL欄を叩くやり方はGETになるので、ちゃんとリクエストできていないのかもしれない。POSTとなると、引数を色々と渡す必要がありそうだ。実際、どうAPIを叩いているのか。ドキュメントをみてもわからんかった。どこに書いてあるのか見つけられなかった……。counterBlock APIcounterParty APIのほうも見たんだけどな。

mpurseコード・リーディング 🔗

ここから先はmpurseのソースコードをみることになりそう。まずは最初。mpurseのREADMEにあるmpurse#counterparty API。以下のように使う。

const cpParams = {address: 'MLinW5mA2Rnu7EjDQpnsrh6Z8APMBH6rAt'};
const unspentTxouts = await window.mpurse.counterParty('get_unspent_txouts', cpParams);

今回は私のトランザクション情報がほしいので、引数を以下のようにして実行する。

await window.mpurse.counterParty('search_raw_transactions', {address: 'MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu'});

その前提で、このmpurse#counterparty APIのコードを読んでみよう。

background.ts 🔗

とりあえずGitHubにアップされているソースコードをみてみる。ファイル名から適当にあたりをつける。WebAPIを叩くのだからbackgroundだろう。その中からcounterだのpartyだのでテキスト検索すると、それらしい部分をみつけた。

MpchainUtil.cpというメソッドを叩いているらしい。インポートをみるとMpchainUtil./util.mpchainファイルだそう。

import { MpchainUtil } from './util.mpchain';

util.mpchain.ts 🔗

util.mpchain.ts#L224cpメソッドがあった。今度こそcounterPartyの略に違いない。

  static cp(method: string, params: any): Promise<any> {
    if (!this.isObject(params)) {
      return Promise.reject({ error: 'Invalid argument' });
    }
    const cbParams = {
      method: method,
      params: params
    };
    return this.cb('proxy_to_counterpartyd', cbParams);
  }

cbメソッドを呼んでいる。すぐ上のutil.mpchain.ts#L209にあった。

  // counterblock
  static cb(method: string, params: any): Promise<any> {
    if (!this.isObject(params)) {
      return Promise.reject({ error: 'Invalid argument' });
    }
    const postParams = {
      jsonrpc: '2.0',
      id: 0,
      method: method,
      params: params
    };
    return this.httpPost('cb/', JSON.stringify(postParams)).then(
      result => new Promise((resolve): void => resolve(result.result))
    );
  }

https://mpchain.info/api/cb APIをPOSTしている。引数は次の通り。

{
    jsonrpc: '2.0',
    id: 0,
    method: method, // 'proxy_to_counterpartyd'
    params: params  // ?
};

paramsの値は以下のようになる。こいつらはmpurse#counterpartyAPIの第一、第二引数だ。

{
      method: 'search_raw_transactions',
      params: {address: 'MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu'}
};

あとはこれをHTTP POSTしているだけみたい。取り急ぎ、シェルコマンドでPOSTしてみた。

curl -X POST -H "Content-Type: application/json" -d '{"id":0,"jsonrpc":"2.0","method":"proxy_to_counterpartyd","params":{"method":"search_raw_transactions", "params":{"address":"MLinW5mA2Rnu7EjDQpnsrh6Z8APMBH6rAt"}}}' https://mpchain.info/api/cb/

するとトランザクションの情報がJSONデータとして返ってきた!

キタ━━━━(゚∀゚)━━━━!!

大成功!

レスポンスの内容は前回と同じなので省略。

まとめ 🔗

取引データであるトランザクション情報を取得する生APIは以下である。

  • POST: https://mpchain.info/api/cb/

渡すパラメータは以下の通り。

{
    "id": 0,
    "jsonrpc": "2.0",
    "method": "proxy_to_counterpartyd",
    "params": {
        "method": "search_raw_transactions", 
        "params": {
            "address": "MLinW5mA2Rnu7EjDQpnsrh6Z8APMBH6rAt"
        }
    }
}

シェルのcurlコマンドで叩くなら以下。

curl -X POST -H "Content-Type: application/json" -d '{"id":0,"jsonrpc":"2.0","method":"proxy_to_counterpartyd","params":{"method":"search_raw_transactions", "params":{"address":"MLinW5mA2Rnu7EjDQpnsrh6Z8APMBH6rAt"}}}' https://mpchain.info/api/cb/

あとはJavaScriptでこれと同じ内容をPOSTすれば、mpurseを介さずともトランザクション情報をゲットできるはず! やったね!

mpurseに依存しなくなれば、mpurseをインストールする必要なくトランザクション情報をゲットできるぜ! 自由だ! これでHTTPSでなくても叩けr……いやムリか。CORSエラーになりそう。まあいい、とりあえず一皮むけた。たぶん、なんか、いいことがあるはず。そう思いたい。