Skip to content

v29.0.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 00:28
c292ba9

Important

Sepolia operators should run this release before Glamsterdam activates on Sepolia at 1791294816 (2026-10-06 13:53:36 UTC) — including those who already upgraded to v28.0.0 for the fork. It hardens how a node serves block access lists to peers, which every Sepolia node starts doing at the fork. Mainnet and Hoodi have no Glamsterdam time scheduled and are not affected by the deadline.

Warning

The stateless input format changed: sender public keys are no longer part of it, following the execution-specs change, and the stateless-validator guests move to ERE v0.18.1. Anything that produces or consumes ethrex's stateless input — external provers, zkEVM integrations — must move to this release together. Node operators who do not use the stateless input are unaffected.

Note

What's new

  • Block access list hardening: serving block access lists to peers is now bounded in work and memory, and counts toward the per-peer rate limit; responses to requests a connection never sent are dropped before they are decoded; and a block whose access list exceeds the EIP-7928 item cap is rejected without first processing that list.
  • Sync: snap sync pivots onto the forkchoice head instead of a guessed block number, and a canonical block is never marked bad because re-executing it failed.
  • Engine API and RPC: new engine_newPayloadWithWitnessV4; the raw transaction getters return the EIP-2718 envelope.
  • Stateless validation: stateless-validator guests upgraded to ERE v0.18.1, with the stateless input following the current specification.
  • Performance: the bytecode cache budget rises from 256 MiB to 2 GiB, with random eviction and per-entry overhead accounting. It is a ceiling — the cache only grows with code that blocks actually load — and --code-cache-size (ETHREX_CODE_CACHE_SIZE) lowers it on memory-constrained hosts. Block access list accounts are warmed in chunks, and mempool prewarming stops filling a slot once it reaches the code cache's budget.

No resync is needed.

Installation and running instructions can be found in our docs

✨ New Features

🐛 Bug Fixes

  • 8f0d260 - l1: keep the multisync monitor alive when a node answers only one diagnostics RPC (PR #7345 by @ilitteri)
  • a4e2226 - l1: end a mempool prewarm slot once it holds the code cache's budget of bytecode (PR #7356 by @ilitteri)
  • 2477c96 - l1: bound the work and memory of serving block access lists to peers (PR #7352 by @ilitteri)
  • de082c8 - l1,l2: bump zkevm tests to v21.0.1 and drop sender public keys from the stateless input (PR #7347 by @ilitteri)
  • 214f1e7 - l1: snap sync pivots onto the forkchoice head, not a guessed number (PR #7364 by @qu0b)
  • 7f251fc - l1: drop responses to requests a connection never sent before decoding them (PR #7358 by @ilitteri)
  • a534de6 - l1: return the EIP-2718 envelope from the raw transaction getters (PR #7327 by @ilitteri)
  • 5869102 - l1: charge each bytecode cache entry its fixed overhead (PR #7362 by @ilitteri)
  • 5ea41fd - l1: never mark a canonical block bad because re-executing it failed (PR #7334 by @ilitteri)
  • 41f5002 - l1: run a block whose BAL is over the EIP-7928 item cap on the sequential path (PR #7357 by @ilitteri)
  • 208aba0 - l1: keep global_asm! blocks from leaking their section state (commit by @MegaRedHand)
  • 33c8518 - l1: verify eth/71 block access lists against their headers in full sync (PR #7370)

⚡ Performance Improvements

  • 90c6000 - l1: raise the bytecode cache to 1 GiB and warm BAL accounts chunk by chunk (PR #7346 by @ilitteri)
  • 4b5ca80 - l1: evict a random bytecode cache entry and raise the budget to 2 GiB (PR #7350 by @ilitteri)