はじめに
昨日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
でアクセス拒否します。
以下のような感じでプロキシで遮断できました。
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で実装されていて、ツール自体も面白いので、もう少しいじってみたいです。
次はプラグイン書いてみようかな。