はじめに
『DApps開発入門』という本や色々記事を書いているかるでねです。
今回は、EthereumのRPCインターフェースを統一仕様として定義し、全てのクライアントとアプリで一貫した動作を実現する仕組みを提案しているERC1474についてまとめていきます!
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
他にも様々なEIPについてまとめています。
概要
ERC1474は、Ethereumノードが実装すべきリモートプロシージャコール(RPC)メソッドの標準的なセットを定義することを目的としています。 EthereumにおけるRPCとは、外部のアプリケーション(例えばウォレットやdApp)がノードと通信するためのインターフェースです。 RPCを通じて、アプリケーションはブロック情報を取得したり、トランザクションを送信したり、アカウント残高を確認したりといった操作が可能になります。
しかし現在、Ethereumノードを構成する各種クライアント(GethやNethermind、Erigonなど)は、それぞれ独自のRPCメソッドや応答形式を採用しており、開発者にとって一貫性のない環境となっています。 この状態は、アプリケーションの移植性や保守性を低下させ、開発コストの増大につながっています。
目的
ERC1474は、Ethereumノードに求められる基本的なRPCメソッドとその挙動を仕様として定義することで、次のような効果をもたらします。
- 予測可能な開発環境の提供
- どのクライアントを使用しても同じRPCメソッドが使えるようになり、開発者は一貫したインターフェースを前提にアプリケーションを構築できます。
- クライアント間の互換性向上
- 異なるクライアント間でも同様の動作が保証され、アプリケーションが特定のノード実装に依存しなくなります。
- 標準仕様としての基盤構築
- Ethereumエコシステム全体として、RPCインターフェースに関する明確な標準を持つことで、今後の拡張や改善が行いやすくなります。
このように、EthereumにおけるRPC仕様を標準化することは、エコシステムの成熟と開発者体験の向上に大きく貢献します。 開発者がノードの違いを意識せずに、安全かつ安定した通信を行うための基盤整備として、非常に重要な提案となっています。
仕様
JSON-RPCとは何か
Ethereumノードとの通信は、JSON-RPCという通信方式で行われます。 これは、HTTPやWebSocket上でJSON形式のデータを使って、リモート手続き呼び出し(RPC: Remote Procedure Call)を実現するための軽量なプロトコルです。
EthereumノードのすべてのRPCメソッドは、JSON-RPCの形式に従ってリクエスト・レスポンスを行わなければなりません。 つまり、呼び出す側はJSON-RPCのルールに沿ったリクエストを送り、ノードはそれに対して同じルールに沿ったレスポンスを返す必要があります。
エラーコードの仕様
RPC呼び出しでエラーが発生した場合、レスポンスには error フィールドが含まれ、エラー内容を示すコードとメッセージが記載されます。
標準エラー(RFCに由来)には次のようなものがあります。
-32700- JSONの解析に失敗した。
-32600- リクエスト形式が無効。
-32601- メソッドが存在しない。
-32602- パラメータが不正。
-32603- 内部エラー。
Ethereum独自のエラー(非標準)として、以下のようなものが定義されています。
-32000- 入力が無効。
-32001- リソースが見つからない。
-32003- トランザクションが拒否された。
-32005- リクエストが上限を超えた、など。
例えば、トランザクションが拒否された場合は以下のようなエラーが返ります。
{
"id": 1337,
"jsonrpc": "2.0",
"error": {
"code": -32003,
"message": "Transaction rejected"
}
}値のエンコーディング仕様
Ethereum RPCでは、値の表現方法に厳密なルールがあります。
Quantity型(数量値)
数量(例えばブロック番号やガス量)は、16進数で「0x」から始まる表記で、できるだけ短い形式で表現しなければなりません。
ゼロは必ず "0x0" と記述します。
例えば "0x00" や "0x0400" のように先頭にゼロを付けた形式は無効です。
Data型(バイナリデータ)
Data型も16進数で「0x」から始めますが、こちらは必ず1バイト(8ビット)ごとに2桁で記述します。
つまり "0x0" は無効で "0x00" が正しい表記です。
すべてのバイトは明示的に2桁の16進数で表されなければなりません。
ブロック識別子の指定方法
特定のブロックを対象とするRPCメソッド(例:eth_getBalance や eth_call)では、対象ブロックを識別するパラメータが必要です。
この識別子には「ブロック番号」または「ブロックハッシュ」を指定できます。
形式はEIP1898に基づいており、以下のようなJSONオブジェクトになります。
{ "blockNumber": "0x1a2b3c" }EIP1898については以下の記事を参考にしてください。
または
{ "blockHash": "0xabc123...", "requireCanonical": true }requireCanonical フィールドは、指定したブロックがチェーンの正当な履歴(canonical chain)に含まれていない場合にエラーとするかどうかを指定します。
ブロックが見つからなかった場合は、-32001(リソースが見つからない)エラーが推奨されます。
ハッシュで指定し、requireCanonical: true かつブロックが非正当である場合は、-32000(無効な入力)が推奨されます。
RPC仕様の更新手順
新しいRPCメソッドの提案や既存メソッドの変更は、Ethereumの標準化プロセスであるEIP(Ethereum Improvement Proposal)を通じて行われなければなりません。
提案が正式に仕様へ組み込まれるためには、まず「Draft(草案)」ステータスに達する必要があります。 この手順を踏むことで、Ethereum全体のRPC仕様に対する透明性と一貫性が保たれます。 これはEthereumコミュニティが合意形成を図るために不可欠なルールです。
メソッド
Ethereumノードは、JSON-RPCというプロトコルを通じて外部アプリケーションからのリクエストに応答します。
web3_sha3
任意のバイナリデータに対してKeccak-256ハッシュを計算します。
Solidityの keccak256 と同様です。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | ハッシュ対象のバイナリデータ(hexエンコード) |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | 計算されたKeccak-256のハッシュ値 |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "web3_sha3",
"params": ["0x68656c6c6f20776f726c64"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc94770007dda54cF92009BFF0dE90c06F603a09f"
}net_listening
ノードが現在、ピアからの新しい接続を受け入れているかどうかを判定します。
戻り値
| 型 | 説明 |
|---|---|
| {boolean} | 接続待受中であれば true、そうでなければ false |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "net_listening",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": true
}net_peerCount
現在接続されているピアノードの数を返します。
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | 接続されているピア数(16進数) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "net_peerCount",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x2"
}net_version
接続されているネットワークのチェーンID(文字列)を返します。
戻り値
| 型 | 説明 |
|---|---|
| {string} | チェーンID(例: "1", "3", "5" など) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "net_version",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "1"
}eth_accounts
ノードが管理しているアカウントアドレス一覧を返します。
戻り値
| 型 | 説明 |
|---|---|
| {Data[]} | 管理中のアドレス配列(hex) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_accounts",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f"]
}eth_blockNumber
ノードが最後に認識した最新ブロックの番号を返します。
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | 最新ブロック番号(16進数) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc94"
}eth_call
トランザクションをブロックチェーンに送信せずに、その結果を即時取得します(ステート変更なし)。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {object} | コール元、宛先、gas、value、dataなどの情報を含むオブジェクト |
| 2 | {string/Quantity/BlockIdentifier} | 対象ブロック識別子("latest", "pending" など) |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | 実行結果(戻り値) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_call",
"params": [{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}, "latest"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x"
}eth_estimateGas
トランザクションを実行するために必要なガス量を予測します。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {object} | トランザクション情報(from, to, gas, value, dataなど) |
| 2 | {string} | ブロック識別子("latest"など) |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | 推定ガス量(16進数) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_estimateGas",
"params": [{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x5208"
}承知しました。以下、指定された形式に従い、前回の続きとして他の代表的なJSON-RPCメソッドを同じ構成(見出し・パラメータ・戻り値・使用例)で記述します。
net_listening
ノードが新たなピアからの接続を受け付けている状態かどうかを判定します。
パラメータ
なし
戻り値
| 型 | 説明 |
|---|---|
| {boolean} | true ならリッスン中、false なら待機していない状態を示します。 |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "net_listening",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": true
}net_peerCount
現在ノードに接続されているピアノードの数を返します。
パラメータ
なし
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | 接続中のピア数(16進数で表現された整数) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "net_peerCount",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x2"
}net_version
現在ノードが接続されているEthereumネットワークのチェーンIDを返します。
パラメータ
なし
戻り値
| 型 | 説明 |
|---|---|
| {string} | チェーンID(例:"1"=mainnet, "3"=Ropsten) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "net_version",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "1"
}eth_accounts
ノードがローカルで管理しているアカウントアドレスを返します。
パラメータ
なし
戻り値
| 型 | 説明 |
|---|---|
| {Data[]} | 管理中のアドレスの配列(hex形式) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_accounts",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f"]
}eth_blockNumber
ノードが認識している最新ブロックの番号を返します。
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | 最新のブロック番号(16進数) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc94"
}eth_call
トランザクションをネットワークに送信せずに、即時にコントラクトの呼び出しを実行します。
ステートは変更されません(viewやpure関数の実行に相当します)。
パラメータ
| 番号 | 型 | 説明 | ||
|---|---|---|---|---|
| 1 | {object} | 呼び出し対象のトランザクション情報。以下のフィールドを含みます: - from({Data}, 任意)送信元アドレス - to({Data})呼び出し先のアドレス - gas({Quantity}, 任意)供給ガス量 - gasPrice({Quantity}, 任意)ガス単価 - value({Quantity}, 任意)ETHの送付額 - data({Data}, 任意)呼び出すメソッドと引数のエンコードデータ |
||
| 2 | {Quantity | string | Block Identifier} | 実行対象とするブロックの識別子(例:"latest") |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | 呼び出し結果(戻り値) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_call",
"params": [{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}, "latest"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x"
}eth_coinbase
このノードのcoinbaseアドレス(マイニング報酬を受け取るアカウント)を返します。
戻り値
| 型 | 説明 |
|---|---|
| {Data} | coinbaseアドレス(hex形式) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_coinbase",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc94770007dda54cF92009BFF0dE90c06F603a09f"
}eth_estimateGas
トランザクションの実行に必要なガス量を予測します。 実際の消費量とは異なる場合があります。
パラメータ
| 番号 | 型 | 説明(eth_callと同様の構成) |
|---|---|---|
| 1 | {object} | トランザクションオブジェクト(from, to, gas, value, data等) |
| 2 | {string} | ブロック識別子(例:"latest") |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | 必要なガス量(hex) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_estimateGas",
"params": [{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x5208"
}eth_gasPrice
現在のネットワークにおけるガス単価(wei単位)を返します。
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | 現在のガス価格(wei) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_gasPrice",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x09184e72a000"
}eth_getBalance
指定アドレスのETH残高(wei単位)を取得します。
パラメータ
| 番号 | 型 | 説明 | ||
|---|---|---|---|---|
| 1 | {Data} | 対象アドレス | ||
| 2 | {Quantity | string | Block Identifier} | ブロック識別子("latest" など) |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | アドレスのETH残高(wei) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f", "latest"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x0234c8a3397aab58"
}eth_getBlockByHash
ブロックハッシュに基づいてブロックの詳細情報を取得します。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | 対象ブロックのハッシュ |
| 2 | {boolean} | true ならトランザクションオブジェクト、false ならハッシュのみ |
戻り値
| 型 | 説明 | |
|---|---|---|
| {object | null} | ブロック情報(存在しない場合はnull) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getBlockByHash",
"params": [
"0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
true
]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"number": "0x1b4",
"hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"miner": "0x4e65fda2159562a496f9f3522f89122a3088497a",
"gasLimit": "0x9f759",
"gasUsed": "0x9f759",
"transactions": [],
"uncles": ["0x1606e5...", "0xd5145a9..."]
}
}eth_getBlockByNumber
ブロック番号で指定されたブロックの詳細情報を取得します。
パラメータ
| 番号 | 型 | 説明 | |
|---|---|---|---|
| 1 | {Quantity | string} | ブロック番号、または "latest"、"earliest"、"pending" のいずれか |
| 2 | {boolean} | true でトランザクションをオブジェクト形式、false でハッシュ形式 |
戻り値
| 型 | 説明 | |
|---|---|---|
| {object | null} | ブロック情報(存在しない場合は null) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getBlockByNumber",
"params": ["0x1b4", true]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"number": "0x1b4",
"hash": "0xe670ec64...",
"parentHash": "0x9646252b...",
"nonce": "0xe04d29...",
"sha3Uncles": "0x1dcc4d...",
"logsBloom": "0xe670ec...",
"transactionsRoot": "0x56e81f...",
"stateRoot": "0xd5855e...",
"receiptsRoot": "0x...",
"miner": "0x4e65fda2...",
"difficulty": "0x027f07",
"totalDifficulty": "0x027f07",
"extraData": "0x000000...",
"size": "0x027f07",
"gasLimit": "0x9f759",
"gasUsed": "0x9f759",
"timestamp": "0x54e34e8e",
"transactions": [],
"uncles": ["0x1606e5...", "0xd5145a9..."]
}
}eth_getBlockTransactionCountByHash
ブロックハッシュで指定されたブロックに含まれるトランザクション数を返します。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | ブロックのハッシュ |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | トランザクション数(16進数表現) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByHash",
"params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc"
}eth_getBlockTransactionCountByNumber
ブロック番号で指定されたブロックに含まれるトランザクション数を返します。
パラメータ
| 番号 | 型 | 説明 | |
|---|---|---|---|
| 1 | {Quantity | string} | ブロック番号、または "latest"、"earliest"、"pending" のいずれか |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | トランザクション数(16進数表現) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByNumber",
"params": ["0xe8"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xa"
}eth_getCode
指定されたアドレスにデプロイされたコントラクトコードを返します。
パラメータ
| 番号 | 型 | 説明 | ||
|---|---|---|---|---|
| 1 | {Data} | 対象アドレス | ||
| 2 | {Quantity | string | Block Identifier} | ブロック番号または識別子("latest" など) |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | 該当アドレスのコントラクトコード(hex形式) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getCode",
"params": ["0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", "0x2"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x600160008035811a818181146012578301005b..."
}eth_getFilterChanges
フィルターIDを元に、前回の取得以降に発生したログやブロック/トランザクションの変更を返します。
eth_newFilter によって作成されたフィルターの継続的なポーリングに使われます。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Quantity} | 対象のフィルターID(16進数) |
戻り値
| 型 | 説明 |
|---|---|
| {Array} または {Array} | フィルター種別に応じてログまたはトランザクション/ブロックハッシュ配列を返す |
eth_newFilterによるログフィルター →Array<Log>eth_newBlockFilter,eth_newPendingTransactionFilter→Array<Data>
Log オブジェクト構造
address- ログを出力したコントラクトアドレス。
blockHash- ログが含まれるブロックのハッシュ。
blockNumber- ログが含まれるブロック番号。
data- 非indexedな引数のデータ。
logIndex- ブロック内でのログの順序。
transactionHash- 発生元トランザクションのハッシュ。
transactionIndex- ブロック内でのトランザクションの順序。
topics- indexedされた引数に対応するトピック。
removed- チェーンから取り除かれた場合に
true。
- チェーンから取り除かれた場合に
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getFilterChanges",
"params": ["0x16"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": [{
"address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockNumber":"0x1b4",
"data":"0x0000000000000000000000000000000000000000000000000000000000000000",
"logIndex": "0x1",
"topics": [],
"transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
"transactionIndex": "0x0",
"removed": false
}]
}eth_getFilterLogs
指定されたフィルターIDに基づいて、これまでに記録されたすべてのログを取得します。
eth_getFilterChanges とは異なり、すべての履歴ログが返されます。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Quantity} | 対象のフィルターID |
戻り値
| 型 | 説明 |
|---|---|
| {Array} | フィルターに一致する全ログオブジェクト |
Logの構造はeth_getFilterChangesと同一です。
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getFilterLogs",
"params": ["0x16"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": [{
"address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockNumber":"0x1b4",
"data":"0x0000000000000000000000000000000000000000000000000000000000000000",
"logIndex": "0x1",
"topics": [],
"transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
"transactionIndex": "0x0",
"removed": false
}]
}eth_getLogs
任意の条件を指定してブロック範囲やアドレス、トピックなどにマッチするログを取得します。
eth_newFilter や eth_getFilterLogs よりも柔軟な使い方が可能です。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {object} | 以下のフィールドを含むフィルターオブジェクト |
フィルターオブジェクトのフィールド
fromBlock({Quantity|string}, 任意)- 開始ブロック番号または "latest" など。
toBlock({Quantity|string}, 任意)- 終了ブロック番号または "latest" など、
address({Data|Data[]}, 任意)- コントラクトアドレスまたはアドレス配列、
topics({Data[]}, 任意)- indexedログのトピック、
blockhash({Data}, 任意)- 特定ブロックのみに限定(この場合、fromBlock/toBlockは無視される)、
戻り値
| 型 | 説明 |
|---|---|
| {Array} | 条件に一致したログ |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getLogs",
"params": [{
"topics": ["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]
}]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": [{
"address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"blockNumber":"0x1b4",
"data":"0x0000000000000000000000000000000000000000000000000000000000000000",
"logIndex": "0x1",
"topics": [],
"transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
"transactionIndex": "0x0",
"removed": false
}]
}eth_getStorageAt
指定されたアドレスとストレージスロット(インデックス)に格納されている値を取得します。
Solidityでの mapping や状態変数の確認に使用されます。
パラメータ
| 番号 | 型 | 説明 | ||
|---|---|---|---|---|
| 1 | {Data} | 対象アドレス(hex形式) | ||
| 2 | {Quantity} | ストレージスロット(例: "0x0") |
||
| 3 | {Quantity | string | Block Identifier} | 対象ブロック(例: "latest") |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | 指定スロットのデータ値(hex形式) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getStorageAt",
"params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x00000000000000000000000000000000000000000000000000000000000004d2"
}eth_getTransactionCount
指定されたアドレスのnonce(そのアドレスがこれまでに送信したトランザクションの数)を取得します。
パラメータ
| 番号 | 型 | 説明 | ||
|---|---|---|---|---|
| 1 | {Data} | 対象アドレス(hex形式) | ||
| 2 | {Quantity | string | Block Identifier} | 対象ブロック(例: "latest") |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | トランザクションカウント(nonce) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getTransactionCount",
"params": ["0xc94770007dda54cF92009BFF0dE90c06F603a09f", "latest"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x3"
}eth_getTransactionByHash
指定されたトランザクションハッシュに対応するトランザクションの詳細を返します。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | トランザクションハッシュ |
戻り値
| 型 | 説明 | |
|---|---|---|
| {object | null} | トランザクション情報または null |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getTransactionByHash",
"params": ["0x9f1c62092a3e8b8c73c5ab658aef507f9eeea113267c74f84f49d3d1954273fc"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"blockHash": "0xe670ec64...",
"blockNumber": "0x1b4",
"from": "0x407d73d8a49eeb85d32cf465507dd71d507100c1",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"hash": "0x9f1c62...",
"input": "0x...",
"nonce": "0x15",
"to": "0x85f6a...",
"transactionIndex": "0x1",
"value": "0xf3dbb...",
"v": "0x1c",
"r": "0x5e1d3...",
"s": "0x7e3f5..."
}
}eth_getTransactionReceipt
トランザクションの実行結果(成功・失敗、Gas使用量、ログなど)を返します。トランザクションがマイニング済みである必要があります。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | トランザクションハッシュ |
戻り値
| 型 | 説明 | |
|---|---|---|
| {object | null} | レシート情報(存在しない場合は null) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getTransactionReceipt",
"params": ["0x9f1c62092a3e8b8c73c5ab658aef507f9eeea113267c74f84f49d3d1954273fc"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"blockHash": "0xe670ec64...",
"blockNumber": "0x1b4",
"contractAddress": null,
"cumulativeGasUsed": "0x33bc",
"from": "0x407d73d8a49eeb85d32cf465507dd71d507100c1",
"gasUsed": "0x4dc",
"logs": [],
"logsBloom": "0x00...",
"status": "0x1",
"to": "0x85f6a...",
"transactionHash": "0x9f1c62...",
"transactionIndex": "0x1"
}
}eth_getUncleByBlockHashAndIndex
ブロックハッシュとインデックスを指定して、そのブロックに含まれるアンクルブロック(uncle)の情報を取得します。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | 対象ブロックのハッシュ |
| 2 | {Quantity} | アンクルブロックのインデックス位置 |
戻り値
| 型 | 説明 | |
|---|---|---|
| {object | null} | アンクルブロックの詳細情報。存在しなければ null |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": ["0xc6ef2fc5...", "0x0"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"number": "0x1b4",
"miner": "0x4e65fda2...",
"difficulty": "0x027f07",
"gasUsed": "0x9f759",
...
}
}eth_getUncleByBlockNumberAndIndex
ブロック番号とインデックスを指定して、該当ブロック内のアンクルブロックの情報を取得します。
パラメータ
| 番号 | 型 | 説明 | |
|---|---|---|---|
| 1 | {Quantity | string} | ブロック番号または "latest" などの識別子 |
| 2 | {Quantity} | アンクルブロックのインデックス |
戻り値
| 型 | 説明 | |
|---|---|---|
| {object | null} | 該当するアンクルブロック情報。無ければ null |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockNumberAndIndex",
"params": ["0x29c", "0x0"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": {
"number": "0x1b4",
"miner": "0x4e65fda2...",
"gasLimit": "0x9f759",
...
}
}eth_getUncleCountByBlockHash
指定したブロックハッシュに含まれるアンクルブロックの数を返します。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | ブロックのハッシュ |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | アンクルブロックの数(16進数) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockHash",
"params": ["0xc9477000..."]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xc"
}eth_getUncleCountByBlockNumber
ブロック番号を指定して、そのブロックに含まれるアンクルブロックの数を返します。
パラメータ
| 番号 | 型 | 説明 | |
|---|---|---|---|
| 1 | {Quantity | string} | ブロック番号または "latest" 等 |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | アンクルブロック数(16進数表現) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockNumber",
"params": ["0xe8"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}eth_getWork
Proof-of-Workを行うために必要な情報(powハッシュ、シードハッシュ、ターゲット)を配列として返します。
戻り値
| 型 | 説明 |
|---|---|
| {Data[]} | POWに必要な3つのデータを含む配列 |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_getWork",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": [
"0x1234...",
"0x5EED...",
"0xd1ff..."
]
}eth_hashrate
このノードが1秒あたりに処理しているハッシュ数(マイニング性能)を返します。
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | ハッシュレート(hash/s) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_hashrate",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x38a"
}eth_mining
ノードが現在マイニングを行っているかどうかを判定します。
戻り値
| 型 | 説明 |
|---|---|
| {boolean} | true ならマイニング中 |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_mining",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": true
}eth_newBlockFilter
新しいブロックを監視するためのフィルターを作成します。
eth_getFilterChanges と組み合わせて使用します。
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | フィルターID(hex形式) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_newBlockFilter",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}eth_newFilter
特定の条件(アドレス、トピック、ブロック範囲など)に基づいてログイベントを監視するためのフィルターを作成します。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {object} | fromBlock、toBlock、address、topics などのプロパティを含むオブジェクト |
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | フィルターID(hex形式) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_newFilter",
"params": [{
"topics": ["0x0000000000000000000000000000000000000000000000000000000012341234"]
}]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}eth_newPendingTransactionFilter
新たに発生するペンディングトランザクション(未確定トランザクション)を監視するためのフィルターを作成します。このフィルターIDは eth_getFilterChanges で使用されます。
戻り値
| 型 | 説明 |
|---|---|
| {Quantity} | フィルターID(hex形式) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_newPendingTransactionFilter",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x1"
}eth_protocolVersion
現在のEthereumプロトコルのバージョンを返します。
戻り値
| 型 | 説明 |
|---|---|
| {string} | Ethereumプロトコルのバージョン |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_protocolVersion",
"params": []
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "54"
}eth_sendRawTransaction
署名済みトランザクションをネットワークにブロードキャストします。 署名はクライアント側で行っておく必要があります。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | RLPエンコードされた署名済みトランザクションデータ |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | トランザクションハッシュ。未取得ならゼロハッシュ |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_sendRawTransaction",
"params": ["0xd46e8dd67c5d32be..."]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xe670ec6434177160..."
}eth_sendTransaction
ノードが管理しているアカウントを使って、新しいトランザクションを生成・署名・送信します。
パラメータ
| 番号 | 型 | 説明(オブジェクトのプロパティ) |
|---|---|---|
| 1 | {object} | from(必須)、to、gas、gasPrice、value、data、nonce(任意) |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | トランザクションハッシュまたはゼロハッシュ |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_sendTransaction",
"params": [{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be..."
}]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xe670ec6434177160..."
}eth_sign
Ethereum仕様に基づいてメッセージに署名します。
\x19Ethereum Signed Message:\n + メッセージ長 + メッセージ の形式で署名されます。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | 署名者アドレス |
| 2 | {Data} | 署名対象データ(hex) |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | 署名ハッシュ値 |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_sign",
"params": ["0x9b2055d370f73ec7...", "0xdeadbeaf"]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xa3f20717a250c2b0b729b7..."
}eth_signTransaction
トランザクションに署名だけ行い、後で eth_sendRawTransaction で送信できるようにします。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {object} | トランザクションデータ(from, to, gas, gasPrice, value, data, nonce) |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | 署名済みトランザクション |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_signTransaction",
"params": [{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be..."
}]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0xa3f20717a250c2b0..."
}eth_signTypedData
EIP712に準拠した型付きデータに署名します。 構造化されたデータを対象にし、安全な署名確認を可能にします。
EIP712については以下の記事を参考にしてください。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | 署名者のアドレス |
| 2 | {object} | EIP-712形式のメッセージデータ |
戻り値
| 型 | 説明 |
|---|---|
| {Data} | 署名結果(hex形式) |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_signTypedData",
"params": ["0xCD2a3d9F938E13CD...", {
"types": {
"EIP712Domain": [
{ "name": "name", "type": "string" },
{ "name": "version", "type": "string" },
{ "name": "chainId", "type": "uint256" },
{ "name": "verifyingContract", "type": "address" }
],
"Person": [
{ "name": "name", "type": "string" },
{ "name": "wallet", "type": "address" }
],
"Mail": [
{ "name": "from", "type": "Person" },
{ "name": "to", "type": "Person" },
{ "name": "contents", "type": "string" }
]
},
"primaryType": "Mail",
"domain": {
"name": "Ether Mail",
"version": "1",
"chainId": 1,
"verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"
},
"message": {
"from": {
"name": "Cow",
"wallet": "0xCD2a3d9F938E13CD..."
},
"to": {
"name": "Bob",
"wallet": "0xbBbBBBBbbBBBbbbB..."
},
"contents": "Hello, Bob!"
}
}]
}' <url>{
"id": 1337,
"jsonrpc": "2.0",
"result": "0x4355c47d63924e8a72e509b6..."
}eth_submitHashrate
マイニングノードの現在のハッシュレート(採掘速度)をEthereumクライアントに報告します。 ノードごとの統計情報の収集や報酬計算の参考として使われることがあります。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | ハッシュレート(例:0x500000) |
| 2 | {Data} | ノードを識別するランダムなID(例:0xabc123...) |
戻り値
| 型 | 説明 |
|---|---|
| {boolean} | 成功すれば true、失敗すれば false |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_submitHashrate",
"params": [
"0x0000000000000000000000000000000000000000000000000000000000500000",
"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"
]
}' <url>eth_submitWork
マイニングで発見したブロック候補の解(nonce)をEthereumクライアントに送信します。PoWベースのEthereumでのブロック検証のために使用されていました。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Data} | 発見されたナンス(例:0x000...001) |
| 2 | {Data} | ブロックヘッダーのpow-hash |
| 3 | {Data} | mix digest(ハッシュ検証用) |
戻り値
| 型 | 説明 |
|---|---|
| {boolean} | 有効な解であれば true、無効なら false |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_submitWork",
"params": [
"0x0000000000000001",
"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"
]
}' <url>eth_syncing
ノードがEthereumネットワークと同期中かどうかを確認します。
同期していない場合は false を返し、同期中であれば進行状況を含むオブジェクトを返します。
戻り値
| 型 | 説明 |
|---|---|
| {boolean} | 同期していない場合は false |
| {object} | 同期中の場合は以下のプロパティを含むオブジェクトを返す |
同期中オブジェクトのプロパティ:
| プロパティ | 型 | 説明 |
|---|---|---|
startingBlock |
{Quantity} | 同期の開始ブロック番号 |
currentBlock |
{Quantity} | 現在同期済みの最新ブロック番号 |
highestBlock |
{Quantity} | ネットワーク上の最新ブロック番号 |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_syncing",
"params": []
}' <url>eth_uninstallFilter
指定したフィルターIDに対応するイベントフィルターを破棄します。 使用されなくなったフィルターをクリーンアップするために使います。
パラメータ
| 番号 | 型 | 説明 |
|---|---|---|
| 1 | {Quantity} | 破棄するフィルターのID |
戻り値
| 型 | 説明 |
|---|---|
| {boolean} | フィルターの破棄が成功すれば true、失敗すれば false |
使用例
curl -X POST --data '{
"id": 1337,
"jsonrpc": "2.0",
"method": "eth_uninstallFilter",
"params": ["0xb"]
}' <url>補足
EthereumのRPC(JSON-RPC)は、アプリケーションがノードと通信するための主要なインターフェースです。 例えば、トランザクションの送信やブロック情報の取得、アカウントの残高照会など、ほとんどの操作はRPCメソッドを通じて行われます。
しかし現状では、各クライアントが異なる形式や振る舞いで同じメソッド名を実装している場合があり、開発者は実装ごとの差異に対応しなければならず、余計な開発コストやバグの原因となっていました。
この仕様提案では、そうした混乱を避けるため、RPCメソッドの名前、パラメータの形式、戻り値の構造を明確に標準化することを目的としています。
既存クライアントとの互換性への影響
ERC1474は、EthereumのノードクライアントとdAppの両方に影響を与えます。
ノードクライアントの開発者にとっては、今後公開するRPCエンドポイントがこの仕様に完全に準拠していることが求められます。 これにより、どのクライアントでも一貫性のあるRPCインターフェースが保証されるようになります。
dAppの開発者にとっても影響はあります。 すでに実装されているアプリケーションにおけるRPC呼び出しが、仕様と異なる方法で行われていた場合、それを修正して仕様通りの呼び出しに変更する必要が出てきます。 つまり、仕様の標準化は開発者にとって短期的には調整コストとなりますが、長期的には安定性と移植性を高める効果があります。
参考実装
このRPC仕様に近い実装は、既にいくつかのEthereumクライアントにおいて試みられています。代表的なクライアントには次のようなものがあります。
| クライアント名 | 使用言語 | 公式サイト |
|---|---|---|
| Geth | Go | https://geth.ethereum.org |
| Parity | Rust | https://parity.io/ethereum |
| Aleth | C++ | https://cpp-ethereum.org |
これらのクライアントはそれぞれ独自の言語で実装されていますが、いずれもEthereumノードとして動作し、RPCエンドポイントを提供しています。 この提案の目的は、こうした各実装がRPC仕様を共通のルールに従って公開することで、dAppの開発者がどのクライアントでも安心して動作させられるようにすることです。
引用
Paul Bouchon mail@bitpshr.net, Erik Marks (@rekmarks), "EIP-1474: Remote procedure call specification [DRAFT]," Ethereum Improvement Proposals, no. 1474, October 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1474.
最後に
今回は「EthereumのRPCインターフェースを統一仕様として定義し、全てのクライアントとアプリで一貫した動作を実現する仕組みを提案しているERC1474」についてまとめてきました! いかがだったでしょうか?
質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!
他の媒体でも情報発信しているのでぜひ他も見ていってください!

