Reth 2.0 is a major release that makes Storage V2 the default for all new nodes, introduces the SparseTrieCacheTask for dramatically faster state root computation, and delivers across-the-board performance improvements to the engine, RPC, and P2P layers. This release also removes the deprecated reth-primitives crate and removes RocksDB feature gates (RocksDB is now always available).
Storage v2
Storage v2 is now the default for new nodes (#22890). Existing storage v1 nodes are unaffected and will continue to work.
For v2 snapshots, check out our renovated portal https://snapshots.reth.rs/.
Note
Support for storage v1 nodes will be removed in a future version. An exact deprecation date will be communicated separately, all users are strongly encouraged to switch to storage v2.
Important
If you rely on out-of-process database access concurrently with a running reth node (e.g. out of process block builders), with storage v2 holding a long read transaction might result in persistence stall if a reorg happens at the same time. In combination with engine backpressure this might cause the node to stall if the external reader holds the read transaction for too long.
Backwards Compatibility
- If you start a new node with storage v2, you will not be able to use it with storage v1, and vice versa.
- Reth 2.0 includes engine backpressure. This is a safeguard that prevents unbounded growth of in-memory blocks buffer in cases when persistence is not able to keep up with the chain. When the gap between canonical tip and the last persisted block exceeds --engine.persistence-backpressure-threshold (default: 16), no new payloads are executed until persistence advances. For SDK users, TreeConfig::with_persistence_backpressure_threshold provides the same functionality.
reth-primitives-traitscrate was moved to a separatereth-corerepo, along with other supporting crates. We kept the re-exports, so it should not affect the code that uses Reth as a library. If you depend onreth-primitives-traitsdirectly, you need to switch to crates.io.- ExEx WAL encoding was changed from bincode to RLP for block serialization.
Dependencies
Compatible versions:
revm: 36.0.0
alloy-*: 1.8.2
alloy-evm: 0.30.0
revm-inspectors: 0.36.0
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 |
See Update Priorities for more information about this table.
Breaking Changes
SDK
- Removed deprecated reth-primitives crate — use reth-ethereum-primitives instead (#23220)
- Removed SerdeBincodeCompat trait, use RLP for block serialization (#23158)
- Removed PayloadBuilderAttributes (#23202)
- Removed TaskSpawner trait in favor of concrete Runtime (#22052)
- Removed reth-engine-service crate (#22187)
- Removed IntoRpcTx — integrated reth-rpc-traits directly (#23288)
- Removed legacy proof code paths, simplified to V2-only (#22270)
- Removed changeset count APIs from storage (#23310)
- Replaced TryFrom*Response traits with unified RpcResponseConverter (#22320)
- Replaced reth-primitives-traits with reth-core deps (#23186, #23210)
- Used EthereumReceipt from alloy (#22254)
- Removed OP features from engine-local and payload-primitives (#23255, #23253)
Storage
- Storage V2 is the default for new nodes (#22890)
- Slot preimage DB for plain changeset keys in V2 (#22379)
Features
Performance
- SparseTrieCachTask: New background state root task which persists the trie across blocks (#21583)
- ArenaParallelSparseTrie: Arena-based parallel sparse trie implementation (#22381)
- Proof V2: Ground-up rewrite of merkle proof calculation used to populate data in the sparse trie. Supports partial proofs and cursor re-use (#19863, #20336)
- Engine backpressure: persistence-aware backpressure for pipeline throughput (#23280, #23308)
- Shared execution cache and sparse trie pipeline with payload builder (#23242, #23246)
- Jemalloc override_allocator_on_supported_platforms enabled (#23214)
- Adaptive multiproof chunk size based on block gas usage (#22233)
- Rayon par_iter for tx prewarming with dedicated pool (#22521, #22108)
- Lock-free for_each_ordered replaces channel+BTreeMap reorder (#22144)
- Precompute tx root during payload validation (#22489)
- Overlap block conversion with execution in payload validation (#21957)
- Concurrent block+receipt fetching in eth_feeHistory (#22826)
- Reduced redundant DB lookups for receipts (#22724)
- Pool read-only MDBX transaction handles to avoid reader table mutex (#22631)
- Size-based backpressure for session broadcast messages (#22849)
- Increased default concurrent outbound dials to 30 (#22744)
- Thread priority boosting for engine and sparse trie threads (#22541)
- StoredNibblesSubKey packed from 65→33 bytes (#22158)
- FastInstant (quanta) for metrics timing (#23265, #22211)
RPC
- debug_intermediateRoots (#22754)
- debug_traceBadBlock (#22719)
- debug_verbosity / debug_vmodule (#21497)
- eth_getStorageValues batch storage slot retrieval (#22186)
- reth_getBlockExecutionOutcome (#22397)
- reth_forkchoiceUpdated (#22536)
- reth_newPayload accepts RLP-encoded blocks (#22533)
- block_access_list_raw RPC (#23363)
- BAL RPC methods (#23330)
- Configurable minimum pruning distance (#23082)
- CLI args exposed as Prometheus metric (#22896)
CLI
- New reth-bb binary for multi-segment big block execution (#23140)
- Modular snapshot downloads with interactive TUI and config generation (#22246)
- reth db prune-checkpoints and reth db stage-checkpoints commands (#22288, #22579)
- --storage.v2 works without explicit true/false (#23173)
- --with-senders and --with-rocksdb niche presets (#22933)
- Snapshots API at snapshots.reth.rs with --list and --channel flags (#22859)
- File logging disabled by default for non-node commands (#21521)
- Storage V2 support in db state --block historical queries (#22670)
P2P
- ReceiptsClient trait and p2p receipt downloading (#22607)
- Richer peer metadata persisted to peers file (#22557)
- Discv5 ENR data in admin_nodeInfo response (#23170)
- fork_id as tiebreaker in peer selection (#22545)
- BAL devp2p variant support (#22024)
Engine
- Slow block logs for identifying execution bottlenecks (#21433)
- Gas-bucketed sub-phase metrics for new_payload (#22210)
- Payload resolve and job-creation latency histograms (#22978)
- Trigger-based MiningMode variant (#22250)
- WorkerPool with per-thread Worker state (#22154)
- /debug/tokio/dump endpoint for tokio task dumps (#22737)
Trie
- trie-debug feature for recording sparse trie mutations (#22234)
- Sparse trie cache retained memory metrics (#22697)
- Trie cursor metrics (#23252)
- Proof V2 in TrieWitness (#22922)
- SparseStateTrie::update_account_stateless for stateless validation (#23272)
SDK
- NodeBuilder::with_rocksdb_provider (#22970)
- DefaultLogArgs for customizable log defaults (#23122)
- DefaultNetworkArgs for NetworkArgs (#22801)
- ExExManager buffer capacity exposed in ExExLauncher (#22553)
- Expose EVM config on EthTransactionValidator (#23369)
- Custom validation checks in EthTransactionValidator (#22559)
- ERA type override functionality in EraClient (#23307)
- Work-stealing parallelization for re-execute (#22242)
Bug Fixes
Engine
- Avoid double decrement in account cache size (#23249)
- Only count precompile cache hit when gas is sufficient (#22968)
- Reset execution cache hash on clear (#22895)
- Don't deadlock on repeated payloads (#22971)
- Wait for persistence to complete in reth_newPayload (#22239)
- Graceful engine shutdown on node drop (#22698)
- Clamp pending finalized/safe block to persisted height (#22783)
- Send correct transaction index in prewarm task (#22223)
RPC
- admin_nodeInfo.id returns keccak256 node ID matching go-ethereum format (#23319)
- Remove 0x prefix from admin_peers id to match go-ethereum format (#23318)
- Return error instead of empty response for missing blocks in debug_getRaw (#22675)
- Disable fee charge in eth_createAccessList and eth_estimateGas (#23026, #22959)
- Disable EIP-7825 tx gas limit cap in eth_createAccessList and eth_estimateGas (#22893)
- Correct call_many block lookup errors (#22759)
- Return -38003 for FCU beacon-root payloadAttributes mismatches (#22634)
- Return -32602 for PayloadAttributes structure validation errors (#22374)
- Respect pending-block=none for provider blocks (#22556)
- Use actual configured limit in trace_filter (#22477)
- Add missing apply_pre_execution_changes in replay and traceCallMany (#22575, #22577)
- eth_config returns correct fork (#23007)
- Trim spaces in CORS domain parsing (#22192)
P2P
- Mark transactions as seen in propagate_hashes_to (#22776)
- Propagate local pending txs during initial sync (#22727)
- Send disconnect on invalid inbound eth messages (#22986)
- Treat malformed blob sidecar responses as peer misbehavior (#23035)
- Fully remove disconnected peers from transaction state (#23014)
- Disable Discv5 ENR auto-update when NAT disabled or explicit addr set (#23075)
- Resolve DNS for ExternalAddr (#23269)
- Respect --bootnodes flag in reth p2p commands (#23040)
- Apply sessions config from reth.toml in p2p subcommand (#23078)
- Skip persisted peers without a confirmed fork ID on startup (#22734)
Trie
- Fix branch collapse edge-cases in ArenaParallelSparseTrie (#23053, #23089)
- Avoid boundary parent unwrap panic in parallel sparse reveal (#23171)
- Preserve prune invariants across sparse trie impls (#23226)
- Reset proof V2 calculator on error (#22781)
- Fix merge_subtrie_updates not cancelling updates/removals (#22947)
Storage
- Cap storage_v2 unwind history by MDBX tip (#23335)
- Fix race between save_blocks and RocksDB pruning (#23081)
- Preserve genesis history entries in RocksDB consistency check (#23033)
- Heal finalized/safe block numbers ahead of highest header (#22995)
- Add ensure_canonical_block guard to history_by_block_hash (#22876)
- Skip sender pruning during reorg when sender_recovery is full (#22271)
- Overwrite Destroyed revert slots when injecting preimages (#23114)
Transaction Pool
- Use ceiling division for replacement tx price bump check (#23012)
- Prevent sender-id map growth on read-only lookups (#23008)
- Ensure transactions added to pending subpool in nonce order (#22308)
- Notify subscribers when set_block_info promotes transaction (#22243)
- Treat NotFound as success in blob store cleanup (#22862)
Other
- Always reinsert reorged blocks (#23175)
- Gracefully shut down engine (#23159)
- Retry block subscription on initial connection failure (#23233)
- Handle payload builder stream termination gracefully (#21710)
- Install panic handler on all worker pools (#22993)
- Avoid OOM during init-state by dropping prefix sets (#23166)
- Retry on extraction failure in resumable modular downloads (#23054)
- Drain ExEx notification channel during backfill to prevent stall (#22168)
- Bound storage hashing stages memory (#22721)
- Re-enable TLS in tokio-tungstenite for ethstats (#23090)
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.0.0-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
| aarch64 | reth-v2.0.0-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
| x86_64 | reth-v2.0.0-x86_64-apple-darwin.tar.gz | PGP Signature | |
| aarch64 | reth-v2.0.0-aarch64-apple-darwin.tar.gz | PGP Signature | |
| Docker | paradigmxyz/reth | - |
