Reth v2.6.0
- Version
v2.6.0- Repository
- paradigmxyz/reth
Release notes
Reth v2.6.0 expands Amsterdam and Hegotá protocol support, installs the REST-SSZ Engine API by default, advances EIP-8189 snap-sync infrastructure, and moves partial persistence further into production paths.
The release also improves performance across block processing, historical-state RPC, pruning, transaction-pool updates, and peer discovery. On a 300M-gas BAL workload, storage-trie job parallelism reduced mean newPayload latency by 8.6% and state-root wait time by 39%.
Action Required
Operators with explicit engine persistence thresholds should review their configuration. The defaults are now 50 persisted blocks, 30 state-masking blocks, and 100 blocks of backpressure. A nonzero masking window must satisfy num-state-masking-blocks + memory-block-buffer-target < persistence-threshold (#27220).
• Set --engine.num-state-masking-blocks 0 to disable state masking (partial persistence).
• Set --engine.persistence-threshold 0 to preserve immediate persistence and disable state masking (partial persistence).
Operators which read the Reth database out-of-process should disable partial persistence by setting --engine.num-state-masking-blocks 0.
Update Priority
User Class
Priority
Payload Builders
Low
Non-Payload Builders
Low
Breaking Changes
Runtime and Configuration
• Raised the default persistence threshold from 7 to 50 blocks, enabled 30 blocks of state masking by default, and raised the backpressure threshold from 16 to 100 blocks. Partial persistence is now compiled unconditionally (#26800, #27220).
• Installed REST-SSZ routes on the authenticated Engine API server by default. Custom Engine API implementations must implement EngineSszApi (#26254).
SDK and RPC APIs
• Changed EthApiInner::new to accept a single EthApiSettings value instead of individual settings arguments. Custom RPC builders must update construction; existing builder setters and defaults remain available (#27251, #27268).
• Added the required in_memory_size cache field to the public EthPooledTransaction struct. Downstream users constructing it with struct literals must initialize the field; constructor users are unaffected (#27061).
• Replaced the layered transaction-announcement wrapper types with ordered TransactionAnnouncement, AnnouncedTransaction, and TransactionMetadata types. Downstream networking users of the previous public internals must migrate (#27021).
• Made eth_getMultiProof always return V2 proofs, including child branch nodes after extensions. The RPC method keeps its existing two-argument signature (#26851).
Features
Performance
• Ran storage-trie updates inside checked-out jobs, reducing mean newPayload latency and state-root wait time (#27156).
• Added opt-in caching and prewarming of RPC-computed BALs with --rpc-cache.cache-computed-bals and --rpc-cache.prewarm-bals[=BLOCKS]. (#24097).
• Reused RocksDB snapshots and iterators for historical-state lookups, reducing mean trace RPC latency, and CPU per request while increasing throughput (#27210).
• Skipped history shards that pruning cannot affect, improving mean pruning time (#26900).
• Limited transaction-pool fee updates to changed senders when possible, reducing a 0.25% sender update from 93 µs to 0.9 µs in a saturated-pool benchmark (#26956).
• Removed the one-second startup wait for discv5 boot-node ENR requests by moving them into the background (#26929).
• Reduced RPC memory and CPU overhead by windowing eth_getLogs scans, bloom-filtering log paths, lazily converting trace_get results, and sharing fee-history entries (#26946, #27000, #27031, #26942).
Partial Persistence
Reth now enables partial persistence by default. In this mode state/trie database keys are not updated in the database if later blocks contain updates to those same keys. Those later blocks are referred to as "state masking" blocks.
The new behavior, given default persistence parameters, is:
• --engine.persistence-threshold 50: Persistence is triggered once there are 50 blocks…