取得する方法を突き止めた。経緯も書き残す。

結論

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

mpurse API経由でmonaParty APIのsearch_raw_transactionsを実行する。アドレスを渡すと、そのアドレスの取引履歴を古い順にすべて取得する。

以下、経緯。

トランザクション取得サイト

HTMLで表示されるサイトを見つけました。

mpurseやAsk Mona 3.0のリンクで知りました。これで取引の内容を知ることができる。それはいいけど、これはHTML。自分で取引データをこねまわしたいときには不都合。スクレイピングすれば取得できそうだけど、そういう用途は想定していなさそうだし。勝手にやったらまずかったりするかもしれないし。JSONで欲しいし。なんか他の方法があるはず。これらのサイトはどうやって取得しているのか。

モナコインの取引情報はマイニングしている人たちが持っているらしい。それを引っ張ってきているはず。たぶん。そもそもモナコインの仕組みを理解していないからなぁ。そういうのは一旦すっとばして、APIで取得できるかどうかだけでも知りたいので調べてみる。

mpurse API で取得できないか?

mpurseでトランザクション情報を取得できないか調査してみた。GitHubにアップされたREADMEを読んでみると、Transactionと名のついたメソッドは2つあった。

けれど、たぶん目的のものとは違う。

私がほしいのは、アドレスを入れたらそのアドレスの取引トランザクション情報すべて取得できるもの。引数や戻り値をみると違うっぽい。txだのHashだの言われても何がなんやら。もしかしてsendAssetしたときの戻り値のことか? それって保存しとかなきゃいけなかったの? でも、トランザクション取得サイトでは一覧できている。一体どういう仕組みなんだ?

mpchain API で取得できない?

mpurse#mpchain APIでは取得できない。

これは本家mpchainのWebAPIのラッパと思われる。ようするに実体はmpchainのほう。mpurseのREADMEにもそのドキュメントへのリンクがあった。

mpchain APIをみてみる。一番下にTransactionというAPIがあった。

https://mpchain.info/api/tx/0

でもこれも、目的のものとは違う。引数や戻り値が違う。

ところで、txってトランザクションのことなのかな? URLの末尾にtx_indextx_hashってのが必要らしい。mpurse APIのsendAssetの戻り値がtxHashだから、それを使うのかな。けど、もう送っちゃったあとでそれを知るにはどうしたらいいの? トランザクション取得サイトでは、アドレスを入力したら表示されるのに。なにか手段があるはずだと思うのだか。

戻り値のJSON、MPMA.sends.quantityが送金された額、なのか? mpurse APIではamountって名前だったはずだが。

キーとなりそうな名前が大量にある。それぞれが何なのかチンプンカンプン。まあいい。今はスルーだ。わからないなりに読もう。

counterBlock API, counterParty API

結論からいうと、[counterPerty API][]でトランザクション情報を取得できた。順にみていく。

mpurseには以下のAPIがある。

mpurseのドキュメントからmpchainのドキュメントに行き、そこにあるCounterblock APIをみると[counterperty.io][]という名前でcounterBlock APIへのリンクが貼ってあった。たぶんmpchainは、counterBlock APIを使っている、のかな? わからん。Pertyなの? Blockなの? ていうか、そもそもPertyって何? Blockって何? counterって何? なんもわからんけど読みすすめる。

mpurse API→mpchain API→counterParty APIcounterBlock APIというように経由して実行するのだろう。ようするに実体はcounterParty APIcounterBlock APIのほうである。mpurseのそれらに対応するAPIは、ただそれを実行しやすくラップしただけっぽい。よってmpurseを経由せずとも生でAPIを叩くことができるはず。

アーキテクチャ

紛らわしいのだが、counterBlock APIcounterParty APIの2種類があるらしい。こいつらがそれぞれ何なのかはCounterparty Platform Architectureを読めば分かるらしい。みてみる。

https://raw.githubusercontent.com/CounterpartyXCP/Documentation/master/_images/platform_architecture.png

ええと、画像の左下にあるのがウォレット。私はmpurseを使ってアカウントを作った。たぶんそれのことだろう。で、そこからcounterBlock APIcounterParty API、を経て、Bitcoin Coreに至ると。

え、ビットコイン? モナコインでは使えないの? ビットコイン用なの? でもそれじゃ、なんでモナコインの所得量が取得できたmpchainのドキュメントにリンク貼ってあったんだ? たぶんモナコインでも使えるからだろう。そう信じて続けてみる。

Counterparty Platform Architectureの図や説明を読んでもいまいちわからんかった。結局BlockだのPertyだのってやつらは何なんだよ。名前から察するに、たぶんブロックチェーンとかいう技術に関わるのがcounterBlock APIなのだろう。counterParty APIのほうは知らん。マリオパーティ的な何か? これ以上はAPIをみてみるしかないか。

counterBlock API

mpchainのドキュメントにリンクされていたやつ。とりあえず目次であるTable of Contentsから名前をざっとみてみる。

  • core API
  • assets Module API
  • dex Module
  • betting Module
  • counterwallet Module
  • counterwallet_iofeeds Module
  • transaction_stats Module

assetだのdexだの、ちゃんとした意味は知らないんだけど、どこかで見たようなキーワードが散見される。

core APIのうちget_raw_transactionsというのがあった。引数にaddressがある! まさにこれが目的のブツっぽい!

get_raw_transactions(address, start_ts=None, end_ts=None, limit=500)

こいつを叩いてみよう。とりあえずmpurse API経由で実行してみる。mpurse APIの動作環境はHTTPSにアップロードした適当なページである必要があるっぽい。前に自分で作った以下のページを使おう。

このページでデベロッパツールを開き、コンソールで以下コードを実行する。

await window.mpurse.counterBlock('get_raw_transactions', {address: 'MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu'});

しばらく待つと、空の配列[]が返ってきた。あれ、ダメか。mpurseでパスワード入力し承認しても変わらず。チッ。次だ次。

counterParty API

counterParty APIのページでtransactionで文字列検索する。

ヒットした中から、それっぽいAPIをみつけた。

search_raw_transactions(address, unconfirmed=true)

これをmpurse API経由で実行してみる。先程と同じようにytyaruのプロフィールのページでデベロッパツールを開き、コンソールに以下コードを入力して実行してみた。

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

すると37件の配列がきた。この数はトランザクション件数と一致する。そのことはトランザクションを表示するサイトで確認した。

たぶんこれだろう。来たんじゃない? でもデータの内容がさっぱりだ。

とりあえず最初の要素をみてみる。voutに2つの配列がある。そのうち1つ目に私のアドレスがあり、2つ目にモナレッジ作者のらいう様のアドレスがあった。たぶんこれ、私が最初にモナレッジで記事を書いたあと、らいう様から投げ銭していただいたときの情報ではないだろうか。

{
    "blockhash": "b25e87ea736c39df3a51c032aefc558f0f6851a602cc57d21b3cb38fc3ec465f",
    "blocktime": 1652234061,
    "confirmations": 15678,
    "hash": "483aa8414711bb71246f355240cb4a79a5292d8b7b152caca8c985b0c6e6acd0",
    "height": 2658711,
    "hex": "010000000103804fe9ad11c4485fbdc3b025dd68a6c99ae7ccd19b9d63e641f5b6e24be9e1010000006b483045022100b18c83115da395e12791b717b32aff754865cac478bb4e72ddde0f0e6c28b28d0220716c20fcd5151e4aeb8c2f898b9735713a596ff8daac03d7169e207c2e4e6743012103aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3dffffffff02d03dcd06000000001976a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac6a4d1606000000001976a91413bd7f2032c935652371722ae6d987f2f8135aac88ac00000000",
    "locktime": 0,
    "size": 226,
    "time": 1652234061,
    "txid": "483aa8414711bb71246f355240cb4a79a5292d8b7b152caca8c985b0c6e6acd0",
    "version": 1,
    "vin": [
        {
            "scriptSig": {
                "asm": "3045022100b18c83115da395e12791b717b32aff754865cac478bb4e72ddde0f0e6c28b28d0220716c20fcd5151e4aeb8c2f898b9735713a596ff8daac03d7169e207c2e4e6743[ALL] 03aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3d",
                "hex": "483045022100b18c83115da395e12791b717b32aff754865cac478bb4e72ddde0f0e6c28b28d0220716c20fcd5151e4aeb8c2f898b9735713a596ff8daac03d7169e207c2e4e6743012103aedd2422519c7ea14e48116b571903c16d2b4657d4a3ffc0e35646cd7e53be3d"
            },
            "sequence": 4294967295,
            "txid": "e1e94be2b6f541e6639d9bd1cce79ac9a668dd25b0c3bd5f48c411ade94f8003",
            "vout": 1
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 1.14114
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "M9hY5XcC7MSD54DfqcEojiKm9QMgXeQhGK"
                ],
                "asm": "OP_DUP OP_HASH160 13bd7f2032c935652371722ae6d987f2f8135aac OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91413bd7f2032c935652371722ae6d987f2f8135aac88ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 1.02124906
        }
    ],
    "vsize": 226,
    "weight": 904
}

私のアドレスがあるオブジェクトにvalueがあって、1.14114がある。これはらいう様から投げ銭していただいた額と同じ。ということは?

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

これが取引情報でまちがいない!

でも、らいう様のアドレスがあるオブジェクトのvalueには1.02124906とある。これは何の値だろう? トランザクション手数料? にしては高いような。わからん。

ほかの取引データもみてみよう。

私が支払ったときのと思われるトランザクションも見つけた。voutの配列2つあるうち、1つ目に相手のアドレスがあり、valueには私が支払った額が入っていた。MHkDkfafPVGFEzNgzuqMAEBWGB8W4rokar0.1支払った。その金額には覚えがある。たぶんそうだ。けど、やはり2つ目のvalueは謎。

{
    "blockhash": "13c2a0db9e435d22fb896caddf5b27d99bf676ea5aca1dce5c29f042bbd10109",
    "blocktime": 1652849438,
    "confirmations": 9167,
    "hash": "7ad15ec4dc2fe3d50907f9f65258a1d16780d5550daf3819e24901d185e23be8",
    "height": 2665222,
    "hex": "01000000011b9429490f6099a2bed15df0699dbdb771db9784eaf29d016eab6b166645b9bd000000006b4830450221009f234c2f21eb0ae83bd39ec6bf314659934ec33af46827734d08a6a4d101cc350220216ab4ed837cd5a53162553ebd5ab7ae766a2049308ab61354b749c59c878c2e01210257026e027209836532c2cd7807c06e30a889d3cca51884686af8aa2aacafbc1effffffff0280969800000000001976a9146c0074207d4da225ca3248890c0167dfd6a90fa188ac869e3406000000001976a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac00000000",
    "locktime": 0,
    "size": 226,
    "time": 1652849438,
    "txid": "7ad15ec4dc2fe3d50907f9f65258a1d16780d5550daf3819e24901d185e23be8",
    "version": 1,
    "vin": [
        {
            "scriptSig": {
                "asm": "30450221009f234c2f21eb0ae83bd39ec6bf314659934ec33af46827734d08a6a4d101cc350220216ab4ed837cd5a53162553ebd5ab7ae766a2049308ab61354b749c59c878c2e[ALL] 0257026e027209836532c2cd7807c06e30a889d3cca51884686af8aa2aacafbc1e",
                "hex": "4830450221009f234c2f21eb0ae83bd39ec6bf314659934ec33af46827734d08a6a4d101cc350220216ab4ed837cd5a53162553ebd5ab7ae766a2049308ab61354b749c59c878c2e01210257026e027209836532c2cd7807c06e30a889d3cca51884686af8aa2aacafbc1e"
            },
            "sequence": 4294967295,
            "txid": "bdb94566166bab6e019df2ea8497db71b7bd9d69f05dd1bea299600f4929941b",
            "vout": 0
        }
    ],
    "vout": [
        {
            "n": 0,
            "scriptPubKey": {
                "addresses": [
                    "MHkDkfafPVGFEzNgzuqMAEBWGB8W4rokar"
                ],
                "asm": "OP_DUP OP_HASH160 6c0074207d4da225ca3248890c0167dfd6a90fa1 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a9146c0074207d4da225ca3248890c0167dfd6a90fa188ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 0.1
        },
        {
            "n": 1,
            "scriptPubKey": {
                "addresses": [
                    "MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu"
                ],
                "asm": "OP_DUP OP_HASH160 45fc13c9d3a0df34008291492c39e0efcdd220b8 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a91445fc13c9d3a0df34008291492c39e0efcdd220b888ac",
                "reqSigs": 1,
                "type": "pubkeyhash"
            },
            "value": 1.0411175
        }
    ],
    "vsize": 226,
    "weight": 904
}

とにかく、search_raw_transactionsでアドレスを渡せば、そのアドレスが行った取引の情報をゲットできることが判明した。mpurse経由なので以下のようになる。

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