Summary
This release brings significant performance improvements to state root computation, resolves a problem with Base mainnet Merkle stage, and introduces opt-in ERA sync support and initial rollout of pre-merge history expiry.
The release also includes important OP Stack improvements with historical RPC forwarding for pre-Bedrock requrests and various RPC and EVM enhancements.
Additionally, we've revamped the documentation at reth.rs for better developer experience.
Highlights
Performance
This release boosts performance, achieving 15-20% faster block processing times on average.
- State root computation performance improved through optimized
U256
nybbles implementation (#16727) - Introduced incremental threshold mechanism in Merkle stage to prevent OOM issues during sync (#16178)
Pre-Merge History Expiry
This release integrates features for pre-merge history expiry.
With --prune.bodies.pre-merge
pre merge transactions are now deleted on launch (it is also possible to manually delete the static files for transactions pre merge).
This behaviour is currently still opt-in but will become the default behaviour for full nodes eventually.
With pre-merge history expiry, clients are allowed to no longer serve blocks pre merge over p2p. ERA sync allows new nodes to download pre-merge history (genesis to merge block (15,537,393)) using pre-validated ERA1 archive files instead of syncing from peers. Enable it with --era.enable
when starting a new node. ERA1 files are automatically downloaded from default hosts or can be provided locally with --era.path
. If you're starting a new sync, please give it a try.
- Introduced opt-in ERA sync support for pre-merge history via
--era.enable
flag for Sepolia and Mainnet (#16008) - Added
reth era export
command for ERA file generation (#15909) - Implemented pre-merge transaction file pruning to prepare for EIP-4444 history expiry (#16702)
OP Stack
- Added
--rollup.historicalrpc
CLI argument for op-mainnet historical RPC pre-Bedrock forwarding (#16941) - Fixed missing historical RPC endpoints for Optimism pre-Bedrock (#16976)
- Implemented median-based priority fee suggestion for Optimism (#16794)
Bug Fixes
- Fixed Base mainnet Merkle trie OOM issues during sync (#16178)
- Corrected beacon block root handling logic (#16767)
- Fixed max-tx-input-bytes propagation in CLI (#17066)
- Resolved empty withdrawals issue when parent has withdrawals root (#16980)
- Enforced EIP-2681 in transaction pool (#16967)
RPC and EVM Improvements
- Added
eth_sendRawTransactionSync
support (#16683) - Enhanced RPC type system with configurable middleware (#17024)
- Improved transaction request propagation across network types (#17025)
- Optimized EVM reuse in
eth_estimateGas
RPC calls (#16958)
Other Notable Changes
- Enhanced testing infrastructure with improved
eth/69
protocol coverage (#16759) - Added
eth/69
protocol support with proper version constants (#16880)
Compatible Dependencies
- alloy-primitives: 1.2.0
- alloy: 1.0.13
- op-alloy: 0.18.7
- revm: 26.0.1
- op-revm: 7.0.1
Update Priority
This table provides priorities for which classes of users should update particular components.
User Class | Priority |
---|---|
Payload Builders | medium |
Non-Payload Builders | medium |
See Update Priorities for more information about this table.
All Changes
- chore: bump version 1.5.0 (#17083)
- feat: add blanket impl for Receipt trait (#17082)
- fix(
docs/sdk
): heading hierarchy (#17079) - feat: convert reth-bench scripts to use uv script format (#17078)
- docs: error fixes for clarity (#17062)
- fix(
docs
): redo system reqs, fix links, rebrand to docs (#17071) - chore: bump alloy 1.0.13 (#17072)
- feat: include eth_sendRawTransactionSync in eth namesapce (#17070)
- docs: typo in comment for
get_pending_transactions_by_origin
(#17065) - fix(cli): propagate max-tx-input-bytes setting (#17066)
- docs: add libmdbx restriction to CLAUDE.md (#17060)
- refactor(examples): Use
TransactionEnvelope
macro fromalloy
forCustomTransaction
in thecustom-node
example (#17057) - chore: bump alloy patches (#17067)
- feat(trie): add assert_eq_parallel_sparse_trie_proof_nodes (#17052)
- docs: fix typo "takes effect" (#17053)
- chore: delete reth-performance dashboard (#16635)
- chore: Add precompile cache hit rate graph to grafana overview (#17055)
- feat: make jwt-secret argument consistent across reth-bench commands (#17050)
- chore: use earliest block number (#17044)
- chore: use payload_builder target (#17049)
- perf(trie): implement
ParallelSparseTrie::root
method (#17030) - chore: fix typo execution.rs (#17004)
- feat: introduce reth era export (#15909)
- fix(
docs
): banner on landing (#17048) - docs: fix errors and correction (#17047)
- fix(
docs
): broken links for images on landing (#17043) - chore(
ci
): rm concurrency from book workflow (#17038) - docs: fix typo in transaction expiration comment (#17037)
- chore: fix spelling errors (#17029)
- refactor(rpc): replace
ExtendedTxEnvelopeRepr
withExtendedRepr
inserde_bincode_compat
(#17033) - feat: add --rollup.historicalrpc CLI argument for op-reth (#16941)
- chore(
book
): migrate to vocs (#16605) - fix: correct typo “reseipt” → “receipt” in serde_bincode_compat tests (#17034)
- feat: prune pre merge transaction files (#16702)
- chore(trie): rephrase the log about storage proof task result sending (#17032)
- refactor(trie): introduce
SparseSubtrieInner::rlp_node
method (#17031) - feat(rpc): Propagate the RPC transaction request from
Network
andRpcTypes
(#17025) - feat: add configurable RPC middleware to RpcAddOns (#17024)
- chore: enable state root task in engine tree unit tests (#17023)
- feat(tx-pool): add getter methods for
EthTransactionValidator
internal fields (#17022) - docs: update outdated validtor docs (#17027)
- chore: remove unused for<'a> (#17026)
- feat: add codec re-exports to reth-op and reth-ethereum (#17020)
- chore: re-export op hardforks from op chainspec (#17018)
- perf(trie):
SparseSubtrie::update_hashes
(#16943) - feat: allow access to db via NodeBuilder (#17021)
- perf(trie): Place the root nodes of the lower SparseSubtries in those tries (#17011)
- refactor(rpc): rename crate reth_rpc_types_compat → reth_rpc_convert (#17019)
- revert: test: special case for nibbles implementations of
Compact
(#17006) (#17012) - feat(rpc): Add
TransactionRequest
intoRpcTypes
(#17017) - refactor(rpc): Rename crate
reth_rpc_types_compat
=>reth_rpc_convert
(#17013) - perf:
U256
nybbles (#16727) - docs(rpc): Add documentation for
RpcConverter
(#17010) - chore: rm standalone fn (#17007)
- refactor(rpc): Rename
TransactionCompat
=>RpcConvert
(#17009) - docs: rephrase RpcNodeCore docs (#17005)
- chore: add size field in the new_header_stream method (#17008)
- test: special case for nibbles implementations of
Compact
(#17006) - chore: simplify
RpcConverter
(#17002) - chore: rm unused eof variant (#17001)
- docs: improve ConfigureEvm trait documentation (#16937)
- refactor: introduce OpFullNodeTypes helper trait to reduce bound duplication (#16431)
- feat: bump revm v26 (#16969)
- docs: improve payload primitives documentation (#16986)
- feat(test): rewrite test_engine_tree_live_sync_transition_eventually_canonical using e2e framework (#16972)
- chore: fix typo bootnode.rs (#16995)
- chore: changed example command (#16993)
- docs: add
reth_fs_util
suggestion instead ofstd::fs
to claude doc helper (#16992) - chore(deps): weekly
cargo update
(#16987) - docs: fix error in HARDFORK-CHECKLIST.md (#16989)
- chore: use from conversion for txkind (#16990)
- feat: add rpc header compat (#16988)
- feat(rpc): Replace associated type
Transaction
withNetwork
inTransactionCompat
(#16973) - chore: simplify test HttpClient implementations (#16985)
- fix: use empty withdrawals if parent has withdrawals root (#16980)
- chore: relax localpending block bounds (#16979)
- chore(era): complete doc for
ClientWithFakeIndex
(#16984) - feat: add From impl for RecoveredBlock from blocks with recovered transactions (#16983)
- refactor: remove CallFees re-export and relocate tests (#16981)
- chore: remove unused features (#16963)
- chore(sdk): Add default for noop component (#16570)
- fix: Improve comment in historical RPC tests (#16971)
- feat(transaction-pool): enforce EIP-2681 (#16967)
- perf(rpc): optimize EVM reuse in
eth_estimateGas
(#16958) - feat(era): Attach file name and path to checksum error (#16974)
- fix: add missing historical RPC endpoints for Optimism pre-bedrock (#16976)
- chore(merkle): add debug log inside incremental loop (#16977)
- chore: resolve unused import warning in reth RPC API subscription attribute (#16975)
- chore: propagate inner error in ef tests (#16970)
- revert: "ci: pin nextest version" (#16890)
- fix: check if dir exists before removing (#16968)
- chore(trie): Replace magic numbers in ParallelSparseTrie code (#16960)
- chore: feature gate all op rpc types compat impl (#16964)
- chore: use revm tx trait directly (#16961)
- chore: update codeowners (#16957)
- chore: remove duplicate callfees (#16955)
- feat(test): rewrite test_engine_tree_live_sync_fcu_extends_canon_chain using e2e framework (#16949)
- bench: disable sparse trie update bench as it's flaky (#16953)
- perf(trie):
ParallelSparseTrie::update_subtrie_hashes
boilerplate (#16948) - chore: add node synced helper (#16928)
- chore: move parallel sparse trie to its own crate (#16950)
- perf: Reduce unnecessary MDBX transaction creation when constructing StateProvider (#16884)
- bench(trie): prepare trie outside of routine, use large input size (#16945)
- perf: Reuse CachedPrecompileMetrics across block executions (#16944)
- feat: require only account & bytecode reader for tx validation (#16930)
- perf(trie):
ParallelSparseTrie::reveal_node
(#16894) - feat: add Historical RPC Forwarder Service (#16724)
- test: flaky connection test (#16939)
- perf(trie): box subtries in parallel sparse trie (#16938)
- chore: Expose payload_id (#16931)
- chore: add type alias for PayloadAttributes (#16933)
- docs: Fix Typo in DebugNode Trait Documentation (#16932)
- chore(tx-validation): remove redundant validate methods (#16929)
- perf(trie):
ParallelSparseTrie::get_changed_subtries
method (#16908) - feat(test): rewrite test_engine_tree_buffered_blocks_are_eventually_connected using e2e framework (#16830)
- chore: remove unused approx_capacity_get_pooled_transactions_req (#16907)
- chore(net): document test_trusted_peer_only, fix incoming local_addr (#16925)
- deps: update alloy dependencies to latest patch versions (#16922)
- chore(engine): add log showing which root algorithm is being used (#16924)
- chore(trie): add more stubs for ParallelSparseTrie (#16918)
- fix: typos in documentation and source code (#16916)
- chore: add missing receipts69 handling (#16913)
- docs: improve transaction-related trait documentation (#16920)
- feat(alloy-provider): stub out required trait implementations (#16919)
- docs(trie): mention that SparseSubtrie path is a full path (#16917)
- fix: allow eth69 block propagation (#16915)
- feat: load KZG settings on EthTransactionValidator startup (#16889)
- fix: prevent invalid range in fee_history when newest_block is pending (#16910)
- refactor(rpc): Delegate
FromConsensusTx
conversion forEthereumTxEnvelope
toalloy
(#16909) - chore: added all version const (#16880)
- feat(trie): Embed a SparseSubtrie into the ParallelSparseTrie as its upper trie (#16905)
- feat: sparse trie update benchmarks (#16748)
- docs: improve reth-primitives-traits documentation (#16870)
- feat(trie): sparse subtrie type (#16903)
- chore: add @mediocregopher to trie codeowners (#16904)
- feat: add from_root for ParallelSparseTrie (#16865)
- feat: add newPayload throughput and total gas charts to Grafana (#16901)
- feat: add abstractions for permit in metered channel (#16882)
- fix: move
bytecode_by_hash
fromStateProvider
to a dedicatedBytecodeReader
(#16886) - chore(tx-pool): use max_blobs_per_tx in validating eip4844 txs (#16888)
- perf(era): Skip download if ERA file with verified checksum exists (#16804)
- feat: added experimental eth_sendrawtransaction endpoint (wip) (#16683)
- test: add walk_dup test with not existing key (#16562)
- ci: pin nextest version (#16887)
- docs: enhance DebugNode trait documentation (#16872)
- fix(op-reth, rpc): eth_getBlockReceipts err for genesis block in op-reth (#16879)
- fix(test): handle getting the last base_fee_per_gas (#16881)
- chore: add block gas limit to block added log (#16875)
- feat: introduced loop with range of chunks in the incremental root stage (#16178)
- fix(pipeline): prevent unwind beyond history limits (#16593)
- feat(engine): Compare sorted trie updates in witness invalid block hook#15689 (#16481)
- feat(trie): Decode storage proofs in parallel tasks (#16400)
- feat: add CLAUDE.md (#16864)
- feat: use configurable instance label for overview dashboard (#16633)
- feat: introduce script to compare reth-bench latency CSVs (#16862)
- refactor: used new fn earliest_block_number for ::Earliest tag (#16859)
- chore: add rpc-compat feature in reth primitives-traits (#16608)
- fix(provider): fix doc comments errors (#16749)
- fix: dead link in tracking-state.md (#16857)
- fix: handle forced propagations (#16845)
- test(chainspec): Test conversion from blob params in genesis config (#16854)
- perf: avoid duplicate peer lookup (#16846)
- feat(rpc): Replace manual
IntoRpcTx
implementation withFromConsensusTx
using an additional generic (#16855) - feat(rpc): Implement
FromConsensusTx
for genericOpTransaction
(#16832) - perf: Reduce unnecessary memory copies in
compare_storage_trie_updates
(#16841) - docs: update comment for is_eip7702() method (#16852)
- chore: bump alloy 1.0.11 (#16853)
- feat: add RlpBincode helper (#16849)
- chore: use earliest block number from provider (#16848)
- chore: bump alloy (#16828)
- feat(era): Delete files outside the range before counting them (#16805)
- chore(ci): pin kurtosis-op optimism package (#16842)
- refactor: replaced update_status with update_block_range (#16840)
- feat: introduced fn earliest_block_number for BlockNumReader (#16831)
- chore(deps): bump dawidd6/action-homebrew-bump-formula from 4 to 5 (#16838)
- chore(deps): bump dprint/check from 2.2 to 2.3 (#16839)
- deps: Upgrade
op-alloy
version0.18.2
=>0.18.3
and all other deps minor versions (#16835) - feat: add parallel sparse trie skeleton (#16837)
- perf: reuse accounts trie in payload processing (#16836)
- docs: clarify txpool docs (#16833)
- revert: "perf: reuse accounts trie in payload processing (#16181)" (#16834)
- feat(rpc): Add
FromConsensusTx
and implementIntoRpcTx
for generic RPC transaction (#16784) - chore: update op-alloy deps to 0.18.2 (#16827)
- perf: reuse accounts trie in payload processing (#16181)
- fix: validate BlockRangeUpdate message per devp2p spec (#16826)
- feat(network): Added Option for dispatching range updates to remote peer (#16776)
- feat: add alloy-provider crate for RPC-based state access (#16809)
- fix: make
EthPubSub
pub to allow composition and fallback overrides (#16823) - chore(op/cli): Rm unused cli arg
rollup.enable-genesis-walkback
(#16824) - feat: integrate tracing helpers (#16466)
- perf(cli): Start from next block based on imported headers in
import-era
command (#16803) - feat: relax EthereumAddons trait bounds to support generic validators (#16816)
- refactor(era): Remove
start_from
fromEraClient
and use it instead of last file index (#16801) - feat(test): rewrite test_engine_tree_reorg_with_missing_ancestor_expecting_valid using e2e framework (#16761)
- feat: re-export MerklePatriciaTrie from reth-ethereum and reth-op (#16814)
- fix: change some rpc response codes to eth invalid input (#16745)
- fix(era): Commit all writers and save stages checkpoint per file in
import
(#16810) - feat(stateless): simplify
Database
implementation forWitnessDatabase
(#16820) - feat(examples): Add
extension
intoengine_getPayload
RPC method response incustom_node
example (#16772) - chore(deps): weekly
cargo update
(#16719) - feat(op): export OpEthApiBuilder from reth-optimism-rpc (#16815)
- chore: removed legacy.rs (#16817)
- feat(gas_oracle): implement median-based priority fee suggestion for Optimism (#16794)
- docs: document transaction flow into the pool (#16777)
- feat: make
EthereumEngineValidator
generic overChainSpec
(#16812) - feat: add to_message convenience method to BlockRangeInfo (#16778)
- fix: typo in test comment (#16811)
- feat(era): Accept anything that converts into
Box<Path>
asfolder
ofEraClient
(#16802) - test: add eth69 request/response tests (#16806)
- feat(rpc): Implement
IntoRpcTx
with Ethereum RPC transaction response forExtended
(#16783) - feat(examples): Add
CustomEngineValidator
and its builder to thecustom_node
example (#16774) - feat(cli): Create
folder
and all its parents beforeimport
inimport-era
command (#16800) - chore: bump inspectors 0.24 (#16797)
- feat(cli): Create
folder
in chain specific data directory forimport-era
command (#16799) - feat: make EthereumConsensusBuilder generic over chainSpec (#16793)
- chore: re-export network types (#16789)
- chore: re-export more op types (#16788)
- chore: pin hive and add test to expected failures (#16790)
- feat: introduce 10s timeout when resolving external ips (#16787)
- feat(net): make bloom filter optional on receipts request (#16718)
- chore(deps): Upgrade proptest to 1.7 (#16786)
- fix: resolve external ip on launch (#16768)
- feat: introduce RPC error for pruned history (#16780)
- fix(era): Rollback state of
StartingStream
if fetching file list fails (#16775) - chore: fix hive unexpected test filter (#16782)
- feat: make EthEvmConfig generic over chainSpec (#16758)
- feat: ensure ETL data directory is cleared on launch (#16770)
- test(trie): fix stored nibbles tests (#16769)
- fix: set parent beacon block to zero hash if parent's beacon block is Some (#16767)
- test: improve ETH69 protocol test coverage (#16759)
- chore: update hive expected failures (#16764)
- feat: add shared local block range info between SessionManager and ActiveSession (#16763)
- feat(rpc): Add
TxEnv
conversion function intoRpcConverter
(#16750) - ci(sync): Change schedule to run once every 6 hours (#16754)
- ci: Add
sync-era
workflow that syncs with ERA stage enabled (#16751) - fix: small networking fixes (#16742)
- feat: reintroduce generic executors (#16741)
- feat: Add info logs for beginning of newPayload requests (#16463)
- chore: relax eth network builder (#16714)
- chore: make ethpool alias generic over tx (#16713)
- chore: keep .git folder in docker (#16733)
- chore(ci): update hive expected failures (#16737)
- feat: remove preemptive excess blob gas check (#16729)
- feat(rpc): Implement
TransactionCompat
for generic RPC response builder (#16694) - test: multi-node support in e2e testsuite (#16725)
- feat: added closure and relaxed setup_without_evm function (#16720)
- perf: remove redundant clones (#16716)
- feat: fn that replaces and merges network module's endpoints (#16619)
- feat: added Body::contains_transaction(&TxHash) (#16715)
- chore: re-export cli-util crate (#16711)
- chore: re-export all types in node mod (#16710)
- chore: depreacte ethexecutorbuilder (#16709)
- chore: remove accidentally commited files (#16708)
- feat(test): rewrite test_engine_tree_valid_and_invalid_forks_with_older_canonical_head_e2e using e2e framework (#16705)
- feat: add block range hint to BlockBodies download request (#16703)
- feat(stages): Add ERA pre-merge history import stage (#16008)
- feat(test): rewrite test_engine_tree_valid_forks_with_older_canonical_head using e2e framework (#16699)
- chore: revert docker compose volume renames (#16688)
- feat: introduce supported range to Peer info (#16687)
- feat: add always-process-payload-attributes-on-canonical-head config (#16676)
- feat(test): rewrite test_engine_tree_fcu_reorg_with_all_blocks using e2e framework (#16692)
- fix: correctly set sync gap (#16695)
- perf(pipeline): speed up fork unwinding with exponential backoff (#16622)
- fix: ensure that downloader sync gap is only set once (#16693)
- chore: remove noisy log (#16691)
- feat: introduced NoopPayloadServiceBuilder (#16667)
- perf(engine): enable precompile cache by default (#16685)
- fix: use correct sender_id_or_create as intended (#16684)
- refactor: replace unbounded HashMap with LruMap in precompile cache (#16326)
- feat(test): rewrite test_engine_tree_fcu_canon_chain_insertion using e2e framework (#16678)
- chore: add remaining snap request trait functions (#16682)
- ci: do not check version for release dry runs (#16679)
- feat: cross-compile to RISC-V (#16426)
- docs: Fix typos in documentation and README (#16677)
- chore: extract engine tests to separate file (#16671)
- chore: Add metrics for supervisor RPC error (#16111)
- chore(ci): unpin teku image for kurtosis-op ethereum-package (#16670)
- feat(era): Implement retry policy for HTTP client downloader (#16664)
- perf: remove some clones around
eth_call
(#16665) - feat(GasOracle): new function to compute median (#16645)
- refactor(txns): inline validation logic and remove validation.rs (#16668)
- chore: relax primtives types bound (#16663)
- refactor: simplify
--dev
setup (#16662) - feat: Added Socket Address to the network discovery error (#16659)
- feat: make RpcAddOns::launch_add_ons_with composable (#16646)
- ci: remove build-release-binaries.yml workflow (#16658)
- ci: check Cargo version against Git tag in release.yml (#16657)
- feat(txns): Implement flexible TxType filtering policy in TransactionManager (#16495)
- chore: bump version 1.4.8 (#16655)
- chore: used Opstorage impl for optimism (#16594)
- refactor: unify pending_block fn (#16596)
- chore: downgrade warn log (#16649)
- feat: trigger resolution task when multiple connection failures occur for a trusted peer (#16652)
- chore: add Hoodi to docker compose files, fix checkpoint sync URLs (#16653)
- chore: bump default gas limit 60M mainnet (#16650)
- perf: use already recovered signer (#16640)
- ci: use different names for latest and RC Docker jobs (#16654)
- feat: configure interval for trusted peer DNS resolution (#16647)
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-v1.5.0-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
aarch64 | reth-v1.5.0-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
x86_64 | reth-v1.5.0-x86_64-pc-windows-gnu.tar.gz | PGP Signature | |
x86_64 | reth-v1.5.0-x86_64-apple-darwin.tar.gz | PGP Signature | |
aarch64 | reth-v1.5.0-aarch64-apple-darwin.tar.gz | PGP Signature | |
Docker | paradigmxyz/reth | - |
OP-Reth
System | Architecture | Binary | PGP Signature |
---|---|---|---|
x86_64 | op-reth-v1.5.0-x86_64-unknown-linux-gnu.tar.gz | PGP Signature | |
aarch64 | op-reth-v1.5.0-aarch64-unknown-linux-gnu.tar.gz | PGP Signature | |
x86_64 | op-reth-v1.5.0-x86_64-pc-windows-gnu.tar.gz | PGP Signature | |
x86_64 | op-reth-v1.5.0-x86_64-apple-darwin.tar.gz | PGP Signature | |
aarch64 | op-reth-v1.5.0-aarch64-apple-darwin.tar.gz | PGP Signature | |
Docker | paradigmxyz/op-reth | - |