Warning
This release bumps the database schema (v3 → v4). The migration runs automatically at startup and rewrites nothing, so upgrading is a plain restart. It does mean a v26 datadir can no longer be opened by v25: rolling back after upgrading is not supported.
Note
What's new
- eth/72 sparse blobpool (EIP-8070) in the P2P layer, with pre-eth/72 peers still served correctly, and blob announcements no longer advertising bundles that have since been dropped.
- Platåberget public testnet is a named network (
--network plataberget). - New RPC surface:
net_listening,debug_getRawBlockAccessList, the remainingeth_namespace methods other clients serve, and EIP-8037 two-dimensional gas reported incallTraceroutput. - Sync robustness: the syncer no longer wedges while waiting for a forkchoice head, recovers instead of stalling when the head's post-state is unreachable, stops wasting full-sync cycles on the ePBS FCU/newPayload ordering race, and no longer fails a deep reorg on a missing pre-state at the pivot. Syncing peers can now fetch their head from us by non-canonical hash, and are told the earliest block we can actually serve instead of block 0.
- Discovery: external IP learned from discv4 PONGs, unsolicited discv5 NODES responses rejected, and the ENR fork id refreshed when the chain crosses a fork.
- Memory: the RocksDB block cache is sized from available memory instead of a fixed default.
- Database safety: a node restarted partway through a full-sync batch now recovers its state instead of reporting an unrecoverable database, and a datadir last written by a newer ethrex is refused with a clear version error rather than a misleading migration failure.
- Performance: cheaper cold contract-code access, O(1) BAL recorder checkpoints, batched BAL code prefetch, breadth-first trie-node prefetch on the storage-root path, and a faster LEVM memory hot path.
- Glamsterdam devnets: EIP-8037 state-gas accounting and the Engine API's handling of an undecodable block access list aligned with the devnet-8 test suite (devnets only; no effect on mainnet or public testnets).
- Correctness fixes in
eth_estimateGas,eth_getLogs,eth_getBlockByHashand receipt lookups; stateless-validator guests upgraded to ERE v0.16.2; L2 build and sequencer fixes.
No resync is needed.
Installation and running instructions can be found in our docs
✨ New Features
af2d467- l1: add the eth_ namespace methods other clients serve (PR #7201 by @ilitteri)6b0c1b7- l1: add net_listening RPC method (PR #7205 by @MysticRyuujin)c022136- l1: upgrade stateless-validator guests to ERE v0.16.2 (PR #7216 by @jsign)a779642- l1: add debug_getRawBlockAccessList and align BAL getter errors (PR #7069 by @edg-l)ad64b00- l1: learn external IP from discv4 PONGs via shared IpPredictor (PR #6811 by @edg-l)f764602- l1: report EIP-8037 two-dimensional gas in callTracer output (PR #7070 by @edg-l)94c5a04- l1: eth/72 sparse blobpool (EIP-8070) (PR #6776 by @edg-l)2c519f6- l1: add the Platåberget public testnet as a named network (PR #7240 by @ilitteri)3151b40- l1: add Platåberget to the multisync matrix (PR #7241 by @ilitteri)
🐛 Bug Fixes
db76a18- l2: stop the sequencer builder listing a recipient a failed authorization never reached (PR #7202 by @ilitteri)3248e36- l1: reject unsolicited discv5 NODES responses (PR #7204 by @ilitteri)e4ce252- l1: recapeth_estimateGasby the fee the balance check uses (PR #7206 by @jrchatruc)877058f- l1: spend blob cost out of the balanceeth_estimateGasrecaps against (PR #7209 by @jrchatruc)7ad398f- l1: advertise the earliest block we can actually serve (PR #7210 by @ilitteri)3b6c82d- l1: report a block whose receipts are absent instead of answering empty (PR #7208 by @ilitteri)5962a33- l2: pin the TDX qpl tool's crate resolution to the repo's lockfile (PR #7219 by @ilitteri)cc8065f- l1: refresh the eth forkid ENR entry when the chain crosses a fork (PR #7225 by @ilitteri)85a467e- l1: size the RocksDB block cache from available memory (PR #7093 by @edg-l)↘️ fixes issue #7092 opened by @barnabasbusa
46ff092- l1: stop wasting full sync cycles on the ePBS FCU/newPayload ordering race (PR #7022 by @ilitteri)86fcb96- l1: journal reconciliation pre-images at the reorg pivot (PR #7041 by @edg-l)bca1a26- l1: return the requested block from eth_getBlockByHash, not its canonical sibling (PR #7229 by @ilitteri)a0935d0- l1: recover instead of stalling when the head's post-state is unreachable (PR #7196 by @ilitteri)91cfe52- l1: serve GetBlockHeaders by non-canonical hash so syncing peers can fetch their head (PR #7230 by @ilitteri)2d217a2- l1: skip blob tx whose bundle is gone instead of announcing an empty-bundle size (PR #7235 by @qu0b)baee6e5- l1: release the syncer lock when waiting for a forkchoice head (sync wedge) (PR #6924 by @ilitteri)0b3621b- l1: return -32602 for eth_getLogs block ranges beyond head (PR #7236 by @MysticRyuujin)60012d4- l1: skip elided blob txs in pre-eth/72 announcements (PR #7237 by @ilitteri)6ab9381- l1: return INVALID for undecodable blockAccessList, bump Amsterdam fixtures to v8.1.3 (PR #7239 by @ilitteri)230158d- levm: repay spilled state gas from the reservoir when a child merges (EIP-8037, v8.1.4) (PR #7254 by @ilitteri)fcbc61d- l1: refuse a newer-schema database with a version error instead of a fake migration failure (PR #7259 by @ilitteri)d7a83d8- l1: recover a database whose head lags an interrupted full-sync batch (PR #7260 by @ilitteri)ee98e87- l1: do not cap the interrupted-batch recovery at one execute batch (PR #7261 by @ilitteri)
⚡ Performance Improvements
1d3b94f- l1: makeeth_estimateGas's plain-transfer short circuit fire (PR #7211 by @jrchatruc)e7876bb- l1: breadth-first batched trie-node prefetch in merkle storage-root path (PR #6986 by @edg-l)3ca8bc2- l1: cut the cost of cold contract-code access (PR #7095 by @edg-l)52f2021- l1: batch and stream the BAL code prefetch (PR #7099 by @edg-l)61affac- l1: make BAL recorder checkpoint O(1) via journal snapshots (PR #6667 by @edg-l)007882a- levm: unchecked memory hot path (PR #7119 by @iovoid)