結論: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 APIやcounterParty 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#L224にcp
メソッドがあった。今度こそ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エラーになりそう。まあいい、とりあえず一皮むけた。たぶん、なんか、いいことがあるはず。そう思いたい。