JavaクライアントからJsonでEtherumにアクセス

さて、Etherumでいろいろ動いてきたのでJavaのアプリとの接続をやってみる。
とりあえずはシンプルなJavaクライアントでGethにアクセスしてみます。

gethのRCP呼び出し方を調べる

まずたたくメソッド決めましょう。
とりあえずはJSON RPC API Referenceの中でも一番代表的な「web3_clientVersion」をたたいてみることにします。
JSON RPC · ethereum/wiki Wiki · GitHub

パラメータは上記に詳しく書いてありますが、
送信データ

  • jsonrpc:apiversion
  • method-web3_clientVersion
  • params:なし
  • id:任意の数字

レスポンスデータ

  • jsonrpc:apiversion
  • id:任意の数字
  • result:API結果

といったものが帰ってくる。

サンプルに従ってコマンドでたたくとこんな感じですね

curl -X POST http://192.168.56.101:8545 --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'

{"id":67,"jsonrpc":"2.0","result":"Geth/v1.4.0-unstable/linux/go1.5.1"}

動いているようですね。
あ、もちろんですが、これをたたく前にgethをRPC有で起動しておきましょう。
起動方法について詳しくは以下に記載しています。
garapon.hatenablog.com


JsonClientの作成

とにかく簡単に作りたいので、クライアントにはjersey、JSON関連の処理はJSONICを使う事にしました。

gradleに以下を設定して

    compile 'org.apache.httpcomponents:httpclient:4.5.1'
    compile 'com.sun.jersey:jersey-client:1.9.1'

以下のようなクライアントソースを書きます。
jerseyを使うとHTTPClientとかで書くより相当短くかけますね。
(SendDataは各SetterGetterを持っただけのVOです。JSONIC用に作っていますがMapとでもいいです)

package jp.co.gara;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import net.arnx.jsonic.JSON;

/**
 * Created by gara on 2015/12/22.
 */
public class JsonClient {
    public static void main(String[] args) {
        SendData data = new SendData();
        data.setId("56");
        data.setRpcVersion("2.0");
        data.setMethod("web3_clientVersion");
        String jsonText = JSON.encode(data);

        Client c = Client.create();
        WebResource resource = c.resource("http://192.168.56.101:8545/");
        String response = resource.accept("application/json").post(String.class, jsonText);
        System.out.println("SendData " + jsonText);
        System.out.println("Response " + response);
    }
}

接続

さて動かしてみると、、、

SendData {"id":"56","method":"web3_clientVersion","params":null,"rpcVersion":"2.0"}
Response {"id":"56","jsonrpc":"","result":"Geth/v1.4.0-unstable/linux/go1.5.1"}

できました!これで何でもやり放題になってきましたね。