0xPolygon/bor - v2.10.2 New

Published: Sep 30, 2026

Release Summary

Bor v2.10.2 is here, focusing on performance, propagation latency, and network stability. This release includes two major new experimental features: WIT2 and the Sequence Store. It is a recommended upgrade for all node operators.

This version is a drop-in replacement, requiring no hardfork, database changes, or resync. It also incorporates all fixes from previous hotfix releases v2.10.1-hotfix and v2.10.1-hotfix2.

WIT2: Faster Witness Propagation

This release introduces WIT2, a new protocol for witness propagation. Block producers now sign witness announcements, allowing peers to relay them instantly without needing to execute the block first. This significantly cuts down milestone-vote latency for multi-hop stateless validators. The network supports a mix of WIT1 and WIT2 nodes, allowing for a gradual rollout.

Operator Note: To take advantage of WIT2, upgrade all WIT2-capable nodes (validators and sentries) in a single window, as older beta versions (`v2.10.2-beta`, `-preconf`, `-preconf2`) use an incompatible wire format. Clef users must also whitelist the application/x-bor-wit2-announce mimetype for the producer to generate signed WIT2 announcements.

Pipelined State Root Computation for Faster Imports

A new experimental pipeline for state root computation (SRC) is available to boost block import performance. It overlaps the SRC of block N with the execution of block N+1, which can increase catch-up sync speed by 15-19%. This feature is disabled by default.

To enable it, set [pipeline] enable-import-src = true in your config.

Sequence Store and Preconfirmation RPCs

Another major experimental feature allows block producers to publish the block lifecycle to a sequence store. This provides a new preconfirmation RPC surface for applications to get transaction receipts before canonical inclusion. The feature includes an audit mechanism to verify preconfirmations for periods when a node was offline. This feature is disabled by default.

To enable it, set [sequencer] enabled = true and configure the publisher/consumer endpoints. New RPCs include eth_sendRawTransactionForPreconf and bor_getPreconfTransactionReceipt.

Network Stability and Sync Hardening

Several improvements have been made to harden P2P networking and sync:

P2P Traffic Control: Implements bounded per-peer reply queues, controlled transaction rebroadcasting, and a mechanism to retry dangling transaction-fetch peers instead of permanently excluding them.

Stateless Verification Self-Heal: Nodes can now automatically detect and recover from missing contract code during stateless verification, fetching the missing code from peers instead of failing with a consensus divergence error.

Sync Fixes: Sync is more resilient, with better handling of unfillable skeletons and retries after peer-set changes. A bug that could cause a node to switch to snap sync during a rewind (`SetHead`) has been fixed.

Other Important Changes

Docker Hub Images Discontinued: Docker images are no longer published to Docker Hub. Please update your deployment scripts to use the official GHCR (GitHub Container Registry) images.

Go Toolchain: The Go toolchain has been upgraded to version 1.26.8, which includes several security fixes for the standard library.

New Configuration Options (Opt-in):
[pipeline]: enable-import-src, import-src-logs, warm-snapshot
[sequencer]: enabled, publisher-endpoint, consumer-endpoint, poll
rpc.txsync.maxconcurrent: Sets a cap on concurrent eth_sendRawTransactionSync calls waiting for a receipt (default 4096).

Release Notes

v2.10.2 brings WIT2 (BP-signed witness announcements with transitive relay), pipelined state root computation for block import (disabled by default), the sequence store / preconfirmation pipeline (disabled by default), and a set of p2p, sync and RPC hardening fixes. It also carries every fix shipped in `v2.10.1-hotfix` and `v2.10.1-hotfix2`.

No hardfork, no database schema change, no resync required.

## Highlights

- **WIT2 witness propagation** (#2208, #2416, #2417): block producers sign each witness announcement; peers verify and relay it without executing the block, and serve witnesses pre-import. Cuts multi-hop milestone-vote latency for stateless validators. Mixed WIT1/WIT2 meshes are supported.
- **Pipelined state root computation on import** (#2180, #2371): overlaps SRC of block N with execution of block N+1. Off by default, enable with `[pipeline] enable-import-src = true`.
- **Sequence store and preconfirmations** (#2373, #2419, #2388, #2423 and follow-ups): block producers can publish the block lifecycle to a sequence store, with preconfirmation RPCs (`eth_sendRawTransactionForPreconf`, `bor_getPreconfTransactionReceipt`, `bor_getInvalidPreconfBlocks`). Off by default, enable with `[sequencer] enabled = true`.
- **P2P traffic control** (#2418, #2367): bounded per-peer reply queues and allowances, controlled tx rebroadcast, and dangling tx-fetch peers are retried instead of excluded forever.
- **Stateless verification self-heal** (#2401): detects and recovers from missing contract code instead of reporting it as a consensus divergence.
- **Sync fixes** (#2389, #2391, #2456, #2398, #2399, #2435): unfillable skeletons are classified as invalid, sync retries after peer-set replacements, no switch to snap sync in the middle of `SetHead`, plus the forward-ported #2429 / #2432 downloader and whitelist fixes.
- **Go toolchain 1.26.8** (#2420) and dependency bumps (grpc 1.83.2, pion dtls/stun, amqp091-go, otel).

## Fixes included from v2.10.1-hotfix / v2.10.1-hotfix2

- `core`: state sync data is read under the already-held `stateSyncMu`, removing a lock-ordering stall between block import and the miner (backport of #2371).
- `eth/downloader`: sync penalty exemptions restricted to trusted peers (#2429).
- `eth/downloader/whitelist`: re-import of canonical blocks below the whitelisted entry is accepted (#2432).

## Operator notes

- **Upgrade all WIT2-capable nodes in one window.** The signed-announce wire format changed after `v2.10.2-beta`, `v2.10.2-preconf` and `v2.10.2-preconf2`. Nodes still on those tags and nodes on v2.10.2 will drop connections with each other until everything runs the same format. Nodes coming from v2.10.1 are unaffected.
- **Clef users**: whitelist the `application/x-bor-wit2-announce` mimetype, otherwise the producer falls back to unsigned WIT1 announcements.
- **New config / flags** (all opt-in, defaults keep current behaviour):
  - `[pipeline]`: `enable-import-src` (default `false`), `import-src-logs` (default `false`), `warm-snapshot` (default `true`, only takes effect when import SRC and witnesses are both on).
  - `[sequencer]`: `enabled` (default `false`), `publisher-endpoint`, `consumer-endpoint`, `poll` (default `200ms`).
  - `rpc.txsync.maxconcurrent`: cap on `eth_sendRawTransactionSync` calls waiting for a receipt at once (default `4096`, `0` = no limit).
- Docker images are no longer published to Docker Hub (#2372).

## What's Changed
* core, miner, consensus/bor, eth, triedb/pathdb: pipelined state root computation for block import by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2180
* ci: bump kurtosis-pos pin and Actions versions in kurtosis workflows by @kamuikatsurgi in https://github.com/0xPolygon/bor/pull/2370
* core, miner: fix nightly pipeline race failures by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2371
* tests/bor: harden test peering against simultaneous-connect collisions by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2369
* ci: add pipeline-enabled kurtosis e2e leg (POS-3697) by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2368
* Removing support to publish images on dockerhub by @0xsajal in https://github.com/0xPolygon/bor/pull/2372
* ci: bump kurtosis-pos pin to v1.4.2 by @marcello33 in https://github.com/0xPolygon/bor/pull/2377
* build: increase race-test package timeout by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2378
* eth, eth/fetcher, eth/protocols/eth: retry dangling tx-fetch peers instead of excluding them forever by @marcello33 in https://github.com/0xPolygon/bor/pull/2367
* ci: run kurtosis E2E safely on fork PRs by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2380
* chore(ci): upgrade to codegenie@v0.5.6 by @0xPolygonBot in https://github.com/0xPolygon/bor/pull/2379
* eth/protocols/wit, consensus/bor: WIT2 — BP-signed witness announcements with transitive relay and pre-import serving by @lucca30 in https://github.com/0xPolygon/bor/pull/2208
* build(deps): bump github.com/pion/dtls/v3 from 3.0.11 to 3.1.4 by @dependabot[bot] in https://github.com/0xPolygon/bor/pull/2338
* build(deps): bump github.com/pion/stun/v3 from 3.1.1 to 3.1.5 by @dependabot[bot] in https://github.com/0xPolygon/bor/pull/2339
* consensus/bor: don't leak the live tracer into non-import system transactions by @nebojsa94 in https://github.com/0xPolygon/bor/pull/2353
* rpc, ethapi: release the execution slot while eth_sendRawTransactionSync waits by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2385
* core/blockstm, core: exclude base-code senders from V2 nonce pre-compute; harden witness parity harness by @cffls in https://github.com/0xPolygon/bor/pull/2383
* eth, core: add sequence store preconfirmation pipeline and RPC support by @rukimedo in https://github.com/0xPolygon/bor/pull/2373
* build(deps): bump github.com/rabbitmq/amqp091-go from 1.10.0 to 1.13.0 by @dependabot[bot] in https://github.com/0xPolygon/bor/pull/2384
* build(deps): bump google.golang.org/grpc from 1.79.3 to 1.83.1 by @dependabot[bot] in https://github.com/0xPolygon/bor/pull/2381
* eth: avoid race in relay-fetch test setup by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2387
* v2.10.1 to master by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2390
* rpc: fix rpc_ep_workers_http being stopped on first request by @ChanHongMing in https://github.com/0xPolygon/bor/pull/2364
* eth, eth/sequencer: serve head-state pending in the preconf import gap by @cffls in https://github.com/0xPolygon/bor/pull/2393
* eth: preserve preconfirmation RPC availability by @rukimedo in https://github.com/0xPolygon/bor/pull/2394
* eth/downloader: classify unfillable skeletons as invalid by @rukimedo in https://github.com/0xPolygon/bor/pull/2389
* build(deps): bump google.golang.org/grpc from 1.83.1 to 1.83.2 by @dependabot[bot] in https://github.com/0xPolygon/bor/pull/2395
* eth: retry sync after peer-set replacements by @rukimedo in https://github.com/0xPolygon/bor/pull/2391
* eth/sequencer: cap coalesced published records at the store message limit by @cffls in https://github.com/0xPolygon/bor/pull/2400
* eth/downloader/whitelist: bound fork-check slice preallocation by @kriss39 in https://github.com/0xPolygon/bor/pull/2398
* eth/downloader/whitelist: keep valid result meters monotonic by @kriss39 in https://github.com/0xPolygon/bor/pull/2399
* sequencer: stop paying for a store that is not answering by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2406
* build: bump Go toolchain to 1.26.8 by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2420
* sequencer, rawdb, ethapi: audit the store for the window a node did not watch by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2388
* ci: notify Slack when the nightly govulncheck fails by @pratikspatil024 in https://github.com/0xPolygon/bor/pull/2421
* core/txpool, eth, p2p: control rebroadcast and peer traffic by @rukimedo in https://github.com/0xPolygon/bor/pull/2418
* core, eth: detect and self-heal missing contract code on stateless verification by @lucca30 in https://github.com/0xPolygon/bor/pull/2401
* build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc from 1.37.0 to 1.45.0 by @dependabot[bot] in https://github.com/0xPolygon/bor/pull/2424
* eth/sequencer, ci: trip read breaker on a frozen store tail; add kurtosis sequencer e2e leg by @cffls in https://github.com/0xPolygon/bor/pull/2423
* Block sequencing  by @cffls in https://github.com/0xPolygon/bor/pull/2419
* eth, eth/fetcher: bound witness page count by the gas-derived ceiling instead of a cross-peer vote by @lucca30 in https://github.com/0xPolygon/bor/pull/2417
* eth/sequencer, rawdb: record served preconfirmations to close the open-block loss window by @kamuikatsurgi in https://github.com/0xPolygon/bor/pull/2427
* eth/sequencer: don't falsely invalidate state-sync blocks by @kamuikatsurgi in https://github.com/0xPolygon/bor/pull/2428
* eth/protocols/wit, eth: WIT2 size oracle — accept non-deterministic witnesses within a signed size band by @lucca30 in https://github.com/0xPolygon/bor/pull/2416
* eth/sequencer: number preconfirmation logs per block by @cffls in https://github.com/0xPolygon/bor/pull/2430
* eth/downloader, eth/downloader/whitelist, internal/cli/server: forward-port #2429 and #2432 from v2.10.1-candidate by @lucca30 in https://github.com/0xPolygon/bor/pull/2435
* eth/sequencer: judge served preconf commitments the audit watermark already passed by @kamuikatsurgi in https://github.com/0xPolygon/bor/pull/2434
* eth: extend the pending head fallback to PendingLogRange by @cffls in https://github.com/0xPolygon/bor/pull/2437
* core, eth/sequencer, internal/ethapi: preserve preconf receipts across canonical import by @kamuikatsurgi in https://github.com/0xPolygon/bor/pull/2439
* eth, eth/sequencer: skip receipt copy on pending state reads by @kamuikatsurgi in https://github.com/0xPolygon/bor/pull/2444
* core, eth: don't switch to snap sync in the middle of SetHead by @kamuikatsurgi in https://github.com/0xPolygon/bor/pull/2456
* eth/sequencer: don't hold a build behind our own acked parent seal by @cffls in https://github.com/0xPolygon/bor/pull/2458
* v2.10.2 candidate by @cffls in https://github.com/0xPolygon/bor/pull/2466

## New Contributors
* @0xPolygonBot made their first contribution in https://github.com/0xPolygon/bor/pull/2379
* @nebojsa94 made their first contribution in https://github.com/0xPolygon/bor/pull/2353
* @kriss39 made their first contribution in https://github.com/0xPolygon/bor/pull/2398

**Full Changelog**: https://github.com/0xPolygon/bor/compare/v2.10.1...v2.10.2

Links

Back to 0xPolygon/bor releases