仮想通貨NEM 触って楽しいAPIのお話
はじめに
仮想通貨NEMにはAPIと呼ばれる機能がついており、それによって誰でも簡単にブロックチェーンの力を得ることが出来る。今回はそのことについて書く。
APIとは
そもそもAPIとは何なのか。
APIとは、「アプリケーション・プログラミング・インターフェース(Application Programming Interface)」の略で、本来の意味としてはソフトウェア同士がデータをやり取りするための窓口とそれを使うための取説、仕様全般を指すのだが、取引所やツイッターなどで目にするAPIは意味がすこし狭くなっていて、「インターネットを通じてサーバーとデータのやり取りをする為の窓口」だと思えば良い。
APIを利用することで得られる恩恵は何か。例えば取引所であれば、通常ブラウザを使って取引所にログイン後、手動で売り買いをしなくてはいけないところ、APIを利用することで、ブラウザを使わなくても取引所のサーバーと直接データのやり取りが可能になり、自作のソフトを作って取引することや、さらには自動で売買を行うプログラムを作ってプログラムに売買を任せることが出来るようになる。
NEMのAPI
では、NEMのAPIでは何が出来るのか。基本的にNEMに出来ることはAPIで何でも出来る。聞くより使ってみたほうが早いと思うので実際に使ってみよう。
【下のいずれかのURLをクリック!(別窓開きます)】
http://45.76.107.205:7890/heartbeat
http://153.122.13.168:7890/heartbeat
http://160.16.181.49:7890/heartbeat
クリックすると、下記のようななんだか良く分からない記号と英数字の羅列が出てきたのではないだろうか。(出てこなかったら通信失敗。別のURLを試そう)
{"code":1,"type":2,"message":"ok"}
で、このURLと謎の記号と英数字の羅列は何なんだという話だが、まず、URLについて、一番上のURLを使って解説しよう。
URL構造
これはNEMではなくてウェブの話になるが、URLをクリックするということは、下記のリクエストをインターネットに送ったということを意味する。
これを役所の手続きで例えるとこんな感じになる。
今回のリクエストでは45.76.107.205の住所にあるノードの7890番の窓口にハードビートリクエストを送ったことになる。
ハートビートリクエスト
では送った"ハートビートリクエスト"とは何か?ハートビートを直訳すると「心臓の鼓動」で、このハートビートリクエストではリクエスト先のノードが生きているか、死んでいるか(サーバーがダウンしていないか)確認するためにある。
リクエストを送ってノードから返ってきた答えは次のように読むことが出来る。
code:1が何を示すのか、などは、APIリファレンス(APIの取説)を読むとわかる。
(APIリファレンス(英文):http://bob.nem.ninja/docs/)
何となくイメージが掴めただろうか?やっていることはAPIで定められたフォーマットでリクエストを送って、その返信を受け取る作業だ。まさに役所の手続きのようなもの。
手続きの一覧(利用可なリクエストやリクエストを送る時のフォーマットなど)はAPIリファレンスに載っている。
アドレスの中身を確認するリクエスト
では続いて、アドレスの中身を確認するリクエストを送ってみよう。
今回は「NB7J657L7TBNKXOGXQJVP5VEKQODTDZORPW3ZF3Y」のアドレスの中身を覗いてみる。NEMのブロックチェーンは公開台帳なので、誰でもその中身を覗くことが出来る。
【下のいずれかのURLをクリック!(別窓開きます)】
http://45.76.107.205:7890/account/get?address=NB7J657L7TBNKXOGXQJVP5VEKQODTDZORPW3ZF3Y
http://153.122.13.168:7890/account/get?address=NB7J657L7TBNKXOGXQJVP5VEKQODTDZORPW3ZF3Y
http://160.16.181.49:7890/account/get?address=NB7J657L7TBNKXOGXQJVP5VEKQODTDZORPW3ZF3Y
正常に通信ができていてば、以下のように画面に表示されているはず。
{"meta":{"cosignatories":[],"cosignatoryOf":[],"status":"LOCKED","remoteStatus":"REMOTE"},"account":{"address":"NB7J657L7TBNKXOGXQJVP5VEKQODTDZORPW3ZF3Y","harvestedBlocks":0,"balance":0,"importance":0.0,"vestedBalance":0,"publicKey":"5b82a2d4eb135875465c977adad22260e5c7bd62051709a3d1dedc1809a8057c","label":null,"multisigInfo":{}}}
さっきのハートビートリクエストよりも複雑だが、基本的には読み方は同じだ。各ステータスの結果の意味はリファレンスを見ながら読んでいくことになる。
各ステータスが示す細かい話は置いていおて、とりあえずこのアカウントにどれだけのxemが入っているかを確認するには、次の場所を確認すれば良い。
{"meta":{"cosignatories":[],"cosignatoryOf":[],"status":"LOCKED","remoteStatus":"REMOTE"},"account":{"address":"NB7J657L7TBNKXOGXQJVP5VEKQODTDZORPW3ZF3Y","harvestedBlocks":0,"balance":0,"importance":0.0,"vestedBalance":0,"publicKey":"5b82a2d4eb135875465c977adad22260e5c7bd62051709a3d1dedc1809a8057c","label":null,"multisigInfo":{}}}
balanceステータスがこのアドレスに含まれるxemを示す。それによると、NB7J657L7TBNKXOGXQJVP5VEKQODTDZORPW3ZF3Yに入っているxemは0であることがわかる。
ちなみに、他のアドレス(例えば自分が管理しているアドレス)を覗いてみたい場合は…
http://45.76.107.205:7890/account/get?address=NB7J657L7TBNKXOGXQJVP5VEKQODTDZORPW3ZF3Y
上記の着色部分がアドレスを指定する部分になっているので、そこを自分が管理するアドレスに書き換えれば良い。
駆け足になったが、APIで出来ることが理解できただろうか?この他にも、トランザクションの生成(送金)なども出来るが、処理が複雑なのでここでは紹介しない。気になればAPIリファレンスを読みながら試してみると良いだろう。
API機能はNEMだけにしか無いのか
便利なAPI機能だが、ではビットコインやライトコイン、モナコインなどの標準クライアントには付いていないのか。
実は、ビットコインなどにもAPI機能は付いている。そのため、やろうと思えば上記で示したようなことをビットコインで再現することも可能だ。だが、ビットコインではセキュリティの観点から基本的に得体の知れない外部からのリクエストにAPIが応えるべきではないとしている。
そのため、通常ビットコインなどを利用したサービスは下のような体制をとることになる。
だが、外部からのAPIアクセスを認めたNEMでは、下のような体制を取ることが出来る。
これが何を意味するのかというと、クライアント側だけを作ってブロックチェーンを利用したアプリを作ることが出来ることを意味する。しかも、自分でいくつもノードを建てなくても単一障害点のないアプリを作ることが出来る。
(その代表的な例がNanoWalletになる)
APIを利用する上で参考となる外部リンク
■NEMの説明書
APIリファレンスの和訳をしてくれている。
■Qiita&mijinフォーラム(takanobuさんの記事)
基本的なとろこから細かく解説してくれている。さらに、mijinフォーラムから実際にNEMのAPIを使用して作られた"NEMBook"を使ってみるとAPIのパワーを感じることが出来る。
■Qiita(him0さんの記事)
トランザクション生成について説明してくれている。
■kataribe(tadajamさんの記事)
この記事以外にもkataribe内で色々な記事がある。
最後に
簡単だが以上をNEMのAPIについての説明とする。「ボット」と呼ばれるような自動売買プログラムを簡単にでも作ったことがある人であればそれほど難しい話ではないと思う。触ってみても、アドレスに紐づくUTXOがどうだとかブロックチェーンの仕組みがどうだなどと考える必要もない。(NEMはそもそもUTXOではないけど…)非常に便利だと感じる。
しかしここで一点注意をしておきたいことがある。仕様変更についてだ。NEMではカタパルトによってその構造自体が変わる予定があるので、もしかしたら大きなAPIの仕様変更があるかも知れない。今からなにか作ろうと思っている方は注意が必要だ。
チャオ☆




