[Ethereum]curlでアカウントの値を取得する


はじめに

EthereumのDapp開発について勉強しながら色々試しています。
json-rpcを使用するとローカル環境からEthereumノードにアクセスすることが出来たので、その方法を残しておきます。

概要

  1. HTTP-RPCを有効化する
  2. JSONデータを作成する
  3. curlでEthereumノードにデータをPOSTする
  4. Ethereumノードからの値を受け取る

JSON RPC APIとは

公式によると、JSON形式で記述するステートレスかつ軽量なRPC(Remote Procedure Call)プロトコルで、HTTPやSocket等で使用することが可能。
HTTPプロトコルのPOSTメソッドでJSON形式のリクエストを送信し、同じくJSON形式のレスポンスを受け取る。

request
{"jsonrpc": "2.0", "method": "", "params": "", "id": ""}
response
{"jsonrpc":"2.0","id":"","result":""}

このようにJSON形式のデータを送受信する。
詳しくは下記公式を参照。

HTTP-RPCを有効にする

ローカル環境からEthereumノードのアカウントにアクセスするにはHTTP-RPCサーバーを有効にしておく必要がある。
Geth起動時に --rpcオプションを指定することでHTTP-RPCサーバーが有効になる。

bash
$ geth --networkid "20" --nodiscover --rpc --rpcaddr "localhost" --rpcport "8545" --rpcapi "eth,net,web3,personal,miner,admin" --datadir /work console 2>> /work/geth.log

・--rpc: HTTP-RPCサーバーを有効にする
・--rpcaddr: エンドポイントのホストアドレス。デフォルトは"localhost"
・--rpcport: エンドポイントのポート番号。デフォルトは8545
・--rpcapi: APIで受け付けるHTTP-RPCインターフェースの種類
詳しくは https://eth.wiki/json-rpc/API

EOAの所持etherを確認してみる

今回はEOAの所持ether確認のリクエストを送ってレスポンスが返ってくるか試してみる。
gethコンソールでの

geth
> eth.getBalance(eth.accounts[0])

に相当する処理。

JSONデータの作成

json-rpcの仕様に従い、ブロックパラメーターは eth_getBalance を使用する。

json-rpc
{"jsonrpc": "2.0", "method": "eth_getBalance", "params": ["0x9f9d52e422572aef077fa89ad9ef55044305ae4c", "latest"], "id": "2"}

"params"にはリスト形式で確認したいアカウントアドレスとオプションを記載する。
"id"はリクエストとレスポンスを紐付けるための値(任意)を記載する。
詳細は https://eth.wiki/json-rpc/API

curlでJSONデータをPOSTする

次にcurlコマンドでこのJSONデータをPOSTする。

request
$ curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_getBalance", "params": ["0x9f9d52e422572aef077fa89ad9ef55044305ae4c", "latest"], "id": "2"}' http://localhost:8545

※参考サイトではcontent-typeの指定はされていませんでしたが僕の環境ではcontent-typeも指定してあげないとエラーが表示されたのでヘッダーに指定しています。

response
{"jsonrpc":"2.0","id":"2","result":"0x194312237619664600"}

レスポンスは成功なら"result"に値が格納されて返ってきます。
返ってきた値は16進数表記になっているので、10進数表記に修正。
0x194312237619664600 → 466001566183000000000
アカウント(0x9f9d52e422572aef077fa89ad9ef55044305ae4c)は
466001566183000000000weiを所持している模様。

gethコンソールで確認

それでは実際にgethコンソールでgetBalance()を実行した値と比較して確認してみる。

geth
> eth.getBalance(eth.accounts[0])
466001566183000000000

同じ値が返ってきているので成功です。
curlでEthereumノードのアカウントにアクセスすることが出来ました。

おわりに

次回はjson-rpcを使いスマートコントラクトへのcallを試してみます。
記事内で間違えている箇所やお気付きの点があればご指摘いただければありがたいです。

参考サイト

今回json-rpcを使用するにあたり下記サイトを参考にさせていただきました。
ありがとうございます。

EthereumノードにJSON-RPC API経由でアクセスする

[Ethereum] スマートコントラクトを呼び出してみよう(call編)