github paradigmxyz/reth v2.4.0
Reth v2.4.0

3 hours ago

image

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-root is 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 ParallelStateRootError to StateRootTaskError (#26132).
  • Removed ParallelSparseTrie; ArenaParallelSparseTrie is now the default sparse trie implementation used by engine sparse-trie paths (#25453).
  • Changed PayloadValidator::validate_block_post_execution_with_hashed_state to receive a lazy overlay-aware parent-state provider and return PostExecutionValidationError; custom implementations overriding this method must update their signatures (#26330).

Features

Performance

  • Added experimental revmc JIT support for Ethereum EVM execution, including --jit node flags and reth_jit debug 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 in Chain (#25645, #25647).
  • Optimized state-root and storage-history work with better update_leaves parallelism, parallel write_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_sendRawTransactionSync timeout support matching EIP-7966-style timeout behavior (#25682).
  • Added engine_hasBlobs so consensus clients can check ordered blob availability without fetching blob/proof payloads (#25589).
  • Added debug_clearTxpool for geth-compatible testing and debugging workflows (#25588).
  • Added admin_banPeer and admin_unbanPeer methods (#25140).
  • Added the EthSubscriptions trait 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_validateBuilderSubmissionV6 and 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 .era import handling by supporting ERA file imports, decoding execution blocks from consensus .era blocks, avoiding misreading consensus .era as era1, and accepting local filename variants (#25404, #25582, #25603, #26006).
  • Added import-era support for ERE .erae files and explicitly rejected unsupported .era export paths (#25122, #25576).
  • Supported file archives in modular snapshots and exposed SlotPreimages for snapshot importers (#26078, #25035).
  • Allowed overriding TraceArgs defaults 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 DatabaseStateProvider for 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_sendRawTransaction submissions as local transactions, matching documented local transaction handling (#25412).
  • Used revm's effective transaction gas cap for eth_estimateGas bounds (#25612).
  • Weighted fee-history rewards by receipt gas for Amsterdam semantics (#26067).
  • Normalized eth_getProof empty account and storage trie proofs to empty arrays for geth-compatible EIP-1186 responses (#24719).
  • Fixed nonce-related eth_simulate failures and aligned missing-block error behavior (#25079, #25074).
  • Aligned eth_fillTransaction default maxFeePerGas with geth's 2 * base_fee + tip behavior (#25258).
  • Buffered trace_filter block replays and serialized capability retention as a quantity (#25133, #25324).

P2P & Txpool

  • Wired the configured --max-pending-imports value 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 None for 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 m4 to 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 -

Don't miss a new reth release

NewReleases is sending notifications on new releases.