github 0xPolygon/bor v2.11.0

4 hours ago

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 to v2.11.0 at your next maintenance window.
  • Nodes still on v2.10.3 or 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_feeHistory no 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. Cancelled eth_getLogs searches release the log indexer promptly.
  • Networking: discv4 only uses bonded peers for endpoint prediction.
  • Go toolchain 1.26.10.

Operator notes

  • [txpool] conditional (default false): bor_sendRawTransactionConditional is refused unless enabled. Set conditional = true if you serve it. When enabled, conditionallifetime (default 5m) and conditionalslots (default 10000) 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 GetSpan calls, and gRPC clients log one "Fetching span" line each.

What's Changed

Full Changelog: v2.10.3...v2.11.0

Don't miss a new bor release

NewReleases is sending notifications on new releases.