Skip to content

Releases: paritytech/polkadot-sdk

Polkadot stable2606

Choose a tag to compare

@paritytech-polkadotsdk-release-rw paritytech-polkadotsdk-release-rw released this 06 Jul 09:12
660acef

This release contains the changes from polkadot-stable2603 to polkadot-stable2606.

ℹ️ Please note:

The tag corresponding to the current stable release polkadot-stable2606 and matching the old pattern will be
available under polkadot-v1.24.0.

The node version for this release is: 1.24.0

Changelog

Full changelog can be found here

Changelog for Node Dev

ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.

[#12080]: fix(statement-network): split peer metric by kind

Impl #12060

Summary

  • Change substrate_sync_statement_peers_connected from a plain gauge to a GaugeVec labelled by kind
  • Report statement protocol peers as kind="full" or kind="light"

[#11415]: Statement store e2e integration tests lite person setup

Summary

  • Add a lite person registration test that exercises the full PeopleLite::attest flow on a live parachain, including ring-VRF key generation, attestation, and subsequent statement submission.

[#10477]: Block Bundling Node Side

Implements the node-side logic for block bundling (aka 500ms blocks) in parachains.
The main changes are in the slot-based collator: instead of building one block per core, blocks are built as requested and distributed over the available cores.

[#11701]: statement-store: Test flooding detection

Fixed a bug with double peer state cleanup. Added two zombienet integration tests that verify statement-store flooding detection

[#11107]: Add runtime metadata detection for Aura authority ID

Adds optional runtime metadata-based detection for Aura authority ID types in polkadot-omni-node-lib.

When metadata is available, the node detects whether Aura uses sr25519 or ed25519 directly from the runtime. If detection fails or metadata is unavailable, it falls back to chain spec ID heuristics.

A warning is emitted when the Aura authority ID type is not found in metadata.

[#11685]: Pass NodeExtraArgs through Dev Chain

Enables the statement store when running polkadot-omni-node in dev mode with --enable-statement-store.

The dev Aura node path now wires the statement store the same way as the regular node path: it registers the statement network protocol, builds the store, exposes the RPCs, and passes the statement store extension into offchain workers.

Also wires up the storage monitor in dev mode and emits warnings when collation-specific flags (--authoring-policy, --export-pov, --max-pov-percentage) are passed in dev mode where they have no effect.

NodeExtraArgs is now destructured in start_dev_node so the compiler will enforce that any newly added fields are explicitly handled.

[#12038]: Network: Add bitswap client

Adds a Bitswap client API to sc-network for fetching CID-addressed blocks from a peer over the native litep2p Bitswap protocol. The public API is block-fetch only and reports per-CID outcomes as either delivered bytes or "missing"; on-wire presence (HAVE / DONT_HAVE) is handled internally and is not part of the public surface.

[#11387]: docs/async_back: Align docs to latest behavior

Tiny PR to update the async backing documentation / guidelines:

  • older params are no longer used async_backing_params
  • UNINCLUDED_SEGMENT_CAPACITY is now 3
  • no need for experimental feature flags

Closes: #8804

[#12207]: statement-store: remove unused Proof::OnChain variant

Removes the Proof::OnChain variant from sp_statement_store::Proof because it was unused.

[#12113]: Aura: Fetch slot duration at parent and not best block

Fetch the slot duration from the parent we are building on top of and not from the best block.

[#11967]: Experimental collator protocol — leaf-authoritative capacity tracking

Reworks the experimental collator protocol's validator side around a leaf-authoritative capacity model. The leaf's per-core claim queue is the single source of truth; capacity at every scheduling parent (SP) on a path to that leaf is derived via offset arithmetic.

Behavior changes vs. master:

  • Rotation-boundary bug fixed. After a group rotation, candidates for both the pre-rotation core's para (advertised at the pre-rotation leaf) and the post-rotation core's para (at the post-rotation leaf) are accepted. Previously, rotation caused claim-queue state for the old core to be overwritten and ancestor-rooted advertisements to be wrongly rejected.

  • Fork-aware view cleanup. When a leaf is dropped, SPs are removed from per_scheduling_parent (with their in-flight fetches cancelled) only when no remaining leaf still references them. Previously, sibling-fork retention in implicit-view storage could leave SPs orphaned with leaked in-flight fetches.

  • Free-slot accounting tightened to the current leaf. Assignments and free CQ positions now reflect only what the current leaf's CQ actually predicts. Previously, claim-queue state for already-produced ancestor blocks lingered until those blocks were pruned, so paras and slots that had already been backed on-chain were still reported as open — keeping peers connected past their relevance and offering capacity for slots that could no longer be filled.

Internals: the previous ClaimQueueState / PerLeafClaimQueueState machinery is gone (~2200 LoC deleted). Capacity is now computed per-(leaf, core) by build_leaf_core_cqs as a Vec<LeafCoreCq>, where each LeafCoreCq holds the leaf's CQ as
Vec<Option<ParaId>> (consumed positions cleared to None) and an sps_by_depth: Vec<Option<Hash>> masking cross-core ancestors. The fetch planner walks free CQ positions back-to-front and picks the best advertisement among same-core SPs whose
window reaches that position.

Test coverage in validator_side_experimental/tests.rs:

  • core_rotation_accepts_candidates_for_both_cores — regression for the original rotation-boundary bug.
  • Five active-fork tests covering: assignment union across leaves, longest-window capacity at a common ancestor across different-length forks, no double-counting of in-flight candidates across sibling forks, and reclamation of capacity / peer disconnection when a
    fork is dropped.
  • Two linear multi-SP tests pinning over-fetch and under-fetch invariants when ancestor and leaf SPs share the same per-core CQ.
  • Tests for cross-SP reputation arbitration and cross-core slot-reservation correctness.
  • Three previously-existing tests rewritten to assert the same intent against the new model.

No public API changes; behavior change is contained to the experimental validator side.

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#11922]: Update merkle mountain lib

Updates the merkle mountain crate to its latest version.

[#11616]: Move era reward minting from staking to DAP

Introduces dual-mode era rewards in pallet-staking-async, controlled by Config::DisableMinting:

  • true (non-minting): staking expects an external source to fund a general reward pot. At era boundary, the balance is snapshotted into an era-specific pot. Payouts transfer from the pot. Unclaimed rewards returned via UnclaimedRewardHandler.
  • false (legacy minting): EraPayout computes inflation, tokens minted on payout, remainder sent to RewardRemainder. Kept for Kusama compatibility.

Switching from legacy to non-minting is irreversible.

New config: DisableMinting, UnclaimedRewardHandler, GeneralPots, EraPots, StakerRewardCalculator. New storage: MaxCommission, DisableMintingGuard.
New extrinsic: set_max_commission.

Runtimes using non-minting mode provide an IssuanceCurve impl to DAP and register StakerRewardRecipient as a budget recipient. DAP storage version bumped to V2 with migration.

[#12225]: pallet-revive: map account in prepare_dry_run

Summary

  • Map the origin account in prepare_dry_run when it is not already mapped, so dry-running contract calls/instantiations does not fail with AccountUnmapped for callers that never registered a mapping.

[#12115]: pallet-revive: recalibrate contains_storage benchmark

The contains_storage benchmark now exercises the persistent storage path, matching how WeightInfo::contains_storage is dispatched from the precompile. The transient path remains benchmarked separately as seal_contains_transient_storage.
Also the clear_storage, contains_storage, take_storage and the transient clear/contains benchmarks now size their pre-existing value by n.

[#11770]: Fix PSM migration to run on first deployment

Replaces the versioned MigrateToV1 with an idempotent InitializePsm migration.

The previous MigrateToV1 used VersionedMigration<0, 1> which never ran on fresh deployments because BeforeAllRuntimeMigrations initializes the on-chain storage version to the in-code version (1) before migrations execute, causing the version check to skip.

InitializePsm instead checks whether each external asset already exists and skips it if so. This makes it safe to run multiple times with no storage version dependency.

[#12027]: Extend PGAS filter to allow batches

Just as the title says.

[#11881]: Make pallet-dap-satellite more generic

The DAP satellite pallet is being converted into a generic Accumulate-and-Forward pallet, with the purpose of pooling to...

Read more

Polkadot polakdot-stable2606-rc3

Pre-release

Choose a tag to compare

@EgorPopelyaev EgorPopelyaev released this 30 Jun 14:28
polkadot-stable2606-rc3
3a8437a

This release contains the changes from polkadot-stable2603 to polkadot-stable2606-rc3.

⚠️ Warning: Pre-release Version

The currently published version is a pre-release and is not yet a final stable version. This release is provided for testing purposes only, and there is no guarantee that everything will work as expected. Errors and unusual behaviours of some features are to be expected.

Please use this version at your own risk and report any issues you encounter. We recommend waiting for the official release if you need a stable version.

Changelog

Link to full changelog

Changelog for Node Dev

ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.

[#12080]: fix(statement-network): split peer metric by kind

Impl #12060

Summary

  • Change substrate_sync_statement_peers_connected from a plain gauge to a GaugeVec labelled by kind
  • Report statement protocol peers as kind="full" or kind="light"

[#11415]: Statement store e2e integration tests lite person setup

Summary

  • Add a lite person registration test that exercises the full PeopleLite::attest flow on a live parachain, including ring-VRF key generation, attestation, and subsequent statement submission.

[#10477]: Block Bundling Node Side

Implements the node-side logic for block bundling (aka 500ms blocks) in parachains.
The main changes are in the slot-based collator: instead of building one block per core,
blocks are built as requested and distributed over the available cores.

[#11701]: statement-store: Test flooding detection

Fixed a bug with double peer state cleanup. Added two zombienet integration tests that verify statement-store flooding detection

[#11107]: Add runtime metadata detection for Aura authority ID

Adds optional runtime metadata-based detection for Aura authority ID types in polkadot-omni-node-lib.

When metadata is available, the node detects whether Aura uses sr25519 or ed25519
directly from the runtime. If detection fails or metadata is unavailable, it falls
back to chain spec ID heuristics.

A warning is emitted when the Aura authority ID type is not found in metadata.

[#11685]: Pass NodeExtraArgs through Dev Chain

Enables the statement store when running polkadot-omni-node in dev mode with
--enable-statement-store.

The dev Aura node path now wires the statement store the same way as the regular node path:
it registers the statement network protocol, builds the store, exposes the RPCs, and passes
the statement store extension into offchain workers.

Also wires up the storage monitor in dev mode and emits warnings when
collation-specific flags (--authoring-policy, --export-pov,
--max-pov-percentage) are passed in dev mode where they have no effect.

NodeExtraArgs is now destructured in start_dev_node so the compiler
will enforce that any newly added fields are explicitly handled.

[#12038]: Network: Add bitswap client

Adds a Bitswap client API to sc-network for fetching CID-addressed blocks
from a peer over the native litep2p Bitswap protocol. The public API is
block-fetch only and reports per-CID outcomes as either delivered bytes or
"missing"; on-wire presence (HAVE / DONT_HAVE) is handled internally
and is not part of the public surface.

[#11387]: docs/async_back: Align docs to latest behavior

Tiny PR to update the async backing documentation / guidelines:

  • older params are no longer used async_backing_params
  • UNINCLUDED_SEGMENT_CAPACITY is now 3
  • no need for experimental feature flags

Closes: #8804

[#12207]: statement-store: remove unused Proof::OnChain variant

Removes the Proof::OnChain variant from sp_statement_store::Proof because it
was unused.

[#12113]: Aura: Fetch slot duration at parent and not best block

Fetch the slot duration from the parent we are building on top of and not from the best block.

[#11967]: Experimental collator protocol — leaf-authoritative capacity tracking

Reworks the experimental collator protocol's validator side around a leaf-authoritative
capacity model. The leaf's per-core claim queue is the single source of truth; capacity at
every scheduling parent (SP) on a path to that leaf is derived via offset arithmetic.

Behavior changes vs. master:

  • Rotation-boundary bug fixed. After a group rotation, candidates for both the
    pre-rotation core's para (advertised at the pre-rotation leaf) and the post-rotation
    core's para (at the post-rotation leaf) are accepted. Previously, rotation caused
    claim-queue state for the old core to be overwritten and ancestor-rooted advertisements
    to be wrongly rejected.

  • Fork-aware view cleanup. When a leaf is dropped, SPs are removed from
    per_scheduling_parent (with their in-flight fetches cancelled) only when no remaining
    leaf still references them. Previously, sibling-fork retention in implicit-view storage
    could leave SPs orphaned with leaked in-flight fetches.

  • Free-slot accounting tightened to the current leaf. Assignments and free CQ
    positions now reflect only what the current leaf's CQ actually predicts. Previously,
    claim-queue state for already-produced ancestor blocks lingered until those blocks were
    pruned, so paras and slots that had already been backed on-chain were still reported as
    open — keeping peers connected past their relevance and offering capacity for slots that
    could no longer be filled.

Internals: the previous ClaimQueueState / PerLeafClaimQueueState machinery is gone
(~2200 LoC deleted). Capacity is now computed per-(leaf, core) by build_leaf_core_cqs
as a Vec<LeafCoreCq>, where each LeafCoreCq holds the leaf's CQ as
Vec<Option<ParaId>> (consumed positions cleared to None) and an
sps_by_depth: Vec<Option<Hash>> masking cross-core ancestors. The fetch planner walks
free CQ positions back-to-front and picks the best advertisement among same-core SPs whose
window reaches that position.

Test coverage in validator_side_experimental/tests.rs:

  • core_rotation_accepts_candidates_for_both_cores — regression for the original
    rotation-boundary bug.
  • Five active-fork tests covering: assignment union across leaves, longest-window capacity
    at a common ancestor across different-length forks, no double-counting of in-flight
    candidates across sibling forks, and reclamation of capacity / peer disconnection when a
    fork is dropped.
  • Two linear multi-SP tests pinning over-fetch and under-fetch invariants when ancestor
    and leaf SPs share the same per-core CQ.
  • Tests for cross-SP reputation arbitration and cross-core slot-reservation correctness.
  • Three previously-existing tests rewritten to assert the same intent against the new
    model.

No public API changes; behavior change is contained to the experimental validator side.

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#11922]: Update merkle mountain lib

Updates the merkle mountain crate to its latest version.

[#11616]: Move era reward minting from staking to DAP

Introduces dual-mode era rewards in pallet-staking-async, controlled by
Config::DisableMinting:

  • true (non-minting): staking expects an external source to fund a general reward
    pot. At era boundary, the balance is snapshotted into an era-specific pot. Payouts
    transfer from the pot. Unclaimed rewards returned via UnclaimedRewardHandler.
  • false (legacy minting): EraPayout computes inflation, tokens minted on payout,
    remainder sent to RewardRemainder. Kept for Kusama compatibility.

Switching from legacy to non-minting is irreversible.

New config: DisableMinting, UnclaimedRewardHandler, GeneralPots, EraPots,
StakerRewardCalculator. New storage: MaxCommission, DisableMintingGuard.
New extrinsic: set_max_commission.

Runtimes using non-minting mode provide an IssuanceCurve impl to DAP and
register StakerRewardRecipient as a budget recipient. DAP storage version
bumped to V2 with migration.

[#12225]: pallet-revive: map account in prepare_dry_run

Summary

  • Map the origin account in prepare_dry_run when it is not already mapped, so dry-running contract calls/instantiations does not fail with AccountUnmapped for callers that never registered a mapping.

Test plan

  • CI passes

[#12115]: pallet-revive: recalibrate contains_storage benchmark

The contains_storage benchmark now exercises the persistent storage path, matching how WeightInfo::contains_storage is dispatched from the precompile. The transient path remains benchmarked separately as seal_contains_transient_storage.
Also the clear_storage, contains_storage, take_storage and the transient clear/contains benchmarks now size their pre-existing value by n.

[#11770]: Fix PSM migration to run on first deployment

Replaces the versioned MigrateToV1 with an idempotent InitializePsm migration.

The previous MigrateToV1 used VersionedMigration<0, 1> which never ran on fresh
deployments because BeforeAllRuntimeMigrations initializes the on-chain storage
version to the in-code version (1) before migrations execute, causing the version
check to skip.

InitializePsm instead checks whether each external asset already exists and skips
it if so. This makes it safe to run multiple times with no st...

Read more

Polkadot stable2603-4

Choose a tag to compare

@paritytech-polkadotsdk-release-rw paritytech-polkadotsdk-release-rw released this 29 Jun 08:09
82af15d

This release contains the changes from polkadot-stable2603-3 to polkadot-stable2603-4.

ℹ️ Please note:

This is a patch release for the latest stable version: stable2603. If your nodes are already running on this stable release,
you should upgrade to this patch version to get the latest fixes.

The tag corresponding to the current patch release polkadot-stable2603-4 and matching the old pattern will be
available under polkadot-v1.22.4.

The node version for this release is: v1.22.4
The following crates were updated to the corresponding versions:

Crates list
  • pallet-beefy-mmr@47.1.0
  • cumulus-pallet-xcmp-queue@0.26.1
  • collectives-westend-runtime@26.1.1
  • coretime-westend-runtime@0.22.2
  • asset-hub-rococo-runtime@0.32.1
  • asset-hub-westend-runtime@0.45.1
  • bridge-hub-rococo-runtime@0.28.1
  • bridge-hub-westend-runtime@0.25.1
  • cumulus-client-consensus-aura@0.29.2
  • snowbridge-beacon-primitives@0.19.1
  • staging-xcm-executor@25.2.0
  • snowbridge-runtime-common@0.20.1
  • cumulus-primitives-utility@0.26.1
  • bridge-hub-westend-runtime@0.25.2

Changelog

Changelog for Node Dev

ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.

[#12113]: Aura: Fetch slot duration at parent and not best block

Fetch the slot duration from the parent we are building on top of and not from the best block.

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#11910]: XCM hardening - fix some regressions

This PR fixes some regressions, improves code and adds more defense-in-depth in a couple places.

xcm-executor: drain holdings by ownership in deposit_assets_with_retry

Add AssetsInHolding::into_per_asset_holdings() and use it in deposit_assets_with_retry so each pass consumes the input via owning BTreeMap/BTreeSet iterators instead of assets_iter().collect() + try_take. Per asset this drops one AssetId clone, one or two BTreeMap lookups, one dynamic dispatch on saturating_take, and one internal subsume_assets call; per pass it drops the intermediate Vec<Asset> allocation. Behaviour is unchanged: same iteration order, same partial-failure / retry semantics.

xcm-executor: remove now dead code related do dust deposit errors

deposit_assets_with_retry previously tried to silently drop "dust" (below-minimum) deposit failures, comparing the returned XcmError string against the canonical TokenError::BelowMinimum text. After PR #10384 within FungiblesAdapter::deposit_asset the underlying DispatchError is discarded and the adapter returns XcmError::FailedToTransactAsset("") - an empty string. The dust check never matched, so classifying the error is no longer possible.
Remove the special handling of dust deposit errors (which can no longer be identified from returned error), and treat all errors the same.

xcm-executor: rollback all side-effects of partial instruction execution

Defense-in-depth: higher components in the stack leading up to xcm-executor are already using
transactional layers to discard all state side effects on failed execution, but even so, this
commit adds defense-in-depth by making sure even at the xcm-executor level, side effects are
properly cleaned up on error.

cumulus/utility: fix inverted ED guard in TakeFirstAssetTrader::refund_weight

The else-branch was refunding ED to the user and leaving sub-ED dust for the OnUnbalanced drop handler, the inverse of the intended behavior.
Refund outstanding - ED instead so the handler keeps at least ED (or all of it when outstanding < ED), preventing silent fee burns.

This was actually a bug, but TakeFirstAssetTrader is not used by any production runtimes.

snowbridge: short-circuit on register-token error path

Minor optimization and defense-in-depth - short-circuit on errors and don't directly compare Options.

snowbridge: harden BLS public key deserialisation

Defense-in-depth: validate all cryptographic inputs.

The Merkle proof binding means the public keys must match exactly what the Ethereum beacon chain committed. Since the beacon chain itself enforces G1 subgroup membership for validator keys, invalid subgroup points cannot appear in honest beacon chain state.
An attacker would need to compromise the Merkle proof verification (e.g., via a SHA-256 collision or another bug in the verification chain) to inject a public key that is on the BLS12-381 curve but not in the G1 subgroup.
The performance cost of the subgroup check is a one-time cost during sync committee preparation (512 checks per sync committee period, approximately every 27 hours). This is negligible compared to the BLS signature verification that occurs on every update. So just check it as defense-in-depth.

[#12214]: pallet-beefy-mmr: align ECDSA→ETH failure sentinel between converter and consumer

BeefyEcdsaToEthereum returned an empty Vec on conversion failure, while compute_authority_set counted failures by matching [0u8; 20].
Extract the sentinel into a shared FAILED_BEEFY_TO_ETH_ADDRESS constant referenced by both sites.
Fix mock_beefy_id to derive valid ECDSA keys so tests exercise the happy path as well as the failure branch.

[#12176]: xcmp-queue: Store the bytes in the channel status

This improves the performance of xcmp-queue by not requiring to check all pages individually.

Rust compiler versions

This release was built and tested against the following versions of rustc.
Other versions may work.

  • Rust Stable: 1.93.0

Docker images

The docker images for the polkadot node binary and the polkadot-parachain binary can be found at Docker hub (will be available a few minutes after the release has been published):

You may also pull it with:

docker pull parity/polkadot:stable2603-4

or

docker pull parity/polkadot-parachain:stable2603-4

Polkadot polkadot-stable2606-rc2

Pre-release

Choose a tag to compare

@EgorPopelyaev EgorPopelyaev released this 29 Jun 13:36
d5674bc

This release contains the changes from polkadot-stable2603 to polkadot-stable2606-rc2.

⚠️ Warning: Pre-release Version

The currently published version is a pre-release and is not yet a final stable version. This release is provided for testing purposes only, and there is no guarantee that everything will work as expected. Errors and unusual behaviours of some features are to be expected.

Please use this version at your own risk and report any issues you encounter. We recommend waiting for the official release if you need a stable version.

Changelog

Link to full changelog

Changelog for Node Dev

ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.

[#12080]: fix(statement-network): split peer metric by kind

Impl #12060

Summary

  • Change substrate_sync_statement_peers_connected from a plain gauge to a GaugeVec labelled by kind
  • Report statement protocol peers as kind="full" or kind="light"

[#11415]: Statement store e2e integration tests lite person setup

Summary

  • Add a lite person registration test that exercises the full PeopleLite::attest flow on a live parachain, including ring-VRF key generation, attestation, and subsequent statement submission.

[#10477]: Block Bundling Node Side

Implements the node-side logic for block bundling (aka 500ms blocks) in parachains.
The main changes are in the slot-based collator: instead of building one block per core,
blocks are built as requested and distributed over the available cores.

[#11701]: statement-store: Test flooding detection

Fixed a bug with double peer state cleanup. Added two zombienet integration tests that verify statement-store flooding detection

[#11107]: Add runtime metadata detection for Aura authority ID

Adds optional runtime metadata-based detection for Aura authority ID types in polkadot-omni-node-lib.

When metadata is available, the node detects whether Aura uses sr25519 or ed25519
directly from the runtime. If detection fails or metadata is unavailable, it falls
back to chain spec ID heuristics.

A warning is emitted when the Aura authority ID type is not found in metadata.

[#11685]: Pass NodeExtraArgs through Dev Chain

Enables the statement store when running polkadot-omni-node in dev mode with
--enable-statement-store.

The dev Aura node path now wires the statement store the same way as the regular node path:
it registers the statement network protocol, builds the store, exposes the RPCs, and passes
the statement store extension into offchain workers.

Also wires up the storage monitor in dev mode and emits warnings when
collation-specific flags (--authoring-policy, --export-pov,
--max-pov-percentage) are passed in dev mode where they have no effect.

NodeExtraArgs is now destructured in start_dev_node so the compiler
will enforce that any newly added fields are explicitly handled.

[#12038]: Network: Add bitswap client

Adds a Bitswap client API to sc-network for fetching CID-addressed blocks
from a peer over the native litep2p Bitswap protocol. The public API is
block-fetch only and reports per-CID outcomes as either delivered bytes or
"missing"; on-wire presence (HAVE / DONT_HAVE) is handled internally
and is not part of the public surface.

[#11387]: docs/async_back: Align docs to latest behavior

Tiny PR to update the async backing documentation / guidelines:

  • older params are no longer used async_backing_params
  • UNINCLUDED_SEGMENT_CAPACITY is now 3
  • no need for experimental feature flags

Closes: #8804

[#12207]: statement-store: remove unused Proof::OnChain variant

Removes the Proof::OnChain variant from sp_statement_store::Proof because it
was unused.

[#12113]: Aura: Fetch slot duration at parent and not best block

Fetch the slot duration from the parent we are building on top of and not from the best block.

[#11967]: Experimental collator protocol — leaf-authoritative capacity tracking

Reworks the experimental collator protocol's validator side around a leaf-authoritative
capacity model. The leaf's per-core claim queue is the single source of truth; capacity at
every scheduling parent (SP) on a path to that leaf is derived via offset arithmetic.

Behavior changes vs. master:

  • Rotation-boundary bug fixed. After a group rotation, candidates for both the
    pre-rotation core's para (advertised at the pre-rotation leaf) and the post-rotation
    core's para (at the post-rotation leaf) are accepted. Previously, rotation caused
    claim-queue state for the old core to be overwritten and ancestor-rooted advertisements
    to be wrongly rejected.

  • Fork-aware view cleanup. When a leaf is dropped, SPs are removed from
    per_scheduling_parent (with their in-flight fetches cancelled) only when no remaining
    leaf still references them. Previously, sibling-fork retention in implicit-view storage
    could leave SPs orphaned with leaked in-flight fetches.

  • Free-slot accounting tightened to the current leaf. Assignments and free CQ
    positions now reflect only what the current leaf's CQ actually predicts. Previously,
    claim-queue state for already-produced ancestor blocks lingered until those blocks were
    pruned, so paras and slots that had already been backed on-chain were still reported as
    open — keeping peers connected past their relevance and offering capacity for slots that
    could no longer be filled.

Internals: the previous ClaimQueueState / PerLeafClaimQueueState machinery is gone
(~2200 LoC deleted). Capacity is now computed per-(leaf, core) by build_leaf_core_cqs
as a Vec<LeafCoreCq>, where each LeafCoreCq holds the leaf's CQ as
Vec<Option<ParaId>> (consumed positions cleared to None) and an
sps_by_depth: Vec<Option<Hash>> masking cross-core ancestors. The fetch planner walks
free CQ positions back-to-front and picks the best advertisement among same-core SPs whose
window reaches that position.

Test coverage in validator_side_experimental/tests.rs:

  • core_rotation_accepts_candidates_for_both_cores — regression for the original
    rotation-boundary bug.
  • Five active-fork tests covering: assignment union across leaves, longest-window capacity
    at a common ancestor across different-length forks, no double-counting of in-flight
    candidates across sibling forks, and reclamation of capacity / peer disconnection when a
    fork is dropped.
  • Two linear multi-SP tests pinning over-fetch and under-fetch invariants when ancestor
    and leaf SPs share the same per-core CQ.
  • Tests for cross-SP reputation arbitration and cross-core slot-reservation correctness.
  • Three previously-existing tests rewritten to assert the same intent against the new
    model.

No public API changes; behavior change is contained to the experimental validator side.

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#11922]: Update merkle mountain lib

Updates the merkle mountain crate to its latest version.

[#11616]: Move era reward minting from staking to DAP

Introduces dual-mode era rewards in pallet-staking-async, controlled by
Config::DisableMinting:

  • true (non-minting): staking expects an external source to fund a general reward
    pot. At era boundary, the balance is snapshotted into an era-specific pot. Payouts
    transfer from the pot. Unclaimed rewards returned via UnclaimedRewardHandler.
  • false (legacy minting): EraPayout computes inflation, tokens minted on payout,
    remainder sent to RewardRemainder. Kept for Kusama compatibility.

Switching from legacy to non-minting is irreversible.

New config: DisableMinting, UnclaimedRewardHandler, GeneralPots, EraPots,
StakerRewardCalculator. New storage: MaxCommission, DisableMintingGuard.
New extrinsic: set_max_commission.

Runtimes using non-minting mode provide an IssuanceCurve impl to DAP and
register StakerRewardRecipient as a budget recipient. DAP storage version
bumped to V2 with migration.

[#12225]: pallet-revive: map account in prepare_dry_run

Summary

  • Map the origin account in prepare_dry_run when it is not already mapped, so dry-running contract calls/instantiations does not fail with AccountUnmapped for callers that never registered a mapping.

Test plan

  • CI passes

[#12115]: pallet-revive: recalibrate contains_storage benchmark

The contains_storage benchmark now exercises the persistent storage path, matching how WeightInfo::contains_storage is dispatched from the precompile. The transient path remains benchmarked separately as seal_contains_transient_storage.
Also the clear_storage, contains_storage, take_storage and the transient clear/contains benchmarks now size their pre-existing value by n.

[#11770]: Fix PSM migration to run on first deployment

Replaces the versioned MigrateToV1 with an idempotent InitializePsm migration.

The previous MigrateToV1 used VersionedMigration<0, 1> which never ran on fresh
deployments because BeforeAllRuntimeMigrations initializes the on-chain storage
version to the in-code version (1) before migrations execute, causing the version
check to skip.

InitializePsm instead checks whether each external asset already exists and skips
it if so. This makes it safe to run multiple times with no st...

Read more

Polkadot stable2512-6

Choose a tag to compare

@paritytech-polkadotsdk-release-rw paritytech-polkadotsdk-release-rw released this 17 Jun 12:19
ba6a0d2

This release contains the changes from polkadot-stable2512-5 to polkadot-stable2512-6.

ℹ️ Please note:

⚠️ This is a patch release for the stable version: stable2512 and contains only patches and fixes to the crates (list
below). No binary or docker images will be provided for this release.

The tag corresponding to the current patch release polkadot-stable2512-6 and matching the old pattern will be
available under polkadot-v1.21.6.
The following crates were updated to the corresponding versions:

Crates list
  • cumulus-pallet-xcmp-queue@0.25.1
  • collectives-westend-runtime@25.0.1
  • coretime-rococo-runtime@0.21.1
  • coretime-westend-runtime@0.21.1
  • people-rococo-runtime@0.21.1
  • asset-hub-rococo-runtime@0.34.1
  • asset-hub-westend-runtime@0.46.1
  • bridge-hub-rococo-runtime@0.29.1
  • bridge-hub-westend-runtime@0.26.1

Changelog

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#12176]: xcmp-queue: Store the bytes in the channel status

This improves the performance of xcmp-queue by not requiring to check all pages individually.

Rust compiler versions

This release was built and tested against the following versions of rustc.
Other versions may work.

  • Rust Stable: 1.88.0

Polkadot stable2509-9

Choose a tag to compare

@paritytech-polkadotsdk-release-rw paritytech-polkadotsdk-release-rw released this 11 Jun 21:18
9911620

This release contains the changes from polkadot-stable2509-8 to polkadot-stable2509-9.

ℹ️ Please note:

⚠️ This is a patch release for the stable version: stable2509 and contains only patches and fixes to the crates (list
below). No binary or docker images will be provided for this release.

The tag corresponding to the current patch release polkadot-stable2509-9 and matching the old pattern will be
available under polkadot-v1.20.9.
The following crates were updated to the corresponding versions:

Crates list
  • cumulus-pallet-xcmp-queue@0.23.1
  • pallet-assets-precompiles@0.2.1
  • collectives-westend-runtime@23.0.1
  • coretime-rococo-runtime@0.19.1
  • coretime-westend-runtime@0.19.1
  • people-rococo-runtime@0.19.1
  • asset-hub-rococo-runtime@0.29.1
  • asset-hub-westend-runtime@0.36.4
  • bridge-hub-rococo-runtime@0.23.2
  • bridge-hub-westend-runtime@0.20.2

Changelog

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#12176]: xcmp-queue: Store the bytes in the channel status

This improves the performance of xcmp-queue by not requiring to check all pages individually.

Rust compiler versions

This release was built and tested against the following versions of rustc.
Other versions may work.

  • Rust Stable: 1.88.0

Polkadot stable2506-12

Choose a tag to compare

@paritytech-polkadotsdk-release-rw paritytech-polkadotsdk-release-rw released this 10 Jun 14:08
d5c449d

This release contains the changes from polkadot-stable2506-11 to polkadot-stable2506-12.

ℹ️ Please note:

⚠️ This is a last patch release for the stable version: stable2506 and contains only patches and fixes to the crates (list
below). No binary or docker images will be provided for this release. This version's support cycle has come to an end, and it will no longer be supported.

The tag corresponding to the current patch release polkadot-stable2506-12 and matching the old pattern will be
available under polkadot-v1.19.12.
The following crates were updated to the corresponding versions:

Crates list
  • sc-network-sync@0.50.1
  • pallet-assets@43.0.1
  • cumulus-pallet-xcmp-queue@0.21.2
  • collectives-westend-runtime@20.0.2
  • coretime-rococo-runtime@0.16.1
  • coretime-westend-runtime@0.16.1
  • people-rococo-runtime@0.16.1
  • asset-hub-rococo-runtime@0.26.2
  • asset-hub-westend-runtime@0.32.2
  • bridge-hub-rococo-runtime@0.20.1
  • bridge-hub-westend-runtime@0.17.1

Changelog

Changelog for Node Dev

ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.

[#12017]: Improve the sync

We should not panic and handle it more gracefully.

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#12176]: xcmp-queue: Store the bytes in the channel status

This improves the performance of xcmp-queue by not requiring to check all pages individually.

Rust compiler versions

This release was built and tested against the following versions of rustc.
Other versions may work.

  • Rust Stable: 1.84.1

Polkadot stable2606-rc1

Pre-release

Choose a tag to compare

@EgorPopelyaev EgorPopelyaev released this 10 Jun 16:03
polkadot-stable2606-rc1
c6fc157

This release contains the changes from polkadot-stable2603 to polkadot-stable2606-rc1.

⚠️ Warning: Pre-release Version

The currently published version is a pre-release and is not yet a final stable version. This release is provided for testing purposes only, and there is no guarantee that everything will work as expected. Errors and unusual behaviours of some features are to be expected.

Please use this version at your own risk and report any issues you encounter. We recommend waiting for the official release if you need a stable version.

Changelog

Link to full changelog

Changelog for Node Dev

ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.

[#12080]: fix(statement-network): split peer metric by kind

Impl #12060

Summary

  • Change substrate_sync_statement_peers_connected from a plain gauge to a GaugeVec labelled by kind
  • Report statement protocol peers as kind="full" or kind="light"

[#11415]: Statement store e2e integration tests lite person setup

Summary

  • Add a lite person registration test that exercises the full PeopleLite::attest flow on a live parachain, including ring-VRF key generation, attestation, and subsequent statement submission.

[#10477]: Block Bundling Node Side

Implements the node-side logic for block bundling (aka 500ms blocks) in parachains.
The main changes are in the slot-based collator: instead of building one block per core,
blocks are built as requested and distributed over the available cores.

[#11701]: statement-store: Test flooding detection

Fixed a bug with double peer state cleanup. Added two zombienet integration tests that verify statement-store flooding detection

[#11107]: Add runtime metadata detection for Aura authority ID

Adds optional runtime metadata-based detection for Aura authority ID types in polkadot-omni-node-lib.

When metadata is available, the node detects whether Aura uses sr25519 or ed25519
directly from the runtime. If detection fails or metadata is unavailable, it falls
back to chain spec ID heuristics.

A warning is emitted when the Aura authority ID type is not found in metadata.

[#11685]: Pass NodeExtraArgs through Dev Chain

Enables the statement store when running polkadot-omni-node in dev mode with
--enable-statement-store.

The dev Aura node path now wires the statement store the same way as the regular node path:
it registers the statement network protocol, builds the store, exposes the RPCs, and passes
the statement store extension into offchain workers.

Also wires up the storage monitor in dev mode and emits warnings when
collation-specific flags (--authoring-policy, --export-pov,
--max-pov-percentage) are passed in dev mode where they have no effect.

NodeExtraArgs is now destructured in start_dev_node so the compiler
will enforce that any newly added fields are explicitly handled.

[#12038]: Network: Add bitswap client

Adds a Bitswap client API to sc-network for fetching CID-addressed blocks
from a peer over the native litep2p Bitswap protocol. The public API is
block-fetch only and reports per-CID outcomes as either delivered bytes or
"missing"; on-wire presence (HAVE / DONT_HAVE) is handled internally
and is not part of the public surface.

[#11387]: docs/async_back: Align docs to latest behavior

Tiny PR to update the async backing documentation / guidelines:

  • older params are no longer used async_backing_params
  • UNINCLUDED_SEGMENT_CAPACITY is now 3
  • no need for experimental feature flags

Closes: #8804

[#12207]: statement-store: remove unused Proof::OnChain variant

Removes the Proof::OnChain variant from sp_statement_store::Proof because it
was unused.

[#12113]: Aura: Fetch slot duration at parent and not best block

Fetch the slot duration from the parent we are building on top of and not from the best block.

[#11967]: Experimental collator protocol — leaf-authoritative capacity tracking

Reworks the experimental collator protocol's validator side around a leaf-authoritative
capacity model. The leaf's per-core claim queue is the single source of truth; capacity at
every scheduling parent (SP) on a path to that leaf is derived via offset arithmetic.

Behavior changes vs. master:

  • Rotation-boundary bug fixed. After a group rotation, candidates for both the
    pre-rotation core's para (advertised at the pre-rotation leaf) and the post-rotation
    core's para (at the post-rotation leaf) are accepted. Previously, rotation caused
    claim-queue state for the old core to be overwritten and ancestor-rooted advertisements
    to be wrongly rejected.

  • Fork-aware view cleanup. When a leaf is dropped, SPs are removed from
    per_scheduling_parent (with their in-flight fetches cancelled) only when no remaining
    leaf still references them. Previously, sibling-fork retention in implicit-view storage
    could leave SPs orphaned with leaked in-flight fetches.

  • Free-slot accounting tightened to the current leaf. Assignments and free CQ
    positions now reflect only what the current leaf's CQ actually predicts. Previously,
    claim-queue state for already-produced ancestor blocks lingered until those blocks were
    pruned, so paras and slots that had already been backed on-chain were still reported as
    open — keeping peers connected past their relevance and offering capacity for slots that
    could no longer be filled.

Internals: the previous ClaimQueueState / PerLeafClaimQueueState machinery is gone
(~2200 LoC deleted). Capacity is now computed per-(leaf, core) by build_leaf_core_cqs
as a Vec<LeafCoreCq>, where each LeafCoreCq holds the leaf's CQ as
Vec<Option<ParaId>> (consumed positions cleared to None) and an
sps_by_depth: Vec<Option<Hash>> masking cross-core ancestors. The fetch planner walks
free CQ positions back-to-front and picks the best advertisement among same-core SPs whose
window reaches that position.

Test coverage in validator_side_experimental/tests.rs:

  • core_rotation_accepts_candidates_for_both_cores — regression for the original
    rotation-boundary bug.
  • Five active-fork tests covering: assignment union across leaves, longest-window capacity
    at a common ancestor across different-length forks, no double-counting of in-flight
    candidates across sibling forks, and reclamation of capacity / peer disconnection when a
    fork is dropped.
  • Two linear multi-SP tests pinning over-fetch and under-fetch invariants when ancestor
    and leaf SPs share the same per-core CQ.
  • Tests for cross-SP reputation arbitration and cross-core slot-reservation correctness.
  • Three previously-existing tests rewritten to assert the same intent against the new
    model.

No public API changes; behavior change is contained to the experimental validator side.

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#11922]: Update merkle mountain lib

Updates the merkle mountain crate to its latest version.

[#11616]: Move era reward minting from staking to DAP

Introduces dual-mode era rewards in pallet-staking-async, controlled by
Config::DisableMinting:

  • true (non-minting): staking expects an external source to fund a general reward
    pot. At era boundary, the balance is snapshotted into an era-specific pot. Payouts
    transfer from the pot. Unclaimed rewards returned via UnclaimedRewardHandler.
  • false (legacy minting): EraPayout computes inflation, tokens minted on payout,
    remainder sent to RewardRemainder. Kept for Kusama compatibility.

Switching from legacy to non-minting is irreversible.

New config: DisableMinting, UnclaimedRewardHandler, GeneralPots, EraPots,
StakerRewardCalculator. New storage: MaxCommission, DisableMintingGuard.
New extrinsic: set_max_commission.

Runtimes using non-minting mode provide an IssuanceCurve impl to DAP and
register StakerRewardRecipient as a budget recipient. DAP storage version
bumped to V2 with migration.

[#12225]: pallet-revive: map account in prepare_dry_run

Summary

  • Map the origin account in prepare_dry_run when it is not already mapped, so dry-running contract calls/instantiations does not fail with AccountUnmapped for callers that never registered a mapping.

Test plan

  • CI passes

[#12115]: pallet-revive: recalibrate contains_storage benchmark

The contains_storage benchmark now exercises the persistent storage path, matching how WeightInfo::contains_storage is dispatched from the precompile. The transient path remains benchmarked separately as seal_contains_transient_storage.
Also the clear_storage, contains_storage, take_storage and the transient clear/contains benchmarks now size their pre-existing value by n.

[#11770]: Fix PSM migration to run on first deployment

Replaces the versioned MigrateToV1 with an idempotent InitializePsm migration.

The previous MigrateToV1 used VersionedMigration<0, 1> which never ran on fresh
deployments because BeforeAllRuntimeMigrations initializes the on-chain storage
version to the in-code version (1) before migrations execute, causing the version
check to skip.

InitializePsm instead checks whether each external asset already exists and skips
it if so. This makes it safe to run multiple times with no st...

Read more

Polkadot unstable2604-rc4

Pre-release

Choose a tag to compare

@EgorPopelyaev EgorPopelyaev released this 03 Jun 14:15
1284936

This release contains the changes from polkadot-unstable2604-rc3 to polkadot-unstable2604-rc4.

⚠️ Warning: Pre-release Version

The currently published version is a pre-release and is not yet a final stable version. This release is provided for testing purposes only, and there is no guarantee that everything will work as expected. Errors and unusual behaviours of some features are to be expected.

Please use this version at your own risk and report any issues you encounter. We recommend waiting for the official release if you need a stable version.

Changelog

Changelog for Node Dev

ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.

[#12080]: fix(statement-network): split peer metric by kind

Impl #12060

Summary

  • Change substrate_sync_statement_peers_connected from a plain gauge to a GaugeVec labelled by kind
  • Report statement protocol peers as kind="full" or kind="light"

[#11557]: Double max memory on block import

CallContext::Onchain now carries an import: bool field.
When import: true (block import), the WASM executor allocates double
the configured heap pages. When import: false (block building), behavior
is unchanged.

This is a breaking change for any code that constructs or matches on
CallContext::Onchain.

The WasmModule::new_instance trait method now requires a
HeapAllocStrategy parameter. The WasmInstance trait gains a new
set_heap_alloc_strategy method with a default no-op implementation.
WASM memory limits are no longer baked into the compiled artifact;
they are enforced per-instance at instantiation time via wasmtime
StoreLimits.

[#11387]: docs/async_back: Align docs to latest behavior

Tiny PR to update the async backing documentation / guidelines:

  • older params are no longer used async_backing_params
  • UNINCLUDED_SEGMENT_CAPACITY is now 3
  • no need for experimental feature flags

Closes: #8804

[#11641]: Fix runtime upgrade zombienet tests exceeding max_code_size

Zombienet runtime upgrade tests now use compact (WASM_BINARY) runtimes
instead of WASM_BINARY_BLOATY, which had grown beyond the relay chain's
max_code_size limit. A new submit_sudo_runtime_upgrade helper verifies
that the inner sudo dispatch succeeded and renders any dispatch errors using
runtime metadata (e.g. ParachainSystem::TooBig instead of raw byte indices).

[#11793]: Updated wasmtime to 36.0.7

Wasmtime 35.0.0 → 36.0.7

[#11745]: statement-store: fix unbounded growth of the evicted-hashes map

Fix unbounded growth of the evicted-statement map used for re-gossip suppression.
Naturally-expired statements are no longer inserted into the map, and the map is
now bounded to max_total_statements entries with deadline-ordered purging.

[#11762]: Bump collation in_peers to 300 for the experimental collator protocol

Bump MAX_AUTHORITY_INCOMING_STREAMS in peer_set to be in line with CONNECTED_PEERS_PARA_LIMIT
in experimental collator protocol.

[#11487]: statement-store: fix statement loss during major sync

Fixes two cases where statements are permanently lost during major sync.

New peers (fresh start): peers connecting while major sync is active are buffered in
deferred_peers instead of being added to the reserved set immediately. When sync ends
all buffered peers are added in one batch so each performs a fresh initial sync.

Already-connected peers (fall-behind): when a running node temporarily falls behind
and drops statements via the is_major_syncing() guard, one peer is force-disconnected
and re-added after a 1-minute window so it re-sends its statements via initial sync.
The recovery only fires when statements were actually dropped during sync.

[#11474]: Support multiple IndexOperation::Renew calls within a single extrinsic index in sc-client-db

Previously apply_index_ops used HashMap<u32, DbHash> so multiple Renew
operations at the same extrinsic index silently overwrote each other, blocking
batch-renewal inherents (e.g. the Bulletin chain's process_auto_renewals).

A new DbExtrinsic::MultiRenew variant carries all renewed hashes for an
extrinsic; single-renewal extrinsics still produce DbExtrinsic::Indexed
(backwards-compatible). Downstream consumers reading BODY_INDEX directly
must handle the new variant; users of the standard BlockchainDb APIs do not.

[#11329]: statement-store: Allow light clients to specify topic affinity

Adds explicit topic affinity to the statement protocol via a new "statement/2" protocol.
Peers can advertise which topics they care about using a bloom filter. Only matching
statements are forwarded to peers with an active affinity filter. When affinity changes,
relevant statements are re-sent. Light clients must advertise affinity before receiving
statements. Includes rate limiting on affinity advertisements.

[#11918]: Invalidate storage transaction cache on state version change

Fix a cache-bleed bug. The cache stored the pre-computed storage root and transaction without
recording which StateVersion was used to build them.

The cache now stores the state_version it was built with and is invalidated and recomputed
whenever a different version is requested.

[#11521]: Implement bitswap_v1_get RPC method

Implement bitswap_v1_get RPC method according to the spec.

[#11274]: Statement store: Latency bench cli sudo

Extend the statement-latency-bench CLI tool to automatically set up per-account statement allowances via sudo extrinsics.

Added a separate setup-allowances binary that issues subxt-based Sudo(batch_all(set_storage(...))) calls to write :statement_allowance: keys for each benchmark account. Extracted shared subxt configuration and test utilities into subxt_client and test_utils modules gated behind the test-helpers feature.

[#12207]: statement-store: remove unused Proof::OnChain variant

Removes the Proof::OnChain variant from sp_statement_store::Proof because it
was unused.

[#11667]: statement-store: read allowance on best hash

Use the best block hash instead of the finalized hash when checking statement
allowances during statement submission. This makes the store more responsive to
recent allowance changes. Allowance enforcement during eviction still uses the
finalized hash to ensure correctness. A statement accepted against best-block
state may later be evicted if that block does not get finalized, which is an
acceptable tradeoff.

[#11701]: statement-store: Test flooding detection

Fixed a bug with double peer state cleanup. Added two zombienet integration tests that verify statement-store flooding detection

[#11629]: collator-protocol: Enhance visibility into failed to fetch collations

This PR enhances the observability of our logs when validators refuse to fetch advertised collations.

The validator keeps track of advertised collations from collators.
Then, the validator checks if it has sufficient slots (is_slot_available) and if the collation can be seconded (can_second).
If either of the mentioned functions fails, the validator silently ignores the collation.

This PR aims to surface this behavior and help investigate further issues.

This PR is already deployed on validators and has surfaced:

Part of:

[#11962]: client/db, sp-transaction-storage-proof: preserve MultiRenew submit order

#11474 changed DbExtrinsic::MultiRenew::hashes from Vec<DbHash> to BTreeSet<DbHash>,
which reordered hashes by sort order. The runtime indexes TransactionInfo in dispatch
order, so build_proof and the runtime resolved selected_chunk_index to different
chunks, causing InvalidProof and chain halt on the first proof block after a multi-renew.

Reverted MultiRenew.hashes to Vec<DbHash>, preserving submission order and duplicates
so column refcount inc/dec stays symmetric.

[#11650]: Update PolkaVM to latest version (0.31 → 0.33)

Updates all PolkaVM dependencies from 0.31.0 to 0.33.0.

[#11838]: statement-store: fix metrics accuracy

Description

Fixes accuracy gaps and clarify help text in statement store and network metrics.

Integration

No integration needed.

[#11617]: statement-store: add channel replacement logic tests

Description

Implement unit tests for "Channel replacement: verify only higher-priority statements replace existing entries, corner cases of replacement logic." #11534

Summary

  • channel_replacement_only_higher_priority_succeeds -> verifies lower/equal priority rejected with ChannelPriorityTooLow, higher priority replaces, one-per-channel invariant preserved

  • channel_replacement_with_size_increase_evicts_others -> verifies that replacing a channel message with a larger one triggers additional eviction of lowest-priority non-channel statements to satisfy size constraints

[#11628]: fix: slot-based collator node exits immediately on startup

Regression from #11381: the wait_for_aura init wrapper was spawned as an essential task, but it
completes immediately after spawning the actual long-running collator tasks, causing the node to
shut down. Use spawn_handle() instead. Only affects --authoring=slot-based collators.

[#11906]: cli: Update list of AH Polkadot relay chain side peers

This PR updates the list of relay ...

Read more

Polkadot stable2603-3

Choose a tag to compare

@paritytech-polkadotsdk-release-rw paritytech-polkadotsdk-release-rw released this 28 May 16:12
e373717

This release contains the changes from polkadot-stable2603-2 to polkadot-stable2603-3.

ℹ️ Please note:

This is a patch release for the latest stable version: stable2603. If your nodes are already running on this stable release,
you should upgrade to this patch version to get the latest fixes.

The tag corresponding to the current patch release polkadot-stable2603-3 and matching the old pattern will be
available under polkadot-v1.22.3.

The node version for this release is: v1.22.3
The following crates were updated to the corresponding versions:

Click to see crates list
  • pallet-revive-fixtures@0.10.1
  • sc-network@0.56.1
  • pallet-revive@0.13.1
  • snowbridge-inbound-queue-primitives@0.10.1
  • frame-omni-bencher@0.18.1
  • polkadot-omni-node-lib@0.14.1
  • pallet-revive-eth-rpc@0.14.1

Changelog

Changelog for Node Dev

ℹ️ These changes are relevant to: Those who build around the client side code. Alternative client builders, SMOLDOT, those who consume RPCs. These are people who are oblivious to the runtime changes. They only care about the meta-protocol, not the protocol itself.

[#11574]: peerset/metrics: Add notification layer metrics for peer states

This PR adds two new metrics to enhance our monitoring insights into the notification protocol.

The data exposed:

  • connected peers grouped by in / out and kind (reserve / non-reserve)
  • disconnected and backed off peers

Because the slot counts are tightly coupled with the full peerset state machine, I've picked an eventually consistent model to easily bump the metrics at 1s tick intervals.

Changelog for Runtime Dev

ℹ️ These changes are relevant to: All of those who rely on the runtime. A parachain team that is using a pallet. A DApp that is using a pallet. These are people who care about the protocol (WASM, not the meta-protocol (client).)

[#11919]: Snowbridge: Set default asset claimer to local network

The inbound-queue v2 message converter falls back to the Snowbridge sovereign account on AssetHub as the asset claimer when no explicit claimer is supplied.
Previously this fallback used AccountId32 { network: None, .. }, which did not match the location AssetHub's signed-origin converter produces (it sets network: Some(LocalNetwork)). The trap-key hash stored on AssetsTrapped therefore could not be matched by a signed polkadotXcm.claim_assets call, making default-claimer trapped funds effectively unrecoverable without a
runtime upgrade.

This PR sets network: Some(LocalNetwork::get()) on the fallback claimer so its Location agrees with what SignedToAccountId32<_, _, LocalNetwork> yields on AssetHub, and adds a test covering the no-claimer-supplied path.

[#12035]: Expose BLS host functions to the omni-bencher

Expose BLS host functions to frame-omni-bencher.

[#11000]: Revive, Estimate Gas with Binary Search

Description

This PR implements binary search for the gas estimation logic in the eth-rpc which means that gas estimations are no longer just simple dry runs but that binary search is now used to find the smallest gas limit at which the transaction would run.

This PR closes paritytech/contract-issues#217 and also kind of fixes paritytech/contract-issues#259 or at least makes it harder to trigger the case in which we observe it, but the underlying issue still exists.

The binary search algorithm implemented in this PR is as close as possible to that used in Geth

Changelog for Node Operator

ℹ️ These changes are relevant to: Those who don't write any code and only run code.

[#12006]: [stable2603] Improve TransactionStorageApi runtime api check

Improves the TransactionStorageApi runtime API version check in the Polkadot Omni Node to use a version-aware comparison (has_api_with) instead of a simple version-existence check (has_api). This ensures that bulletin chain runtimes that implement the API are correctly detected as compatible with older collators.

Rust compiler versions

This release was built and tested against the following versions of rustc.
Other versions may work.

  • Rust Stable: 1.93.0

Docker images

The docker images for the polkadot node binary and the polkadot-parachain binary can be found at Docker hub (will be available a few minutes after the release has been published):

You may also pull it with:

docker pull parity/polkadot:stable2603-3

or

docker pull parity/polkadot-parachain:stable2603-3