# Cross-client RPC method matrix Comparison of JSON-RPC methods exposed by six execution clients against the `ethereum/execution-apis` spec. **Clients:** geth (G), Nethermind (N), Besu (B), Erigon (E), Reth (R), ethrex (X). **Spec column (S):** ✓ if `- name:` entry exists in `src/eth/`, `src/debug/`, `src/txpool/`, or `src/engine/`. Otherwise blank. ## Methodology - **Spec:** every `^- name:` line in `src/eth/`, `src/debug/`, `src/txpool/`. - **geth:** every exported method on RPC-registered API types in `internal/ethapi/`, `eth/api*.go`, `eth/tracers/`, `eth/syncer/`, `eth/filters/`. Subscription topics extracted by signature `(*rpc.Subscription, error)`. - **Nethermind:** every method on `IEthRpcModule`, `IDebugRpcModule`, `ITxPoolRpcModule`, `INetRpcModule`, `ISubscribeRpcModule` interfaces with `[JsonRpcMethod]` attribute. - **Besu:** wire names from `RpcMethod` enum and per-namespace registry classes (`EthJsonRpcMethods`, `DebugJsonRpcMethods`, `TxPoolJsonRpcMethods`, `NetJsonRpcMethods`). - **Erigon:** exported methods on `EthAPI`, `PrivateDebugAPI`, `TxPoolAPI`, `NetAPI` interfaces in `turbo/jsonrpc/`. - **Reth:** `#[method(name = "...")]` attributes inside `#[rpc(server, namespace = "...")]` traits in `crates/rpc/rpc-eth-api/src/` and `crates/rpc/rpc-api/src/`. - **ethrex:** string literals matched in the dispatch logic at `crates/networking/rpc/rpc.rs`. Out of scope: `admin`, `miner`, `web3`, `personal`, `trace` (parity), `engine`, `ots`, `parity`, `bor`, `erigon` (vendor), Reth's internal `reth` namespace, Nethermind's vendor namespaces, and L2-specific namespaces. --- ## eth namespace | Method | S | G | N | B | E | R | X | |---|---|---|---|---|---|---|---| | eth_accounts | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | eth_baseFee | | | | | ✓ | | | | eth_blobBaseFee | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_blockNumber | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_call | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_callMany | | | | | ✓ | ✓ | | | eth_capabilities | | | | ✓ | | | | | eth_chainId | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_coinbase | ✓ | | ✓ | | ✓ | ✓ | | | eth_config | | ✓ | ✓ | ✓ | ✓ | | ✓ | | eth_createAccessList | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_estimateGas | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_feeHistory | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_fillTransaction | | ✓ | | | | ✓ | | | eth_gasPrice | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getAccount | | | ✓ | | | ✓ | | | eth_getAccountInfo | | | ✓ | | | ✓ | | | eth_getBalance | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getBlockAccessList | ✓ | | | ✓ | ✓ | | | | eth_getBlockAccessListByHash | | | ✓ | | | | | | eth_getBlockAccessListByNumber | | | ✓ | | | | | | eth_getBlockAccessListByBlockHash | | | | | | ✓ | | | eth_getBlockAccessListByBlockNumber | | | | | | ✓ | | | eth_getBlockAccessListRaw | | | | | | ✓ | | | eth_getBlockByHash | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getBlockByNumber | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getBlockReceipts | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getBlockTransactionCountByHash | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getBlockTransactionCountByNumber | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getCode | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getFilterChanges | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getFilterLogs | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | eth_getHeaderByHash | | ✓ | | | | ✓ | | | eth_getHeaderByNumber | | ✓ | | | | ✓ | | | eth_getLogs | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getProof | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getRawTransactionByBlockHashAndIndex | | ✓ | | | ✓ | ✓ | | | eth_getRawTransactionByBlockNumberAndIndex | | ✓ | | | ✓ | ✓ | | | eth_getRawTransactionByHash | | ✓ | ✓ | | ✓ | ✓ | | | eth_getStorageAt | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getStorageValues | ✓ | ✓ | ✓ | | ✓ | ✓ | | | eth_getTransactionByBlockHashAndIndex | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getTransactionByBlockNumberAndIndex | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getTransactionByHash | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getTransactionBySenderAndNonce | | | | | | ✓ | | | eth_getTransactionCount | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getTransactionReceipt | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_getUncleByBlockHashAndIndex | | ✓ | ✓ | ✓ | ✓ | ✓ | | | eth_getUncleByBlockNumberAndIndex | | ✓ | ✓ | ✓ | ✓ | ✓ | | | eth_getUncleCountByBlockHash | ✓ | | ✓ | ✓ | ✓ | ✓ | | | eth_getUncleCountByBlockNumber | ✓ | | ✓ | ✓ | ✓ | ✓ | | | eth_getWork | | | | | ✓ | ✓ | | | eth_hashrate | | | | | ✓ | ✓ | | | eth_maxPriorityFeePerGas | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_mining | | | | ✓ | ✓ | ✓ | | | eth_newBlockFilter | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | eth_newFilter | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_newPendingTransactionFilter | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | eth_pendingTransactions | | ✓ | ✓ | | | | | | eth_protocolVersion | | | ✓ | ✓ | ✓ | ✓ | | | eth_resend | | ✓ | | | | | | | eth_sendRawTransaction | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_sendRawTransactionSync | | ✓ | | | ✓ | ✓ | | | eth_sendTransaction | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | eth_sign | ✓ | ✓ | ✓ | | ✓ | ✓ | | | eth_signTransaction | ✓ | ✓ | | | ✓ | ✓ | | | eth_signTypedData | | | | | | ✓ | | | eth_simulateV1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | eth_snapshot | | | ✓ | | | | | | eth_submitHashrate | | | | | ✓ | ✓ | | | eth_submitWork | | | | | ✓ | ✓ | | | eth_syncing | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | eth_uninstallFilter | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ## debug namespace | Method | S | G | N | B | E | R | X | |---|---|---|---|---|---|---|---| | debug_accountAt | | | | ✓ | ✓ | | | | debug_accountRange | | ✓ | | ✓ | ✓ | ✓ | | | debug_backtraceAt | | | | | | ✓ | | | debug_batchSendRawTransaction | | | | ✓ | | | | | debug_blockProfile | | | | | | ✓ | | | debug_chainConfig | | | | | | ✓ | ✓ | | debug_chaindbCompact | | ✓ | | | | ✓ | | | debug_chaindbProperty | | ✓ | | | | ✓ | | | debug_codeByHash | | | | | | ✓ | | | debug_cpuProfile | | | | | | ✓ | | | debug_dbAncient | | ✓ | | | | ✓ | | | debug_dbAncients | | ✓ | | | | ✓ | | | debug_dbGet | | ✓ | | | | ✓ | | | debug_deleteChainSlice | | | ✓ | | | | | | debug_dumpBlock | | ✓ | ✓ | | | ✓ | | | debug_executePayload | | | | | | ✓ | | | debug_executionWitness | | ✓ | ✓ | | ✓ | ✓ | ✓ | | debug_executionWitnessByBlockHash | | | | | | ✓ | ✓ | | debug_executionWitnessCall | | | ✓ | | | | | | debug_freeOSMemory | | | | | ✓ | ✓ | | | debug_freezeClient | | | | | | ✓ | | | debug_gcStats | | | ✓ | | ✓ | ✓ | | | debug_getAccessibleState | | ✓ | | | | ✓ | | | debug_getBadBlocks | ✓ | | ✓ | ✓ | ✓ | ✓ | | | debug_getBlockAccessList | | | | | | | ✓ | | debug_getChainLevel | | | ✓ | | | | | | debug_getConfigValue | | | ✓ | | | | | | debug_getFromDb | | | ✓ | | | | | | debug_getModifiedAccountsByHash | | ✓ | | | ✓ | ✓ | | | debug_getModifiedAccountsByNumber | | ✓ | | | ✓ | ✓ | | | debug_getRawBlock | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | debug_getRawHeader | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | debug_getRawReceipts | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | debug_getRawTransaction | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | debug_getRawTransactions | | | | | | ✓ | | | debug_getSyncStage | | | ✓ | | | | | | debug_getTrieFlushInterval | | ✓ | | | | | | | debug_goTrace | | | | | | ✓ | | | debug_insertReceipts | | | ✓ | | | | | | debug_intermediateRoots | | ✓ | | | | ✓ | | | debug_memStats | | | ✓ | | ✓ | ✓ | | | debug_metrics | | | | ✓ | | | | | debug_migrateReceipts | | | ✓ | | | | | | debug_mutexProfile | | | | | | ✓ | | | debug_preimage | | ✓ | | | | ✓ | | | debug_printBlock | | ✓ | | | | ✓ | | | debug_replayBlock | | | | ✓ | | | | | debug_resetHead | | | ✓ | | | | | | debug_resyncWorldState | | | | ✓ | | | | | debug_seedHash | | | ✓ | | | ✓ | | | debug_setBlockProfileRate | | | | | | ✓ | | | debug_setGCPercent | | | | | ✓ | ✓ | | | debug_setHead | | ✓ | ✓ | ✓ | ✓ | ✓ | | | debug_setMemoryLimit | | | | | ✓ | | | | debug_setMutexProfileFraction | | | | | | ✓ | | | debug_setTrieFlushInterval | | ✓ | | | | ✓ | | | debug_simulateV1 | | | ✓ | | | | | | debug_stacks | | | | | | ✓ | | | debug_standardTraceBadBlockToFile | | ✓ | ✓ | ✓ | | ✓ | | | debug_standardTraceBlockToFile | | ✓ | ✓ | ✓ | | ✓ | | | debug_startCPUProfile | | | | | | ✓ | | | debug_startGoTrace | | | | | | ✓ | | | debug_stateRootWithUpdates | | | | | | ✓ | | | debug_stateSize | | ✓ | | | | | | | debug_stopCPUProfile | | | | | | ✓ | | | debug_stopGoTrace | | | | | | ✓ | | | debug_storageRangeAt | | ✓ | | ✓ | ✓ | ✓ | | | debug_sync | | ✓ | | | | | | | debug_traceBadBlock | | ✓ | | | | ✓ | | | debug_traceBlock | | ✓ | ✓ | ✓ | | ✓ | | | debug_traceBlockByHash | | ✓ | ✓ | ✓ | ✓ | ✓ | | | debug_traceBlockByNumber | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | debug_traceBlockFromFile | | ✓ | ✓ | | | | | | debug_traceCall | | ✓ | ✓ | ✓ | ✓ | ✓ | | | debug_traceCallMany | | | ✓ | | ✓ | ✓ | | | debug_traceChain | | ✓ | | | | ✓ | | | debug_traceTransaction | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | debug_traceTransactionByBlockAndIndex | | | ✓ | | | | | | debug_traceTransactionByBlockhashAndIndex | | | ✓ | | | | | | debug_traceTransactionInBlockByHash | | | ✓ | | | | | | debug_traceTransactionInBlockByIndex | | | ✓ | | | | | | debug_verbosity | | | | | | ✓ | | | debug_vmodule | | | | | | ✓ | | | debug_writeBlockProfile | | | | | | ✓ | | | debug_writeMemProfile | | | | | | ✓ | | | debug_writeMutexProfile | | | | | | ✓ | | ## txpool namespace | Method | S | G | N | B | E | R | X | |---|---|---|---|---|---|---|---| | txpool_besuPendingTransactions | | | | ✓ | | | | | txpool_besuStatistics | | | | ✓ | | | | | txpool_besuTransactions | | | | ✓ | | | | | txpool_content | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | txpool_contentFrom | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | txpool_inspect | | ✓ | ✓ | ✓ | | ✓ | ✓ | | txpool_status | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ## net namespace | Method | S | G | N | B | E | R | X | |---|---|---|---|---|---|---|---| | net_enode | | | | ✓ | | | | | net_listening | | ✓ | ✓ | ✓ | ✓ | ✓ | | | net_localAddress | | | ✓ | | | | | | net_localEnode | | | ✓ | | | | | | net_peerCount | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | net_services | | | | ✓ | | | | | net_version | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ## eth_subscribe topics | Topic | S | G | N | B | E | R | X | |---|---|---|---|---|---|---|---| | droppedPendingTransactions | | | ✓ | ✓ | | | | | logs | | ✓ | ✓ | ✓ | ✓ | ✓ | | | newHeads | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | newPendingTransactions | | ✓ | ✓ | ✓ | ✓ | ✓ | | | newPendingTransactionsWithBody | | | | | ✓ | | | | syncing | | | ✓ | ✓ | | ✓ | | | transactionReceipts | | ✓ | ✓ | ✓ | ✓ | ✓ | | The user's branch is `add-eth-subscribe-methods`, so `eth_subscribe` itself is being added. Topic coverage in spec is unconfirmed on this branch verify against `src/eth/subscribe.yaml` if present. --- ## Overlap summary ### Methods missing from spec but implemented in 5–6 clients These have the strongest interop case for standardization. | Method | Clients | Count | |---|---|---| | eth_config | G, N, B, E, X | 5 | | eth_getUncleByBlockHashAndIndex | G, N, B, E, R | 5 | | eth_getUncleByBlockNumberAndIndex | G, N, B, E, R | 5 | | debug_setHead | G, N, B, E, R | 5 | | debug_traceBlockByHash | G, N, B, E, R | 5 | | debug_traceBlockByNumber | G, N, B, E, R, X | 6 | | debug_traceCall | G, N, B, E, R | 5 | | debug_traceTransaction | G, N, B, E, R, X | 6 | | txpool_inspect | G, N, B, R, X | 5 | | net_listening | G, N, B, E, R | 5 | | net_peerCount | G, N, B, E, R, X | 6 | | logs (eth_subscribe) | G, N, B, E, R | 5 | | newHeads (eth_subscribe) | G, N, B, E, R, X | 6 | | newPendingTransactions (eth_subscribe) | G, N, B, E, R | 5 | | transactionReceipts (eth_subscribe) | G, N, B, E, R | 5 | ### Methods missing from spec but implemented in 3–4 clients | Method | Clients | Count | |---|---|---| | eth_callMany | E, R | 2 | | eth_getRawTransactionByBlockHashAndIndex | G, E, R | 3 | | eth_getRawTransactionByBlockNumberAndIndex | G, E, R | 3 | | eth_getRawTransactionByHash | G, N, E, R | 4 | | eth_protocolVersion | N, B, E, R | 4 | | eth_sendRawTransactionSync | G, E, R | 3 | | eth_mining | B, E, R | 3 | | debug_accountRange | G, B, E, R | 4 | | debug_dumpBlock | G, N, R | 3 | | debug_executionWitness | G, N, E, R, X | 5 | | debug_getModifiedAccountsByHash | G, E, R | 3 | | debug_getModifiedAccountsByNumber | G, E, R | 3 | | debug_storageRangeAt | G, B, E, R | 4 | | debug_standardTraceBadBlockToFile | G, N, B, R | 4 | | debug_standardTraceBlockToFile | G, N, B, R | 4 | | debug_traceBlock | G, N, B, R | 4 | | debug_traceCallMany | N, E, R | 3 | | syncing (eth_subscribe) | N, B, R | 3 | | droppedPendingTransactions (eth_subscribe) | N, B | 2 | ### Spec methods not implemented by all clients | Method | Missing from | |---|---| | eth_accounts | ethrex | | eth_coinbase | geth, Besu, ethrex | | eth_getBlockAccessList | Nethermind, Reth, ethrex (Nethermind/Reth use split by-hash/by-number naming; ethrex puts it under `debug_`) | | eth_getFilterLogs | ethrex | | eth_getStorageValues | Besu, ethrex | | eth_getUncleCountByBlockHash | geth, ethrex | | eth_getUncleCountByBlockNumber | geth, ethrex | | eth_newBlockFilter | ethrex | | eth_newPendingTransactionFilter | ethrex | | eth_sendTransaction | ethrex | | eth_sign | Besu, ethrex | | eth_signTransaction | Nethermind, Besu, ethrex | | eth_simulateV1 | ethrex | | debug_getBadBlocks | geth | ethrex is the youngest client and consistently has the smallest method set; that's expected. ### Truly client-only methods (not shared with any other client and not in spec) **geth-only:** `eth_resend`, `debug_getTrieFlushInterval`, `debug_stateSize`, `debug_sync`. **Nethermind-only:** `eth_snapshot`, `debug_deleteChainSlice`, `debug_executionWitnessCall`, `debug_getChainLevel`, `debug_getConfigValue`, `debug_getFromDb`, `debug_getSyncStage`, `debug_insertReceipts`, `debug_migrateReceipts`, `debug_resetHead`, `debug_simulateV1`, `debug_traceTransactionByBlockAndIndex`, `debug_traceTransactionByBlockhashAndIndex`, `debug_traceTransactionInBlockByHash`, `debug_traceTransactionInBlockByIndex`, `net_localAddress`, `net_localEnode`. **Besu-only:** `eth_capabilities`, `debug_batchSendRawTransaction`, `debug_metrics`, `debug_replayBlock`, `debug_resyncWorldState`, `txpool_besuStatistics`, `txpool_besuTransactions`, `txpool_besuPendingTransactions`, `net_enode`, `net_services`. **Erigon-only:** `eth_baseFee`, `debug_setMemoryLimit`, `newPendingTransactionsWithBody` (subscription topic). **Reth-only:** `eth_getTransactionBySenderAndNonce`, `eth_signTypedData`, `eth_getBlockAccessListRaw`, `debug_backtraceAt`, `debug_blockProfile`, `debug_codeByHash`, `debug_cpuProfile`, `debug_executePayload`, `debug_freezeClient`, `debug_goTrace`, `debug_mutexProfile`, `debug_setBlockProfileRate`, `debug_setMutexProfileFraction`, `debug_stacks`, `debug_startCPUProfile`, `debug_startGoTrace`, `debug_stateRootWithUpdates`, `debug_stopCPUProfile`, `debug_stopGoTrace`, `debug_verbosity`, `debug_vmodule`, `debug_writeBlockProfile`, `debug_writeMemProfile`, `debug_writeMutexProfile`, `debug_getRawTransactions`. **ethrex-only:** `debug_getBlockAccessList` (note: ethrex puts it under `debug_`, while spec puts it under `eth_`). ### Naming divergence on the same concept | Concept | Spec | Variants in clients | |---|---|---| | Block access list | `eth_getBlockAccessList` (single method) | Nethermind: `eth_getBlockAccessListByHash`, `eth_getBlockAccessListByNumber`; Reth: `eth_getBlockAccessListByBlockHash`, `eth_getBlockAccessListByBlockNumber`, `eth_getBlockAccessListRaw`; ethrex: `debug_getBlockAccessList` | | Trace transaction by index | (none) | Nethermind has four variants: `traceTransactionByBlockAndIndex`, `traceTransactionByBlockhashAndIndex`, `traceTransactionInBlockByHash`, `traceTransactionInBlockByIndex`. No other client implements these. | --- ## Lower-confidence items 1. **Reth `debug_*` profiling/diagnostic methods** (`debug_cpuProfile`, `debug_mutexProfile`, `debug_writeBlockProfile` etc.) are declared in trait files at `crates/rpc/rpc-api/src/debug.rs`. Whether every method is registered with the running RPC server in default node configurations is not confirmed; some may be feature-gated. 2. **ethrex subscription topics** only `newHeads` was confirmed by string match in `subscription_manager.rs`. ethrex may support more topics than I surfaced; the dispatch code in `rpc.rs` only mentions `eth_subscribe` and `eth_unsubscribe` as wire methods, not the topic names themselves. 3. **Erigon `eth_baseFee`** present in the agent's report from `EthAPI` interface "implements" comments. I did not verify the registration path independently. 4. **Besu's `eth_mining`, `eth_protocolVersion`** may be stub returns for backwards compatibility rather than functional methods. Spec status unaffected. 5. **`eth_config`** five clients expose it. Geth's version returns `*configResponse` (unexported type), which sometimes blocks Go RPC reflector registration. Worth verifying geth's wire-level exposure with a live call before treating it as universally available. 6. **Nethermind's `debug_simulateV1`** semantically distinct from `eth_simulateV1`. It's a tracing wrapper that runs the simulation and returns geth-style traces. Don't confuse with `eth_simulateV1` standardization.