[Ethereum]curlでアカウントの値を取得する
はじめに
EthereumのDapp開発について勉強しながら色々試しています。
json-rpcを使用するとローカル環境からEthereumノードにアクセスすることが出来たので、その方法を残しておきます。
概要
- HTTP-RPCを有効化する
- JSONデータを作成する
- curlでEthereumノードにデータをPOSTする
- Ethereumノードからの値を受け取る
JSON RPC APIとは
公式によると、JSON形式で記述するステートレスかつ軽量なRPC(Remote Procedure Call)プロトコルで、HTTPやSocket等で使用することが可能。
HTTPプロトコルのPOSTメソッドでJSON形式のリクエストを送信し、同じくJSON形式のレスポンスを受け取る。
{"jsonrpc": "2.0", "method": "", "params": "", "id": ""}
{"jsonrpc":"2.0","id":"","result":""}
このようにJSON形式のデータを送受信する。
詳しくは下記公式を参照。
HTTP-RPCを有効にする
ローカル環境からEthereumノードのアカウントにアクセスするにはHTTP-RPCサーバーを有効にしておく必要がある。
Geth起動時に --rpcオプションを指定することでHTTP-RPCサーバーが有効になる。
$ 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コンソールでの
> eth.getBalance(eth.accounts[0])
に相当する処理。
JSONデータの作成
json-rpcの仕様に従い、ブロックパラメーターは eth_getBalance を使用する。
{"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する。
$ 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も指定してあげないとエラーが表示されたのでヘッダーに指定しています。
{"jsonrpc":"2.0","id":"2","result":"0x194312237619664600"}
レスポンスは成功なら"result"に値が格納されて返ってきます。
返ってきた値は16進数表記になっているので、10進数表記に修正。
0x194312237619664600 → 466001566183000000000
アカウント(0x9f9d52e422572aef077fa89ad9ef55044305ae4c)は
466001566183000000000weiを所持している模様。
gethコンソールで確認
それでは実際にgethコンソールでgetBalance()を実行した値と比較して確認してみる。
> eth.getBalance(eth.accounts[0])
466001566183000000000
同じ値が返ってきているので成功です。
curlでEthereumノードのアカウントにアクセスすることが出来ました。
おわりに
次回はjson-rpcを使いスマートコントラクトへのcallを試してみます。
記事内で間違えている箇所やお気付きの点があればご指摘いただければありがたいです。
参考サイト
今回json-rpcを使用するにあたり下記サイトを参考にさせていただきました。
ありがとうございます。
Author And Source
この問題について([Ethereum]curlでアカウントの値を取得する), 我々は、より多くの情報をここで見つけました https://qiita.com/y_kitchens/items/7df48bb2bf438200d983著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .