この記事はBlockChain Advent Calendar 2017 15日目の記事となっています。
非情報系の3年生なので、技術的に説明不足なことがあったらすみません。
招待制のウォレットを作ったので紹介させていただきます。 これは実験的に招待制にしたので、意味があるかないかはわかりません。
こちらがバランス確認ページです。
そしてこちらが招待された場合のメールです。
JSON-RPCはブロックチェーン開発では非常に重要な反面、JSONで普段開発しなれているので、新たに開発しなくてはいけないのではないかと怖がっている人を多く見かけます。
今回は記事が冗長にならない範囲で、JSON-RPCパッケージを作ったときの「JSON-RPC」に思ったことをお話しします。
開発内容
今回、私が開発したのは以下の通りです。
- JSON-RPC1.0に対応したライブラリ
- Bitcoin nodeと通信するためのライブラリ
これらを開発するにあたってJSON-RPCを学ぶことができたのでまとめます。
JSONRPC2.0とは
JSONRPCの公式リファレンスはプロトコルの一種でRPC(Remote procedure call)の略です。 簡単にいうと遠隔からメソッドをサーバーで実行するものです。
例として以下のようなJSONRPCリクエストがあります。
{"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3}
具体的な仕様としては
jsonrpc
: バージョンを指定(最新は1.0)method
: 実行したいメソッドparams
:パラメータ。サーバーが要求する順番でないといけない。id
:識別子。これがないと通知(Notification)と見なされて何も返ってこない。
があるだけです。識別子があるのはどのリクエストに対してのレスポンス化を明確にするためです。
これを叩くと
{"jsonrpc": "2.0", "result": 19, "id": 3}
のようなresponseが返ってきます。
これは以下のような仕様になっています。
jsonrpc
: バージョンを指定(bitcoindの最新は1.0)result
: レスポンスのjsonid
:識別子。
なぜJSONRPC2.0を使うのか
JSONRPCを使うのには以下の理由があります。 - RESTfulなサーバーを立てる必要がない - エンドポイントが非常に透明性が保たれる - メソッドを実行できるため「したいことをできるようになる」 などと行ったようなメリットがあります。
RESTfulなサーバーを立てる必要がない
私自身、Railsや他のRESTfulを意識したフレームワークを使ったことはありますが、
GET /new POST /create GET /show ...
などと少し面倒です。どれがGET、POSTで、どんなエンドポイントに何をroutingしなくてはいけないのか、、、 考えるだけで面倒です。ならば、JSON-RPCを使うと非常に便利になるのです。 以下のようなメソッドを実装するだけで以下のように簡単に実装ができます。
Endpoint /user methods getName createUser updatePassword ...
{"jsonrpc": "2.0", "method": "getName", "params": {"user_id": 23}, "id": 3}
また、3回のリクエストが同時に来たとしましょう。
# Ayumiが {"jsonrpc": "2.0", "method": "getName", "params": {"user_id": 23}, "id": 1} # Kekeが {"jsonrpc": "2.0", "method": "getName", "params": {"user_id": 23}, "id": 2} # Tunakichiが {"jsonrpc": "2.0", "method": "getName", "params": {"user_id": 23}, "id": 3}
レスポンスが以下の順で返ってきました。しかしながら、識別子があるので、どのリクエストに対応するレスポンスかすぐ知ることができます。
{"jsonrpc": "2.0", "result": "Tunakichi", "id": 3} {"jsonrpc": "2.0", "result": "Ayumi", "id": 1} {"jsonrpc": "2.0", "result": "Keke", "id": 2}
非常に便利なんです。 JSON-RPCの歴史までも知りたい人はwikipediaをご参照ください。
JSON-RPC1.0とは
JSON-RPC1.0はJSON-RPC2.0と比較して
- 1.0には
jsonrpc:2.0
といったようなバージョン指定がない params
は必須。2.0では無視可能。
などの特徴があります。 この規格にBitcoinは対応しているのです。
まとめ
JSON-RPCとは - POSTメソッドでmethodをJSONの中に組み込んで実行するもの - リモートでメソッドを実行できるので、RESTに従う必要がなくなる - JSONをHTTPリクエストで飛ばすところが非常に軽い実装になる
以上の理由より推奨されます。