Overview
Important
This is a recommended release for all op-reth operators. It contains the update to reth v2.6.0, which removes the block access list flags and changes several defaults, the removal of v1 historical-proofs storage, a fix that makes op-reth reject derived blocks with an invalid transaction so the rollup node replaces them with a deposits-only block, crash recovery for --proofs-history nodes, fixes for --rollup.historicalrpc lookups, and header extraData validation that matches op-geth.
Storage v1 is deprecated and will reach end-of-life in January 2027. See the notice for details.
op-reth v2.7.0 was tagged but never published, so its changes are listed here too. The CVE-2026-111943 certificate fixes from v2.6.1 are also in this release.
Breaking changes
- kona-node must be upgraded to v1.9.0 alongside op-reth (#23454). op-reth now answers
engine_forkchoiceUpdatedwith-38003(invalid payload attributes) when a derived block's transactions make it invalid. op-node already handles this. Earlier kona-node releases instead retry the same attributes forever, which stalls the safe head. Operators running op-reth with kona-node must upgrade both together. - Block access list options removed (#23046). OP blocks do not carry EIP-7928 block access lists, so op-reth exits at startup with "Block access list options are not supported by op-reth" if any of these flags is passed:
--rpc-cache.max-bals,--rpc-cache.cache-computed-bals,--rpc-cache.prewarm-bals,--engine.disable-bal-parallel-execution,--engine.disable-bal-parallel-state-root,--engine.disable-bal-batch-io, or--db.balstore-cache-sizeon any subcommand (node,db,init,prune,stage,proofs, ...). None of them had any effect on OP chains. Remove them from launch configuration before upgrading. The block access list RPC methods (eth_getBlockAccessList,eth_getBlockAccessListByBlockHash,eth_getBlockAccessListByBlockNumber,eth_getBlockAccessListRaw,debug_getRawBlockAccessList) return method not found (-32601). - Engine persistence threshold default raised from 7 to 50 (#23046). On default settings, op-reth now holds up to 50 blocks in memory past the last persisted block before writing them to disk, instead of 7, so memory use rises and more blocks are re-executed after an unclean shutdown.
--engine.memory-block-buffer-targetstill defaults to 5. Pass--engine.persistence-threshold 7to keep the previous behaviour. The threshold can now also be set withRETH_ENGINE_PERSISTENCE_THRESHOLD. --txpool.minimum-priority-feenow applies to local transactions (#23046). It used to reject only dynamic-fee transactions received over p2p. It now also rejects transactions submitted over RPC, including conditional transactions, so on a sequencer nearly every submission below the minimum now fails with an error. Sequencer operators who set this flag should check that the minimum is one they want enforced on RPC submissions.eth_getLogsreturns errors where it used to return[](#23046). A range whose receipts are missing returns error4444("pruned history unavailable"), for example pre-Bedrock ranges on a datadir created withop-reth init-state --without-ovm. AfromBlockbeyond the head returns-32602, which indexers that poll fromlastSeen + 1will hit on fast chains. RPC consumers must handle these errors.- Other flag changes from reth v2.6.0 (#23046).
--txpool.max-batch-size 0is now rejected at startup.--db.rocksdb-block-cache-sizenow takes effect, where it was previously ignored in favour of 128 MiB, so a node with a larger configured value will use more memory.--rpc-cache.max-headersis now a hidden no-op. - Historical-proofs v1 storage removed (#23067, #23328). v2 is now the only proofs-history storage format. A proofs-history node is on v1 if it never set
--proofs-history.storage-version, because v1 was the default, or if it set it tov1. op-reth refuses to start on a proofs database that holds only v1 data. To upgrade such a node, stop it, remove--proofs-history.storage-version=v1if set, delete the proofs database directory (or point--proofs-history.storage-pathat a fresh path), runop-reth proofs initwith this release's binary, and restart with--proofs-history. Runningop-reth proofs initwith an earlier binary creates a v1 database again, unless--proofs-history.storage-version=v2is passed to it. The new database serves proofs only from the initialization point forward, so plan for the retention window to refill. Nodes already on v2 need no change:--proofs-history.storage-version=v2is accepted as a no-op, and any other value is rejected. Leftover v1 tables in a v2 database are ignored, not deleted. They keep using disk space, are left out of theoptimism_proof_storage.table_sizeandtable_entriesmetrics, and produce a warning with their size each time op-reth opens the proofs database.
Chain Configuration
- GIWA Sepolia added to the built-in chains (#23511). op-reth now recognises
--chain giwa-sepolia(chain ID91342), and thesepolia-devnet-3devnet is added too. No existing chain's hardfork activation times change in this release.
Other changes
Block building and validation
- When a block derived from L1 contains a transaction that makes it invalid, op-reth now rejects the attributes at
engine_forkchoiceUpdated, and the rollup node replaces the block with a deposits-only one, as the derivation spec and the fault proof program do. Previously op-reth skipped an invalid transaction and built a block that the fault proof rejects, and an invalid post-execution (0x7D) transaction madeengine_getPayloadfail on every retry, stalling the safe head. For such attributes,debug_executePayloadnow returns the witness up to the invalid transaction, where the fault proof program stops. A payload build that fails to start for a reason other than invalid attributes now returns-32603instead of-38003, which op-node and kona-node retry (#23454) - Header
extraDatais now validated against the fork active at the block's timestamp, as op-geth does inengine_newPayload: empty before Holocene (except the Bedrock transition block), the Holocene encoding from Holocene, and the Jovian encoding from Jovian. Previously op-reth accepted such headers, which op-geth rejects (#22958) - A block that contains a post-execution (
0x7D) transaction on a chain where that transaction type is not active, or a malformed one, is now rejected asINVALIDbyengine_newPayload. The same block arriving as a buffered child is now marked invalid. Previouslyengine_newPayloadreturned an internal error, and connecting such a buffered block stopped the engine (#23186)
Proofs history
- After an unclean shutdown, a
--proofs-historynode no longer serveseth_getProoffrom a chain it has abandoned, and no longer crash-loops on aParentHashMismatchat the block after the proofs tip. At startup op-reth now rolls the proofs store back to the newest block it shares with the canonical chain, which replaces the manualop-reth proofs unwindrecovery. If no stored block is canonical, or the node's chain is behind the proofs window, startup fails and asks the operator to re-runop-reth proofs init. To keep that overlap, the proofs window no longer prunes past the node's last persisted block, so it can briefly exceed--proofs-history.window(#23358) op-reth proofs initnow refuses to start from a state trie that lags the node's chain tip (#23046)
RPC
- With
--rollup.historicalrpcconfigured, transaction, raw-transaction and receipt lookups that the historical endpoint answers withnull(or"0x"for a raw transaction, as geth returns) now continue to the local node, so pending pool transactions and flashblock receipts are no longer hidden by a historical miss (#23311) - With
--rollup.historicalrpcconfigured, a failed request for known pre-Bedrock data now returns the historical endpoint's JSON-RPC error, or an explicit error when the endpoint cannot be reached, instead of an answer from the incomplete local pre-Bedrock chain. Lookups by an unknown transaction or block hash still fall back to the local node when the historical endpoint fails (#23320) eth_createAccessListfor a legacy-style request now reportsgasUsedwith the discovered access list priced and warmed per EIP-2930. Previously the rerun kept the legacy transaction type, sogasUsedignored the access list (#23270)
Storage
- op-reth now logs a warning at startup when the main database still uses the Storage V1 layout. Support for Storage V1 will be removed in January 2027. The warning asks operators to stop the node and run
op-reth db migrate-v2with the same chain and data-directory arguments; snapshots are available as an alternative. This is unrelated to the historical-proofs storage format above, and Storage V2 nodes log nothing (#23042, #23219)
Upstream
- Update reth to v2.6.0, with backports of upstream fixes (#23046, #23454). Beyond the breaking changes above: new
--http.compressionand--http.decompressionflags choose the allowed HTTP response and request compression algorithms, and--authrpc.jwtsecret-hextakes the Engine API JWT secret inline.--rpc-cache.max-cached-tx-hashesnow defaults to 100000 instead of 30000. The defaultethwire protocol between upgraded peers moves frometh/69toeth/71, and older peers still connect at the highest common version. Each peer is now limited to 4096 announced transaction hashes, with announcements above that dropped, and--max-tx-pending-fetchnow also counts in-flight hashes. RocksDB keeps all table files open whenRLIMIT_NOFILEis at least 131072. reth v2.6.0's state masking stays off in op-reth:--engine.num-state-masking-blocks(andRETH_ENGINE_NUM_STATE_MASKING_BLOCKS) defaults to 0, and op-reth refuses to start with any other value
Full Changelog: op-reth/v2.6.1...op-reth/v2.8.0
🚢 Docker Image: