LoginSignup
1
0

More than 1 year has passed since last update.

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

Posted at

はじめに

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

jsonrpc-proxyのexamplesディレクトリにいくつか設定例があるので、それを動かしてみます。

権限設定

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

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

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

permission-response.png

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

キャッシュ

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

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ではなくパラメータの違いでキャッシュできるので、結構使えそうです。

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

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())

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

$ ./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で実装されていて、ツール自体も面白いので、もう少しいじってみたいです。
次はプラグイン書いてみようかな。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0