gethとjsonrpc-proxyを組み合わせて使う その2

## はじめに

https://qiita.com/hhatto/items/a80274d9ec46eb9a098f

昨日jsonrpc-proxy導入を行いましたが、もう少し使ってみます。

[jsonrpc-proxyのexamplesディレクトリ](https://github.com/tomusdrw/jsonrpc-proxy/tree/master/examples)にいくつか設定例があるので、それを動かしてみます。

## 権限設定

`--permissioning-config` で実行権限の設定が可能です。

`examples/permissions.json` に例があって、少し修正して動作を確認してみます。

```diff
diff --git a/examples/permissions.json b/examples/permissions.json
index 8a9146f..7dad609 100644
--- a/examples/permissions.json
+++ b/examples/permissions.json
@@ -1,9 +1,9 @@
 {
-  "policy": "deny",
+  "policy": "allow",
   "methods": [
     {
-      "name": "state_getStorage",
-      "policy": "allow"
+      "name": "eth_chainId",
+      "policy": "deny"
     }
   ]
 }
```

デフォルトポリシーを `allow` で許可して、`eth_chainId`メソッドだけ`deny`でアクセス拒否します。

以下のような感じでプロキシで遮断できました。

![permission-request.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1775/ba1a1fb6-32c9-2614-25ab-2a98c60b9f5e.png)

![permission-response.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1775/711cec79-96e0-f804-d5f0-73e052cd7153.png)

Ethereumメソッドレベルだと実用だと使えるかな。。？用途が今のところ見えないかな。
アドレスまで見れると、特定のアドレスのアクセスは弾いちゃうとかで使えそう。

## キャッシュ

設定は `--simple-cache-config` オプションでファイルを指定して使います。
設定例が `examples/simple-cache.json`にあるので、それを少し変更して使ってみます。

https://github.com/tomusdrw/jsonrpc-proxy/blob/master/examples/cache.json

```diff
diff --git a/examples/cache.json b/examples/cache.json
index 31a4c1c..17f5701 100644
--- a/examples/cache.json
+++ b/examples/cache.json
@@ -2,7 +2,7 @@
   "enabled": true,
   "methods": [
     {
-      "name": "chain_getBlock",
+      "name": "eth_call",
       "eviction": {
         "time": {
           "secs": 50000,
```

DAppでよく使うであろう`eth_call`メソッドをキャッシュしてみます。

ソースコードを見ると、`eth_call`のパラメータをハッシュ化してキャッシュするので、単純に`eth_call`ではなくパラメータの違いでキャッシュできるので、結構使えそうです。

https://github.com/tomusdrw/jsonrpc-proxy/blob/6e870761e01c3ec4878cbd12ebf899b5b45ebc00/plugins/simple-cache/src/lib.rs#L167

キャッシュがヒットしたかどうかわからないので、`ethereum-proxy`のソースコードに変更を加えてみます。

```diff
diff --git a/plugins/simple-cache/src/lib.rs b/plugins/simple-cache/src/lib.rs
index 55c6cca..511f69b 100644
--- a/plugins/simple-cache/src/lib.rs
+++ b/plugins/simple-cache/src/lib.rs
@@ -167,6 +167,7 @@ impl<M: rpc::Metadata> rpc::Middleware<M> for Middleware {
                     let hash = method.hash(params);
                     if let Some((result, meta)) = self.cached.read().get(&hash) {
                         if method.is_fresh(meta) {
+                            println!("hit!! {:?}", params);
                             Action::Return(result.clone())
                         } else {
                             Action::NextAndCache(hash, method.meta())
```

で、動かすと以下のような感じでキャッシュヒットしたときにログ出力されました。

```shell-session
$ ./target/release/ethereum-proxy --http-cors all --websockets-origins all --upstream-ws ws://127.0.0.1:8546 --simple-cache-config examples/cache.json
[WS] Connecting to: "ws://127.0.0.1:8546/"
WS listening on 127.0.0.1:9945
HTTP listening on 127.0.0.1:9934
TCP listening on 127.0.0.1:9955
IPC listening at ./jsonrpc.ipc
hit!! Array([Object({"data": String("0xaa5dcecc"), "to": String("0x1d415aa39d647834786eb9b5a333a50e9935b796")}), String("latest")])
hit!! Array([Object({"data": String("0x0166eab3"), "to": String("0x1d415aa39d647834786eb9b5a333a50e9935b796")}), String("latest")])
```

これは結構使えそう!!

## おわりに

割と使えそうだなと実感しました。
Rustで実装されていて、ツール自体も面白いので、もう少しいじってみたいです。
次はプラグイン書いてみようかな。