Performance
Reth v2.4.0 reduces mean newPayload latency by 6.2% compared with v2.3.0.
Experimental revmc JIT EVM support is added and can be activated with --jit.enabled flag.
Networking and transaction propagation get a large set of throughput-oriented improvements: faster pooled transaction recovery (#26304), cached full transaction propagation encoding (#26012), and multiple ECIES / P2PStream allocation reductions.
Features
We continue with Amsterdam and EIP-7928 Block Access List development.
reth p2p bootnode --v5 now co-locates discv4 and discv5 on a single UDP port (--addr), matching go-ethereum and reth's own networking stack, with IPv4/IPv6 support (#26089)
RPC compatibility was improved with eth_sendRawTransactionSync timeout support, geth-aligned raw transaction handling, empty-proof normalization for eth_getProof, and several eth_simulate, eth_estimateGas, fee-history, and txpool fixes.
ParallelStateRoot deprecation
SDK/library users that depend on trie internals should update usages of ParallelStateRoot, ParallelSparseTrie, and ParallelStateRootError that were removed in this version.
Deployments still passing --engine.legacy-state-root should remove it or use --engine.state-root-fallback if they intentionally need synchronous state-root computation.
Update Priority
This table provides priorities for which classes of users should update particular components.
| User Class | Priority |
|---|---|
| Payload Builders | High |
| Non-Payload Builders | High |
Breaking Changes
Runtime / Configuration
- Dropped the legacy parallel state-root runtime path;
--engine.legacy-state-rootis hidden and now only warns if passed, with the sparse trie task as the normal path and serial fallback retained (#26069).
SDK / State Root APIs
- Refactored state-root strategy APIs to support custom out-of-tree state-root implementations (#26085).
- Removed
ParallelStateRoot; downstream users should migrate to the sparse trie task or the serial fallback path (#26121). - Renamed
ParallelStateRootErrortoStateRootTaskError(#26132). - Removed
ParallelSparseTrie;ArenaParallelSparseTrieis now the default sparse trie implementation used by engine sparse-trie paths (#25453). - Changed
PayloadValidator::validate_block_post_execution_with_hashed_stateto receive a lazy overlay-aware parent-state provider and returnPostExecutionValidationError; custom implementations overriding this method must update their signatures (#26330).
Features
Performance
- Added experimental
revmcJIT support for Ethereum EVM execution, including--jitnode flags andreth_jitdebug controls (#23230). - Made JIT opt-in for library crates and fixed JIT CLI/helper handling (#25178, #25183, #25413).
- Reduced transaction conversion latency by emitting recovered transactions in ordered windows instead of waiting on a large Rayon ordered iterator (#25783).
- Avoided full block clones in FCU, RPC cache, and ExEx paths by storing and exposing
Arc<RecoveredBlock>handles inChain(#25645, #25647). - Optimized state-root and storage-history work with better
update_leavesparallelism, parallelwrite_storage_history, and more aggressive sparse trie caching. (#24774, #25282, #25428). - Reduced BAL execution overhead by using unordered transaction iteration for BALs, buffering BAL execution cache metrics, and avoiding unnecessary hashed-account reads (#25411, #25366, #25369).
- Offloaded metric rendering and added worker queue / provider metric improvements (#26180, #25649, #25481).
- Routed raw transaction submission through
PoolTransaction::recover_raw_transaction, allowing custom pool transaction types to recover directly from encoded bytes (#25238).
Networking & P2P
- Added snap/2 support across negotiation, dedicated eth + snap/2 streams, SnapClient BAL APIs, snap message helpers, the snap client, and inbound snap/2 request routing (#25774, #25752, #25607, #25608, #26049, #26324).
- Improved bootnode reachability by supporting NAT advertisement and dual-stack discv5 addresses, then running discv4 and discv5 on the same UDP port (#25757, #26089).
- Optimized transaction propagation and devp2p decoding with cached full transaction encodings, lower allocation transaction list decodes, preallocated pooled hash metadata, and same-poll pending transaction propagation (#26012, #26164, #26145, #25087).
- Reduced ECIES and P2PStream overhead by caching AES key schedules, reusing snappy buffers, batching flushes, raising the write flush boundary, and avoiding redundant zero-fill/copy work (#26346, #26347, #26349, #26348, #26120, #26119).
RPC
- Added
eth_sendRawTransactionSynctimeout support matching EIP-7966-style timeout behavior (#25682). - Added
engine_hasBlobsso consensus clients can check ordered blob availability without fetching blob/proof payloads (#25589). - Added
debug_clearTxpoolfor geth-compatible testing and debugging workflows (#25588). - Added
admin_banPeerandadmin_unbanPeermethods (#25140). - Added the
EthSubscriptionstrait for logs and header streams (#22155). - Added testing RPC helpers for committing and building blocks (#25070, #25750).
Engine, Payload & Amsterdam
- Added SSZ Engine API payload and forkchoice status containers, plus SSZ proxy wiring (#26133, #26271, #25422).
- Validated Block Access Lists during
flashbots_validateBuilderSubmissionV6and stored validated payload BALs (#24297, #25268). - Added BAL-capable download client requirements (#25266).
CLI, ERA & Snapshots
- Added ERE export and extended ERE import through stage sync (#25304, #25262).
- Improved
.eraimport handling by supporting ERA file imports, decoding execution blocks from consensus.erablocks, avoiding misreading consensus.eraas era1, and accepting local filename variants (#25404, #25582, #25603, #26006). - Added
import-erasupport for ERE.eraefiles and explicitly rejected unsupported.eraexport paths (#25122, #25576). - Supported file archives in modular snapshots and exposed
SlotPreimagesfor snapshot importers (#26078, #25035). - Allowed overriding
TraceArgsdefaults and added node command helpers (#25736, #25273).
Pruning & Storage
- Added row-budgeted dupsort pruning and used static-file transaction-hash ranges for pruning (#26287, #26312).
- Added sealed or recovered block lookup and
DatabaseStateProviderfor revm integration (#25338, #25121).
Observability
- Included span attributes in OTLP logs (#26062).
- Improved sparse-trie tracing and span propagation (#26331, #26273).
Bug Fixes
Engine, Trie & Payload
- Restored the state-root task parallelism gate (#26080).
- Included Amsterdam fields in payload IDs and used the execution version header for SSZ routes (#25973, #25925).
- Fixed execution-cache saved-cache tracking and waited for workers before writing cache state (#25460, #25462).
- Fixed BAL handling so empty newly created accounts are excluded from hashed post-state (#26367).
RPC
- Treated
eth_sendRawTransactionsubmissions as local transactions, matching documented local transaction handling (#25412). - Used revm's effective transaction gas cap for
eth_estimateGasbounds (#25612). - Weighted fee-history rewards by receipt gas for Amsterdam semantics (#26067).
- Normalized
eth_getProofempty account and storage trie proofs to empty arrays for geth-compatible EIP-1186 responses (#24719). - Fixed nonce-related
eth_simulatefailures and aligned missing-block error behavior (#25079, #25074). - Aligned
eth_fillTransactiondefaultmaxFeePerGaswith geth's2 * base_fee + tipbehavior (#25258). - Buffered
trace_filterblock replays and serialized capability retention as a quantity (#25133, #25324).
P2P & Txpool
- Wired the configured
--max-pending-importsvalue into the transaction manager instead of always using the default (#25921). - Respected the configured full-transaction broadcast peer count (#25086).
- Accounted for blob transaction access-list size in txpool accounting (#26113).
- Reset peer reputation when admin-unbanning a peer and advertised the bound RLPx port in the discv5 ENR (#26334, #26265).
Pruning, Storage, ERA & Snapshots
- Derived receipts static-file size from prune distance (#26108).
- Returned
Nonefor incomplete block receipts in provider lookups (#25410). - Omitted total difficulty and accumulator fields for post-merge ERE exports (#25379).
- Included repository licenses in Docker build context and added
m4to Nix/native build inputs (#25855, #26321). - Rejected incomplete chain-file and gzip block data at EOF, preventing malformed imports from looping indefinitely (#26363).
Compatible versions
- revm: 41.0.0
- alloy-*: 2.1.1 (core alloy crates), 1.6.0 (alloy-primitives / sol-types / dyn-abi)
- alloy-evm: 0.37.0
- revm-inspectors: 0.41.0
- alloy-eip7928: 0.4.5
Full Changelog: v2.3.0...v2.4.0
Binaries
See pre-built binaries documentation.
The binaries are signed with the PGP key: 50FB 7CC5 5B2E 8AFA 59FE 03B7 AA5E D56A 7FBF 253E
Reth
| System | Architecture | Binary | PGP Signature |
|---|---|---|---|
| x86_64 | reth-v2.4.0-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | reth-v2.4.0-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | reth-v2.4.0-aarch64-apple-darwin.tar.gz | PGP Signature | |
| Docker | paradigmxyz/reth | - |
