1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

hhattoのひとりアドベントカレンダーAdvent Calendar 2021

Day 14

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

Last updated at Posted at 2021-12-14

はじめに

Web3なDappを開発している時にローカル環境にEthereumノード(geth)を立ててテストすると思います。
ローカルのノード使うと割とサクサク開発できて、InfuraとかAlchemyとかのリクエスト数も気にする必要がなくなるので、いい感じです。
EthereumノードとHTTPなJSON-RPCでやり取りする箇所をさらにキャッシュとかしてもっとキビキビ動かないかなぁと思ったので、jsonrpc-proxyを試してみることにしました。

ちなみにこのツールが存在することを知ったのは、お手伝いさせていただいてる会社のCTOが共有してくれたのがきっかけでして、この方Web3な知識から金融の知識、デザインまわりも出来て無敵な感じな人です。すごいなぁと尊敬してます。
おれもさらに頑張らねば。

ちょっと脱線しましたが、さっそく試してみます。

環境

Rust 1.57 stable
MacOSX 11.6 (Intel Mac)
Geth (Go Ethereum) 1.10.13-stable

準備

gethのインストールは省略。
他にたくさん記事ありそうなので。

jsonrpc-proxyのインストール。

$ git clone https://github.com/tomusdrw/jsonrpc-proxy.git
$ cd jsonrpc-proxy
$ cargo build --release

virtual manifestの複数プロジェクトっぽいので、ビルドだけして./target/release/配下に作成されたバイナリをそのまま使います。

rpc-proxyethereum-proxysubstrate-proxyがあって、今回はethereum-proxyを使う。
substrate用もあるのね。いいね。Substrate用もどこかで試したい。

使い方

geth起動は参考まで。

$ geth --config geth.conf --syncmode fast --http --http.corsdomain '*' --http.api personal,eth,net,web3 --ws --ws.api personal
,eth,net,web3

geth.conf は特に特別なことはしていません。

proxy->gethはWebsocketで接続するので、Websocketの設定が必須です。
ポートはデフォルトのままなので、それぞれ8546。

そして、jsonrpc-proxy起動してみます。

$ ./target/release/ethereum-proxy --http-cors all --websockets-origins all
[WS] Connecting to: "ws://127.0.0.1:9944/"
WS listening on 127.0.0.1:9945
[2021-12-14T11:26:13Z ERROR ws_upstream] WebSocketError: "IoError(Os { code: 61, kind: ConnectionRefused, message: \"Connection refused\" })"
HTTP listening on 127.0.0.1:9934
TCP listening on 127.0.0.1:9955
IPC listening at ./jsonrpc.ipc

CORS突破するために、 --http-cors allオプションと --websockets-origins allオプションを付与しています。

HTTP用のプロキシはhttp://127.0.0.1:9934に、Websocket用のプロキシはws://127.0.0.1:9945にそれぞれアクセスすればOKです。

WebSocketError が表示されているのですが、これはupstream(geth)側のWebsocket用バインドアドレスがgethと不一致になってるので、エラー出力されています。
gethのWebsocket用のアドレスはws://127.0.0.1:8546なので、 --upstream-ws ws://127.0.0.1:8546をオプションとして渡してあげるとエラーがでなくなります。
ただこの場合はどのように動作しているかがよくわからず :sweat_smile:
プロキシがHTTPもWebsocketもどちらも吸収してくれてたので、特に--upstream-wsオプションは指定しなくても問題ないはずです。

以下のjsonrpc-proxyリポジトリのイメージ図を見ると動作がわかりやすいと思うのですが、先に書いた通りproxyとupstreamの通信はWebsocketだけなので、このオプションを指定して、エラーがでないようにしておく必要があります。

あとはDappからWeb3なプロバイダを指定する箇所をhttp://127.0.0.1:9934ws://127.0.0.1:9945にすればいい感じに動きます。

おわりに

キャッシュコントロールとかもできるみたいなので、次回あればそのあたりも探ってみます。

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?