はじめに
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-proxy
、ethereum-proxy
、substrate-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
をオプションとして渡してあげるとエラーがでなくなります。
ただこの場合はどのように動作しているかがよくわからず
プロキシがHTTPもWebsocketもどちらも吸収してくれてたので、特に--upstream-ws
オプションは指定しなくても問題ないはずです。
以下のjsonrpc-proxyリポジトリのイメージ図を見ると動作がわかりやすいと思うのですが、先に書いた通りproxyとupstreamの通信はWebsocketだけなので、このオプションを指定して、エラーがでないようにしておく必要があります。
あとはDappからWeb3なプロバイダを指定する箇所をhttp://127.0.0.1:9934
やws://127.0.0.1:9945
にすればいい感じに動きます。
おわりに
キャッシュコントロールとかもできるみたいなので、次回あればそのあたりも探ってみます。