Kekeの日記

エンジニア、読書なんでも

JSON-RPC1.0と2.0

この記事はBlockChain Advent Calendar 2017 15日目の記事となっています。

非情報系の3年生なので、技術的に説明不足なことがあったらすみません。

招待制のウォレットを作ったので紹介させていただきます。 これは実験的に招待制にしたので、意味があるかないかはわかりません。

こちらがバランス確認ページです。

f:id:bobchan1915:20171215122514p:plain

そしてこちらが招待された場合のメールです。

f:id:bobchan1915:20171215122724p:plain

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:識別子

があるだけです。識別子があるのはどのリクエストに対してのレスポンス化を明確にするためです。

これを叩くと

{"jsonrpc": "2.0", "result": 19, "id": 3}

のようなresponseが返ってきます。

これは以下のような仕様になっています。

  • jsonrpc: バージョンを指定(bitcoindの最新は1.0)
  • result: レスポンスのjson
  • id:識別子

なぜ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と比較して

  • jsonrpc:2.0といったようなバージョン指定がない
  • paramsは必須。2.0では無視可能.

などの特徴があります。 この規格にBitcoinは対応しているのです。

まとめ

JSON-RPCとは - POSTメソッドでmethodをJSONの中に組み込んで実行するもの - リモートでメソッドを実行できるので、RESTに従う必要がなくなる - JSONをHTTPリクエストで飛ばすところが非常に軽い実装になる

以上の理由より推奨されます。