v2.11.0 is a hardfork, security and stability release on top of v2.10.3. It's the public release of v2.11.0-priv, which validators and major RPC providers already run.
Uburu hardfork
Already active on both networks:
| Network | Fork block |
|---|---|
| Amoy | 51978200
|
| Mainnet | 96787900
|
Uburu updates the StateReceiver genesis contract (0x…1001) at the fork block. It changes how state syncs are executed and recorded.
- Operators on
v2.11.0-priv: same code, switch tov2.11.0at your next maintenance window. - Nodes still on
v2.10.3or older stopped following the chain at the fork block. Upgrade immediately.
Highlights
- Consensus and state sync: state-sync records are fetched from Heimdall one page at a time, as the per-block budget admits them. A failed fetch now fails the block, where before it committed it without state syncs. Span lookups by block number follow Heimdall's rule (the highest-id span containing the block). Locally sealed blocks are checked against whitelisted milestones before they're written. Header verification bounds block numbers and base fees on every import path.
- Execution: BlockSTM bounds speculative work per block and falls back to serial execution when the bound is hit.
- Stateless / witnesses: witness messages are bounded on receive, and witness-caused import failures are charged to the peer that served the witness.
- State serving: snap range serving and state iterators no longer read superseded state layers.
- Txpool: PIP-15 conditional transactions are off by default. Overdraft checks count queued transactions that will be promoted.
- RPC and log index:
eth_feeHistoryno longer crashes on chains with blob fields but no blob schedule, and returns header base fees for historical blocks. Two reorg/rewind panics in the log indexer are guarded. Cancelledeth_getLogssearches release the log indexer promptly. - Networking: discv4 only uses bonded peers for endpoint prediction.
- Go toolchain 1.26.10.
Operator notes
[txpool] conditional(defaultfalse):bor_sendRawTransactionConditionalis refused unless enabled. Setconditional = trueif you serve it. When enabled,conditionallifetime(default5m) andconditionalslots(default10000) bound the conditional txs in the pool.- A node that can't reach Heimdall now stalls at sprint-end blocks until Heimdall answers. Before, it imported them without state syncs and then diverged.
- At startup, Bor indexes the post-Rio spans in the background. On mainnet that's about 3.1k sequential
GetSpancalls, and gRPC clients log one "Fetching span" line each.
What's Changed
- v2.11.0 candidate by @marcello33 in #2527
Full Changelog: v2.10.3...v2.11.0