github ethereum-optimism/optimism op-reth/v2.8.0
op-reth v2.8.0

latest release: op-dispute-mon/v1.6.4
3 hours ago

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_forkchoiceUpdated with -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-size on 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-target still defaults to 5. Pass --engine.persistence-threshold 7 to keep the previous behaviour. The threshold can now also be set with RETH_ENGINE_PERSISTENCE_THRESHOLD.
  • --txpool.minimum-priority-fee now 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_getLogs returns errors where it used to return [] (#23046). A range whose receipts are missing returns error 4444 ("pruned history unavailable"), for example pre-Bedrock ranges on a datadir created with op-reth init-state --without-ovm. A fromBlock beyond the head returns -32602, which indexers that poll from lastSeen + 1 will hit on fast chains. RPC consumers must handle these errors.
  • Other flag changes from reth v2.6.0 (#23046). --txpool.max-batch-size 0 is now rejected at startup. --db.rocksdb-block-cache-size now 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-headers is 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 to v1. 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=v1 if set, delete the proofs database directory (or point --proofs-history.storage-path at a fresh path), run op-reth proofs init with this release's binary, and restart with --proofs-history. Running op-reth proofs init with an earlier binary creates a v1 database again, unless --proofs-history.storage-version=v2 is 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=v2 is 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 the optimism_proof_storage.table_size and table_entries metrics, 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 ID 91342), and the sepolia-devnet-3 devnet 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 made engine_getPayload fail on every retry, stalling the safe head. For such attributes, debug_executePayload now 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 -32603 instead of -38003, which op-node and kona-node retry (#23454)
  • Header extraData is now validated against the fork active at the block's timestamp, as op-geth does in engine_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 as INVALID by engine_newPayload. The same block arriving as a buffered child is now marked invalid. Previously engine_newPayload returned an internal error, and connecting such a buffered block stopped the engine (#23186)

Proofs history

  • After an unclean shutdown, a --proofs-history node no longer serves eth_getProof from a chain it has abandoned, and no longer crash-loops on a ParentHashMismatch at 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 manual op-reth proofs unwind recovery. If no stored block is canonical, or the node's chain is behind the proofs window, startup fails and asks the operator to re-run op-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 init now refuses to start from a state trie that lags the node's chain tip (#23046)

RPC

  • With --rollup.historicalrpc configured, transaction, raw-transaction and receipt lookups that the historical endpoint answers with null (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.historicalrpc configured, 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_createAccessList for a legacy-style request now reports gasUsed with the discovered access list priced and warmed per EIP-2930. Previously the rerun kept the legacy transaction type, so gasUsed ignored 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-v2 with 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.compression and --http.decompression flags choose the allowed HTTP response and request compression algorithms, and --authrpc.jwtsecret-hex takes the Engine API JWT secret inline. --rpc-cache.max-cached-tx-hashes now defaults to 100000 instead of 30000. The default eth wire protocol between upgraded peers moves from eth/69 to eth/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-fetch now also counts in-flight hashes. RocksDB keeps all table files open when RLIMIT_NOFILE is at least 131072. reth v2.6.0's state masking stays off in op-reth: --engine.num-state-masking-blocks (and RETH_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:

Don't miss a new optimism release

NewReleases is sending notifications on new releases.