# 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.