This release contains the changes from polkadot-stable2506
to polkadot-stable2509-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
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.
[#9063]: sp-tracing
: Remove test-utils
feature
The crate is already exposing testing related features by default, so there is no real need to hide the rest behind some feature. Also because of feature unification, the feature is enabled always in the workspace.
[#9050]: dispute-coordinator: handle race with offchain disabling
Fixes a potential race with off-chain disabling when we learned about disablement after importing a dispute from that validator.
[#8833]: Check artifact integrity before execution
In case of a corrupted artifact, we can find it out before execution and re-prepare the artifact.
[#8908]: [pvf-worker] Refactor execute request handling
PVF execution worker communication was organized into a single ExecuteRequest struct. This should improve performance: one encode/decode operation instead of four. Also, no more chance of ordering mistakes.
[#9753]: Fix Aura authorities tracker bug
Fix a bug in the Aura authority tracker that resulted in an improper hash being used as the key for the authority set. As a result, a new authority couldn't be introduced to the set.
[#9488]: prdoc: add missing crates bumps
Adds a few crate bumps associated to PRs which missed to bump them due to a corner case missed by the release tooling.
[#8646]: emit sparse debug info in unoptimized builds
See here for more details.
I found that on my host, this reduces cargo build
(after cargo clean
) from 19m 35s to 17m 50s, or about 10%.
[#9312]: yap-runtime: fixes for GetParachainInfo
This fixes the YAP parachain runtimes in case you encounter a panic in the collator similar to paritytech/zombienet#2050:
Failed to retrieve the parachain id
(which we do have zombienet-sdk tests for here)
[#9262]: Adds support for additional relay state keys in parachain validation data inherent
Adds the possibility for parachain clients to collect additional relay state keys into the validation data inherent.
[#9287]: network: Upgrade litep2p to v0.10.0
litep2p v0.10.0
This release adds the ability to use system DNS resolver and change Kademlia DNS memory store capacity. It also fixes the Bitswap protocol implementation and correctly handles the dropped notification substreams by unregistering them from the protocol list.
Added
Fixed
- notification: Unregister dropped protocols (#391)
- bitswap: Fix protocol implementation (#402)
- transport-manager: stricter supported multiaddress check (#403)
[#9159]: fatxpool
: debug levels adjusted
This PR removes redundant debug message and lowers the info about timeout in ready_at
.
[#8596]: fatxpool
: limits handling optimizations and fixes
This PR adds some optimization and fixes in handling limits in fork-aware transaction pool.
[#9059]: Fetch parent block api_version
This is required to ensure that we use the api_version
of the runtime that will be used on the relay chain to validate the block. Otherwise the node may thinks the runtime was already upgraded and sends data to the relay chain that can not be decoded by the runtime and thus, the validation fails.
[#9868]: Fix the deadlock during statements gossiping
During high load the statement store experiences deadlock-like behavior: every second statements were gossiping, locking the index which possibly caused the deadlock. After the fix, the observed behavior no longer occurs.
[#8834]: extend overseer to send priority messages
Extend overseer to send priority messages, the new functionality is used for sending messages on the grandpa call path when we call dispute-coordinator and approval-voting in finality_target_with_longest_chain to make sure we don't block unnecessarily.
[#8828]: [subsystem-bench] Add Dispute Coordinator subsystem benchmark
Adds a subsystem benchmark for the Dispute subsystems
[#8875]: fatxpool
: ChainApi
is now async
Internal ChainApi
is now async_trait
, validate_transaction
and block_body
are now async
methods. This is just cleanup - migrating from returning Future
to async
method'.
[#9319]: Collation metrics: exclude drops of fork-based collations to improve metrics accuracy
Improves the accuracy of the collation metrics excluding drops of fork-based collations expected by design for lookahead collators.
Metrics are now only sent for collations that were either finalized or dropped.
[#8651]: polkadot-omni-node: add GetParachainInfo
runtime api
This PR deprecates the para_id
field of parachain chain specifications.
- Both
polkadot-omni-node
&polkadot-parachain
are still supporting thepara_id
field passed via chain specifications, whileparachain-template-node
supports only runtime API based provided parachain id. - This PR also changes
minimal-template-runtime
to not run anymore with Omni Node. chain-spec-builder
still supports generating chain specifications withpara_id
field.- Starting with
stable2509
polkadot-parachain
/parachain-template-node
will generate chain specs that are not compatible
with prior node versions becausepara_id
field will not be added anymore to the resulting chain specs.
Starting with stable2509
the para_id
field of chain specification is not required anymore, and runtime developers will be able
to specify it to nodes by implementing the runtime API cumulus_primitives_core::GetParachainInfo
.
Starting with stable2512
the para_id
field of chain specification will not be supported anymore by node versions and
chain-spec-builder
will drop its support, so it is mandatory for runtimes to implement the GetParachainInfo
trait to still be compatible with the nodes.
[#8837]: Cache locally controlled validator indices in dispute-coordinator
dispute-coordinator
uses keystore.key_pair()
to obtain the set of locally controlled validator IDs. This operation happens on each import and is expensive because it involves key generation from a seed phrase. This patch lazily determines the set of locally controlled validator IDs and caches the result for each session.
[#9479]: cargo: Use rust-yamux version 0.13.6
This PR updates the litep2p' rust-yamux crate to version 0.13.6.
This version solves the following issue:
0: sp_panic_handler::set::{{closure}}
1: std::panicking::rust_panic_with_hook
2: std::panicking::begin_panic_handler::{{closure}}
3: std::sys::backtrace::__rust_end_short_backtrace
4: rust_begin_unwind
5: core::panicking::panic_fmt
6: core::slice::index::slice_start_index_len_fail::do_panic::runtime
7: core::slice::index::slice_start_index_len_fail
8: <yamux::frame::io::Io as futures_sink::Sink<yamux::frame::Frame<()>>>::poll_ready
9: yamux::connection::Connection::poll_next_inbound
10: litep2p::transport::websocket::connection::WebSocketConnection::start::{{closure}}
11: <litep2p::transport::websocket::WebSocketTransport as litep2p::transport::Transport>::accept::{{closure}}
12: <tracing_futures::Instrumented as core::future::future::Future>::poll
13: tokio::runtime::task::raw::poll
14: tokio::runtime::scheduler::multi_thread::worker::Context::run_task
15: tokio::runtime::scheduler::multi_thread::worker::run
16: tokio::runtime::task::raw::poll
17: std::sys::backtrace::__rust_begin_short_backtrace
18: core::ops::function::FnOnce::call_once{{vtable.shim}}
19: std::sys::pal::unix::thread::Thread::new::thread_start
20: start_thread
at /build/glibc-FcRMwW/glibc-2.31/nptl/pthread_create.c:477:8
21: clone
at /build/glibc-FcRMwW/glibc-2.31/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Part of: #9169
[#8923]: fatxpool
: fix: remove invalid txs from the dropped stream controller
While testing mortal transaction I encountered exactly the same problem as in #8490.
This PR should fix the problem.
fixes: #8490
[#9044]: Fix regression benchmarks
Updates benchmark thresholds
[#8832]: increase session index cache
A 10 session index cache is not enough when you run under intense pressure and finality is lagg since you will end requesting the session index for blocks older than that. So let's make this cache larger to achieve its purpose even under intense load when it actually matters more to be faster.
The session_index_cache keeps a Hash and a u32, so that's about 36 bytes per entry, with this increase it can grow up to 65k which is not that big in my book.
[#9055]: Add para_ids
Runtime API
Add a new runtime API for querying the registered paraids at a relay parent (both on-demand parachains and parachains).
This can be used for pruning the reputation database for the new collator protocol, so that we don't keep storing reputations indefinitely for parachains that have been offboarded.
[#9677]: Update elastic scaling documentation
Updated elastic scaling guide. Removes the guide for the MVP version.
[#8973]: Add polkadot_parachain_peer_connectivity metric
Adds polkadot_parachain_peer_connectivity
histogram metric to better understand connectivity patterns.
[#9315]: network/kad: Increase memory store capacity for providers
Increase Kademlia memory store capacity for DHT content providers (used by parachain DHT-based bootnodes) and reduce provider republish interval & TTL. This is needed to support testnets with 1-minute fast runtime and up to 13 parachains.
Parameters set:
- 10000 provider keys per node
- 10h provider record TTL
- 3.5h provider republish interval
Closes paritytech/litep2p#405.
[#9309]: Make RecentDisputes/ActiveDisputes use BTreeMap
Make dispute-coordinator forward BTreeMap/BTreeSet to provisioner directly instead of converting it to Vec as before.
[#9432]: CumulusDigestItem: Add function to fetch the relay block identifier
This simplifies code paths that are fetching these information from a parachain header.
[#9703]: Cumulus: adjust authorship duration
Adjust block authorship duration when a parachain uses more than 3 cores.
[#9015]: consensus/grandpa: Fix high number of peer disconnects with invalid justification
A grandpa race-casse has been identified in the versi-net stack around authority set changes, which leads to the following:
- T0 / Node A: Completes round (15)
- T1 / Node A: Applies new authority set change and increments the SetID (from 0 to 1)
- T2 / Node B: Sends Precommit for round (15) with SetID (0) -- previous set ID
- T3 / Node B: Applies new authority set change and increments the SetID (1)
In this scenario, Node B is not aware at the moment of sending justifications that the Set ID has changed.
The downstream effect is that Node A will not be able to verify the signature of justifications, since a different SetID is taken into account. This will cascade through the sync engine, where the Node B is wrongfully banned and disconnected.
This PR aims to fix the edge-case by making the grandpa resilient to verifying prior setIDs for signatures.
When the signature of the grandpa justification fails to decode, the prior SetID is also verified. If the prior SetID produces a valid signature, then the outdated justification error is propagated through the code (ie SignatureResult::OutdatedSet
).
The sync engine will handle the outdated justifications as invalid, but without banning the peer. This leads to increased stability of the network during authority changes, which caused frequent disconnects to versi-net in the past.
Review Notes
- Main changes that verify prior SetId on failures are placed in check_message_signature_with_buffer
- Sync engine no longer disconnects outdated justifications in process_service_command
Testing Done
- Deployed the PR to versi-net with 40 validators
- Prior we have noticed 10/40 validators disconnecting every 15-20 minutes, leading to instability
- Over past 24h the issue has been mitigated: https://grafana.teleport.parity.io/goto/FPNWlmsHR?orgId=1
- Note: bootnodes 0 and 1 are currently running outdated versions that do not incorporate this SetID verification improvement
Part of: #8872
[#9128]: Rewrite validator disabling test with zombienet-sdk
Migrate validator disabling test to the new version of zombienet
[#8948]: make sure dispute_coordinator/approval-voting parallel can receive priority messages
#8834, changed relay_chain_selection to send priority messages, but did not configured
the subsystems to tell they can receive priority messages, with can_receive_priority_messages
flag.
If can_receive_priority_messages
is not specified orchestra falls back when sending a priority message to the normal queue,
so this resulted in the messages not being processed ahead of the others in the queue.
Fix this configuration mistake and add a test to make sure priority messages are consumed ahead of normal ones by the subsystems.
[#8152]: fatxpool
: some more integration tests
Some new test cases and improvements of zombienet integration tests for fatxpool
.
[#8839]: net/discovery: File persistence for AddrCache
Persisting the AddrCache periodically (every 10 minutes) and on worker
shutdown. Read AddrCache from file upon launch of worker.
AddrCache is saved as authority_discovery_addr_cache.json in the
folder configured by net_config_path of NetworkConfiguration.
This reduces the time it takes for a node to reconnect to peers after
restart.
[#9495]: fatxpool
: buckets for event-timings metrics adjusted
This PR adjusts the buckets for transactions' event-timings metrics as requested in #9158 for reliability dashboard.
fixes: #9158
[#8896]: Improvements for ControlledValidatorIndices
Improvements for ControlledValidatorIndices
:
- remove unneeded dependency
- more readable implementations for
get
andfind_controlled_validator_indices
[#8714]: Upgrade wasmtime
This upgrades wasmtime to the latest version and also fixes backtraces for debug
builds.
[#8882]: Fix flaxy 0003-block-building-warp-sync
test
Fixes: #8868
The error skipped in log is acceptable, the announced block does not have the parent imported yet.
[#8172]: Ignore trie nodes while recording a proof
This pull requests implements support for ignoring trie nodes while recording a proof. It directly includes the feature into basic-authorship
to later make use of it in Cumulus for multi-block PoVs.
The idea behind this is when you have multiple blocks per PoV that trie nodes accessed or produced by a block before (in the same PoV
), are not required to be added to the storage proof again. So, all the blocks in one PoV
basically share the same storage proof.
This also impacts things like storage weight reclaim, because ignored trie node do not contribute a to the storage proof size (similar to when this would happen in the same block).
In your node you only need to do the following change:
-let proposer = Proposer::new(proposer_factory);
+
The cumulus_client_consensus_proposer::Proposer
type was removed.
[#9175]: Deduplicate client-side inherents checking logic
Stumbled upon this while working on other issue (#7902). I thought I might need to change the CheckInherentsResult
and this deduplication would have made everything easier. Probably changing CheckInherentsResult
won't be needed in the end, but even so it would be nice to reduce the duplication.
[#8831]: dispute-coordinator: increase lru_observed_blocks_capacity
Under increase load with finality lagging behind there is a risk for blocks to arrive late or out of sequence in that case we will end up scrapping from the received block un till last finalized block and then process all the dispute in-between.
This couple with other inefficiencies like #8823 will increase unnecessarily the load on dispute-coordinator.
Decided to make this super large to err on the cautious side, the Hash size is only 32 bytes, so this will make the LRU grow up to 65k, which I don't think is a significant increase.
[#8939]: Always send full parent header, not only hash, part of collation response
Implementation of #7733
Description
Instead of conditionally sending the full parent header in the collation response we now always send it (never the hash of it).
[#9201]: polkadot-parachain
: fixes and changes related to GetParachainInfo
- Provides some updated to the asset-hub-westend-local chain specification, by adding appropriate genesis patch for parachainInfo.
- refactors the logic related to fetching
para_id
with the node, so that when failing to useGetParachainInfo::parachain_id
we also get a log with the error (before defaulting topara_id
extracted from chain spec). - removes comments/deprecation notices throughout the code that introduce para-id flag removal (from chain-spec-builder and support for parsing it from chain specifications)
[#9251]: Allow setting idle connection timeout value in custom node implementations
Allow setting idle connection timeout value. This can be helpful in custom networks to allow maintaining long-lived connections.
[#8974]: Fix flaxy 0003-block-building-warp-sync test - one more approach
See the explanation in this comment:
#8868 (comment)
[#9255]: Fix CandidateDescriptor debug logs
Implement core::fmt::Debug by hand and differentiate the output based on CandidateDescriptorVersion.
[#9321]: network/litep2p: Switch to system DNS resolver
Switch to system DNS resolver instead of 8.8.8.8 that litep2p uses by default. This enables full administrator control of what upstream DNS servers to use, including resolution of local names using custom DNS servers.
Fixes #9298.
[#8836]: fatxpool
: report_invalid
is now aync
TransactionPool::report_invalid
is now async
, function was typically used in async context, seems right to be fully async.
[#8894]: remove enable_approval_voting_parallel cli flag
This has been running on polkadot since #7504, so it is time to remove the flag that allowed us to run either with approval-voting-parallel or with approval-distribution and approval-voting subsystems.
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).)
[#8937]: [Staking] [AHM] Fixes insufficient slashing of nominators and some other small issues.
Removed
- Config constant
MaxDisabledValidators
: This constant was removed since validator disabling logic has been moved to pallet-session, making it redundant in staking-async. - Storage DoubleMap
NominatorSlashInEra
: This was used to track per-era maximum slashes for nominators. It’s no longer required — we now only track the highest slash per validator per era. - Call
withdraw_overstake
: This was a temporary extrinsic meant to fix overstake issues, but with fungible migration of staking funds, this is no longer possible and the extrinsic is obsolete.
Changed
- Nominator slashing logic: The logic now aggregates slashes from distinct offending validators nominated by a nominator within the same era. For repeated offences by the same validator, only the highest slash fraction is applied. Previously, the pallet applied only the highest slash across all validators, regardless of how many were slashed.
[#9641]: Account for PoV size when enqueing XCMP message
Related to #9630 , but adjusting the benchmark
Using #[benchmark(pov_mode = Measured)]
for the enqueue_empty_xcmp_message_at
benchmark.
[#9772]: EPMB: ensure to have enough funds for benchmarking
Fix pallet_election_provider_multi_block_signed::register_eject
benchmark failing on KAHM due to funded_account()
function not providing enough balance to cover the required deposits.
The fix ensures that benchmark accounts have sufficient funds to cover the worst-case deposit scenario (registration + all pages submission) with a consistent safety margin.
[#8883]: [pallet-revive] Make Runtime call dispatchable as eth transaction
Make RuntimeCall dispatchable as eth transaction.
By sending a transaction to 0x6d6f646c70792f70616464720000000000000000
, using the encoded runtime call as input, the call will be executed by this given origin.
see paritytech/foundry-polkadot#130
e.g sending a remark_with_event
cast wallet import dev-account --private-key 5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133
cast send --account dev-account 0x6d6f646c70792f70616464720000000000000000 0x0007143132333435
[#8848]: Snowbridge: Improve local and testnet setup
Enable the Prague-Electra fork by default.
Improve Penpal Runtime to include pallet-utility.
[#9781]: Limit the number of signals per XCMP page
Right now we have only 2 XCMP signals: SuspendChannel
and ResumeChannel
and we can write at most 1 per page.
Let's also add a limit when reading the signals in a page. Even if now 1 is enough, since in the future we might add more signals, let's have a limit of 3 per page.
[#9746]: Snowbridge Inbound Queue V2 relayer tip payout fix
Fixes a bug where relayer tips were not properly paid out, causing the tips to be lost since it had already been burnt.
[#9416]: pallet_revive: Enforce storage deposit limit on plain transfer
The existential deposit to create a new account is part of the storage deposit. Hence if the storage deposit limit is too low to create a new account we fail the transaction. However, this limit was not enforced for plain transfers. The reason is that we only enforce the limit at the end of each frame. But for plain transfers (transferring to a non contract) there is no frame.
This PR fixes the situation by enforcing the limit when transferring the existential deposit in order to create a new account.
[#9455]: [pallet-revive] Migrate to_account_id
from host function to pre-compile
Moves the unstable host function to_account_id
to the System
pre-compile.
[#9316]: Enable TopicIdTracker
to support multiple flows
This PR enables TopicIdTracker
to support multiple flows.
[#7321]: Update system parachains XCM benchmarking for sibling parachain delivery
Updates cumulus::parachain runtime XCM benchmarking to support asset delivery to system parachains instead of relay chain.
[#9504]: Fix pallet_session
benchmarks
Fixes the benchmarking code of pallet_session
such that it works with any KeyDeposit
.
[#8666]: EPMB: Handle empty solution pages gracefully in verifier
- Treat missing solution pages as empty rather than errors.
- Updated
get_page
method now returns a default Solution instead of an Option when no candidate solutions are available. This simplifies the API and improves code clarity by removing the need to handle None cases. - Similarly, updated
get_score
method now returns a default (0) score if no leader is available. - Removed VerificationDataUnavailable now that
get_page
andget_score
don't return an Option anymore - Signed validation phase must now be a multiple of the number of pages
- Moved verifier stop logic to internal pallet method, removing the trait-level stop function in favor of handling cleanup during verification failure.
- Updated tests to reflect new behavior and remove defensive unwraps.
[#9049]: Optimize buffered offence storage and prevent unbounded growth in staking-async ah-client pallet
- Prevents duplicate offences for the same offender in the same session by keeping only the highest slash fraction
- Introduces
BufferedOffence
struct with optional reporter and slash fraction fields - Restructures buffered offences storage from
Vec<(SessionIndex, Vec<Offence>)>
to nestedBTreeMap<SessionIndex, BTreeMap<AccountId, BufferedOffence>>
- Adds
MaxOffenceBatchSize
configuration parameter for batching control - Processes offences in batches with configurable size limits, sending only first session's offences per block
- Implements proper benchmarking infrastructure for
process_buffered_offences
function - Adds WeightInfo trait with benchmarked weights for batch processing in
on_initialize
hook
This addresses potential memory issues and improves efficiency of offence handling during buffered operating mode while maintaining backward compatibility.
[#9753]: Fix Aura authorities tracker bug
Fix a bug in the Aura authority tracker that resulted in an improper hash being used as the key for the authority set. As a result, a new authority couldn't be introduced to the set.
[#8935]: Fix prestate create traces
Fix an issue on the prestate tracer, for CREATE trace.
The tracer was not reporting the created code properly in the post state trace.
Also added tests in evm-test-suite paritytech/evm-test-suite#97
[#8794]: renamed wasm module in pallet-revive to vm
fixes #8341
[#9787]: EPMB: fix benchmark funding for exponential deposit growth
Fixes funding issues in benchmarks that were failing on Asset Hub Kusama with "Funds are unavailable" errors.
Two root causes:
funded_account()
calculated deposits using current queue state, butGeometricDepositBase
causes exponential growth:deposit = base * (1 + increase_factor)^queue_len
.- we were not taking into account transaction fees
Solution:
- Calculate deposits using worst-case scenario with maximum queue size (
T::MaxSubmissions::get()
) to ensure adequate funding regardless of queue state changes during benchmark execution. - Estimate total transaction fees as 1% of min balance x number of operations
[#9441]: [pallet-revive] Implement basic System
pre-compile, move seal_hash_blake2_256
into it.
Implements a basic System
pre-compile and moves the unstable host function hash_blake2_256
in there.
[#9470]: Bridges - relax trait bound from Codec to Encode
Relaxing the type SignedTransaction
constraint from Codec
to Encode
.
[#9267]: pallet-revive: Raise contract size limit to one megabyte and raise call depth to 25
This PR changes the contract code limit from roughly 100KiB to exactly 1MiB. It also raises the call stack depth from 5 to 25.
Those limits were in place because of memory constraints within the runtime. We work around them in those ways:
- Removing the 4x safety margin for allocations which is no longer needed due to the new allocator.
- Limiting the size of the compilation cache to a fixed size.
- Resetting the compilation cache and flat map every time we call into a new contract.
- Limiting the size of calldata and return data to 128KiB (only capped by tx size and RAM before). While this is a breaking change nobody will be affected since Geth effectively limits the call data to 128KiB.
1MiB contracts
This is large enough so that all known contracts won't fail for size issues anymore.
The new limit is also much simpler to understand since it does not depend on the number of instructions. Just those two constraints:
PVM_BLOB.len() < 1 MiB
PVM_BLOB.len() + (rw/ro/stack) < 1MiB + 512KiB
This means:
- A contract is guaranteed to have at least 512KiB of memory available.
- A contract that is smaller in code can use more memory.
- Limit is exactly 1MiB unless a user manually increase the memory usage of a contract to be larger than 512KiB.
Call stack depth 5 -> 25
The limit of 5
was problematic because there are use cases which require deeper stacks. With the raise to 25
there should be no benign use cases anymore that won't work.
Please note that even with the low limit of 25
contracts are not vulnerable to stack depth exhaustion attacks: We do trap the caller's context when the depth limit is reached. This is different from Eth where this error can be handled and failure to do so leaves the contract vulnerable.
[#9318]: Replace log
with tracing
on pallet-bridge-parachains
This PR replaces log
with tracing
instrumentation on pallet-bridge-parachains
by providing structured logging.
[#8742]: [pallet-revive] prestate tracer
- Add prestate tracer
- Add coinbase runtime API to get the miner's address
tested against geth with paritytech/evm-test-suite#93
[#8840]: Add poll_index
to conviction-voting Voted
and VoteRemoved
events
This PR includes poll_index
field to the Voted
and VoteRemoved
events to aid the identification of which referendum a voter voted
[#9288]: Replace log
with tracing
on bridge-runtime-common
This PR replaces log
with tracing
instrumentation on bridge-runtime-common
by providing structured logging.
[#9056]: add benchmark for prune-era
Add benchmarking and weight calculation for prune_era
in staking-async
.
[#9836]: Add remove_by
method to statement store runtime interface
The runtime interface for the statement store and the extensions have a new method remove_by
that allows removing all statements made by one account. This is useful for cleaning up statements after the allowance given to an account has been revoked.
The actual rust semver is major but we consider the rust semantic experimental until we use it in production.
[#9084]: Fix MaxEncodedLen
implementation for Error
enum
Updates the MaxEncodedLen
implementation for the XCM Error
enum to correctly calculate the maximum encoded size.
[#8809]: Add possibility of executing or mocking additional inherents in xcm-emulator
This extends the decl_test_parachains
macro to accept a AdditionalInherentCode
type. This type needs to implement the AdditionalInherentCode
trait and will be called after on_initialize
and before on_finalize
.
It can be used to mock additional inherents.
[#9141]: Asset Hub Westend: nfts pallet uses Relay Chain as block provider
The nfts pallet collections uses the Relay Chain as block provider for the time range of mint.start_block
and mint.end_block
[#9564]: Fix disabled validator filtering in the parachains runtime
Correctly map group indices to vote indices when filtering backing statements.
[#8980]: Fix revive-fixtures build script
Fix compilation issue with pallet-revive-fixtures build.rs script.
[#7250]: Add Missing Events for Balances Pallet
This PR improves accounting by implementing missing events for hold, release, credit drops and debt drop operation:
Emit events for hold-related operations (Held
, Released
, BurnedHeld
, TransferOnHold
, TransferAndHold
, BurnedDebt
, MintedCredit
).
Adjust total issuance automatically when PositiveImbalance
or NegativeImbalance
are dropped via the HandleImbalanceDrop
trait.
[#7997]: [AHM] The Asset Hub Migration on Westend
Post AHM changes for Westend Relay and Asset Hub.
[#8802]: [AHM] Staking async e2e zn and papi tests
Adds end-to-end tests for staking async using zombienet and papi.
[#8537]: Allow RelaychainDataProvider set_block_number to be used in tests set_block_number
in the RelaychainDataProvider
trait can now be used in tests. Previously this was only included with the runtime-benchmarks
feature.
[#9458]: Handle invulnerable AH collators with priority in collator-protocol
Implements priority handling of invulnerable AH collators which consists of:
- Connection management - there is a connection limit in the networking stack of 100 peers after which no new connections are accepted. To make sure that the invulnerable collators can always connect to the validators permissionless collators are getting disconnected one the connection count is close to the limit.
- Collations from permissionless collators are held off for some time before processing so that the invulnerables have got a chance to put a collation on their own.
[#8723]: Scheduler on_initialize
supports skipped blocks
Scheduler correctly handles situations where on_initialize
is invoked with block numbers that:
- increase but are not strictly consecutive (e.g., jump from 5 → 10), or
- are repeated (e.g., multiple blocks are built at the same Relay Chain parent block, all reporting the same
BlockNumberProvider
value).
This situation may occur when theBlockNumberProvider
is not local - for example, on a parachain using the Relay Chain block number provider.
Implementation notes: - The
IncompleteSince
value is always set to the next block(now + 1)
. - A scheduled task is considered permanently overweight only if it fails during the first agenda processing.
[#9177]: align eth-rpc response with geth
- Update serde encoding for eth-rpc to match serialization behavior of Geth
[#9756]: FRAME: Register on_initialize
after each pallet
Before this pull request, FRAME was executing all pallets on_initialize
and then register the weight, including the weight of on_runtime_upgrade
. Thus, other pallets were not aware on how much weight was already used when they were executing their on_initialize
code. As some pallets are doing some work in on_initialize
, they need to be aware of how much weight is still left.
To register the weight after each on_initialize
call, a new trait is added. This new trait is implemented for tuples of types that implement OnInitialize
and then it registers the weight after each call to on_initialize
.
pallet-scheduler
is changed to take the remaining weight into account and to not just assume that its configured weight is always available.
[#9079]: Prevent withdrawals while processing offences
Adds withdrawal restrictions to prevent users from withdrawing unbonded funds while there are unprocessed offences that could result in slashing. This is a defensive measure that ensures slashing guarantees are maintained even in extreme edge cases.
Key changes:
- Withdrawals are blocked if there are unapplied slashes from the previous era (returns
UnappliedSlashesInPreviousEra
error). This occurs when all unapplied slashes for an era could not be applied within one era worth of blocks. While one era is reserved for applying slashes page by page, if the era rolls over before completion, these slashes can only be applied via the permissionless
apply_slash
call. - Withdrawals are restricted to the minimum of the active era and the last fully processed offence era
- Unbonding chunks are now keyed by active era instead of current era
- Offences arriving after their intended application era are rejected and emit
OffenceTooOld
event
Both the UnappliedSlashesInPreviousEra
error and withdrawal restrictions due to
delayed offence processing are extremely rare scenarios that should not occur under
normal operation. These are defensive measures to handle edge cases where slash
processing is delayed beyond expected timelines.
[#9602]: Fix check_hrmp_message_metadata()
We need to update maybe_prev_msg_metadata
inside check_hrmp_message_metadata()
[#9001]: revive: Precompiles should return dummy code when queried
Fixes paritytech/contract-issues#111
This fixes both the RPC and the opcodes EXTCODESIZE
and EXTCODEHASH
.
Also removed the disabled host function is_contract
. Contracts do use EXTCODESIZE
to determine if something is a contract exclusively.
Need to add some differential tests to our test suite to make sure that the RPC matches geth behaviour:
On kitchensink:
# primitive precompiles should not return error but 0x
$ cast code 0x0000000000000000000000000000000000000001
0x
# this is the erc pre-compile
$ cast code 0x0000000000000000000000000000000000010000
0x60006000fd
[#8897]: [pallet-revive-rpc] fix sqlite in-memory connection pool issue
Fix in-memory sqlite connection pool issue
see launchbadge/sqlx#2510
[#8829]: Eth transaction do not double bump the nonce
Add an extra eth_instantiate_with_code
dispatchable that is used by the EVM compatibility layer and ensures that the origin's nonce is only incremented once
Fixes paritytech/contract-issues#64
[#9105]: feat(binary-merkle-tree): add merkle_root_raw
and merkle_proof_raw
methods
Resolves #9103
Added merkle_root_raw
and merkle_proof_raw
methods, which allow developers to avoid double hashing when working with sequences like Vec<H256>
, where H256
is already hash of some message.
[#9380]: [Staking/AHM] Properly report weight of rc -> ah xcm back to the calls
Properly report weight of rc -> ah xcm back to the calls, which will consequently make the XCM/MQ code path aware of the weights, which was previously not the case.
Additionally, adds an event for when an era is pruned.
[#9619]: [AHM/Staking/VMP] Paginated Offence Reports + Retries for Validator Set
This PR makes the following changes:
Common
SendToRelayChain
andSendToAssetHub
traits now return a result, allowing the caller to know if the underlying XCM was sent or not.
Offences
SendToAssetHub::relay_new_offence
is removed. Instead, we use the newrelay_new_offence_paged
which is a vector of self-contained offences, not requiring us to group offences per session in each message.- Offences are not sent immediately anymore.
- Instead, they are stored in a paginated
OffenceSendQueue
. on-init
, we grab one page of this storage map, and sent it.
Session Report
- Session reports now also have a retry mechanism.
- Upon each failure, we emit an
UnexpectedEvent
- If our retries run out and we still can't send the session report, we will emit a different
UnexpectedEvent
. We also retore the validator points that we meant to send, and merge them back, so that they are sent in the next session report.
Validator Set
- Similar to offences, they are not sent immediately anymore.
- Instead, they are stored in a storage item, and are sent on subsequent on-inits.
- A maximum retry count is added.
[#8952]: Migrate pallet-bounties benchmark to v2
Migrate pallet-bounties benchmark to v2
[#9415]: Cleanup staking try states + fix min bonds
ensures staking try-state code passes, and fixes issues of having a mistakenly high min-bond for validators
[#9235]: Remove unused deps
Remove unused deps using cargo udeps
[#8693]: Add XCM Precompile to pallet-xcm
This PR adds the XCM precompile (with xcmSend
, xcmExecute
and weighMessage
functionalities) to pallet-xcm
.
This follows the discussion we had on a closed PR, which attempted to add the precompile to pallet-revive
, but that approach would have introduced unwanted cyclic dependencies. That's why we decided to migrate the precompile to pallet-xcm
, avoiding adding unnecessary dependencies to pallet-revive
.
Follow up PR will add integration tests under cumulus/parachains/integration-tests/emulated/tests
.
[#9411]: staking-async/papi-tests: fix justfile to run in CI
Running the just step within a bash shell, ensures that the error is properly handled and propagated without terminating the just script.
[#9721]: staking-async: handle uninitialized state in try-runtime checks
Handle the case where ActiveEra is None (uninitialized staking state) in the try-state checks.
This fixes try-runtime failures when deploying staking-async for the first time on chains without existing staking.
[#9191]: Fixed westend asset hub ID
Added cumulus_primitives_core::GetParachainInfo impl to the AHW runtime to get the parachain ID.
[#8651]: polkadot-omni-node: add GetParachainInfo
runtime api
This PR deprecates the para_id
field of parachain chain specifications.
- Both
polkadot-omni-node
&polkadot-parachain
are still supporting thepara_id
field passed via chain specifications, whileparachain-template-node
supports only runtime API based provided parachain id. - This PR also changes
minimal-template-runtime
to not run anymore with Omni Node. chain-spec-builder
still supports generating chain specifications withpara_id
field.- Starting with
stable2509
polkadot-parachain
/parachain-template-node
will generate chain specs that are not compatible
with prior node versions becausepara_id
field will not be added anymore to the resulting chain specs.
Starting with stable2509
the para_id
field of chain specification is not required anymore, and runtime developers will be able
to specify it to nodes by implementing the runtime API cumulus_primitives_core::GetParachainInfo
.
Starting with stable2512
the para_id
field of chain specification will not be supported anymore by node versions and
chain-spec-builder
will drop its support, so it is mandatory for runtimes to implement the GetParachainInfo
trait to still be compatible with the nodes.
[#9067]: [AHM] Derive DecodeWithMemTracking and pub fields
- Derive
DecodeWithMemTracking
on structs - Make some fields public
[#9325]: Fix pallet-im-online benchmarking for runtimes with MaxKeys < 1000
Fixes benchmarking for pallet-im-online when runtime configuration has MaxKeys < 1000.
Previously, the benchmark code used a hardcoded constant MAX_KEYS = 1000 which would cause benchmark failures for runtimes configured with fewer maximum keys. This change updates the benchmark to dynamically use the MaxKeys value from the pallet's Config trait.
[#9004]: chore: Bump bounded-collections dep
Description
Bump bounded-collections dep from 0.2.3
to 0.3.2
based on the latest release
[#8746]: [pallet-revive] dev-node
This adds a dev-node that is essentially the minimal template with the addition of pallet-revive can be launched with
RUST_LOG="error,sc_rpc_server=info,runtime::revive=debug"
cargo run -p revive-dev-node -- --no-prometheus --log="$RUST_LOG" --dev
[#9136]: Fix Configuration:set_max_upward_queue_size
Removes the invalid validation that prevented setting max_upward_queue_size
to values larger than MAX_UPWARD_MESSAGE_SIZE_BOUND
.
The queue is clearly allowed to be bigger than an individual message.
[#9357]: Fix dust balance handling in ETH transfers
Fixed a bug in the eth-decimals implementation where ETH transfers were failing due to incorrect receiver dust balance handling. The condition for minting a new currency unit when transferring dust was checking to_info.dust.saturating_add(dust) >= plank
which to_info.dust
has been added twice, could lead to unexpected minting behavior.
This fix ensures that ETH transfers work correctly, enabling proper operation of DeFi protocols like Uniswap on PolkaVM.
[#9463]: Minor Snowbridge test fixes
Improves the Snowbridge snowbridge-runtime-test-common
test method responsible to testing all Ethereum light client extrinsics, to run in 2 blocks instead of 1, so that the test does not fail because the block limit has been reached.
[#8108]: Fix reserve
and can_reserve
methods in pallet-balances
to properly handle reserved balances
Fixes a bug in pallet-balances
where the reserve
and can_reserve
methods were incorrectly
preventing new reserves when an account's free balance was lower than its frozen balance,
even if the usable balance was sufficient after accounting for the reserved balance.
[#8752]: transfer_assets benchmarking and weights for coretime chains
Introduces implementation of set_up_complex_asset_transfer()
to correctly benchmark weights for transfer_assets
extrinsics on Rococo Coretime and Westend Coretime. Introducing also test scenarios to cover common xcm teleport use cases
[#9285]: [revive] revm backend
Initial EVM support for pallet-revive via the REVM crate to create a dual-VM system that can execute both PolkaVM and EVM
- Added AllowEVMBytecode: Get to the config to enable/disable EVM call and instantiation
- The basic flow of uploading an EVM contract and running it should work
- instructions are copied and adapted from REVM they should be ignored in this PR and reviewed in follow-up PR
[#9024]: Add Secretary Program to Collectives Westend
Adds Secretary Program(i.e. pallet-ranked-collective & pallet-salary only).
Salary payments in USDT via Asset Hub and XCM integration for cross-chain payments.
[#9713]: Elastic-scaling-guide: Mention slot duration
Update the elastic scaling guide with guidelines regarding the handling of slot durations.
[#8781]: [pallet-revive] fix call-trace create calls
Fix call-traces for CREATE calls.
fixes paritytech/contract-issues#96
[#9335]: frame_system: Whitelist storage items and do not double kill!
This pull requests adds some storage values to the whitelisted storage item list, because they are written in every block. Also it stops double killing InherentsApplied
. It is killed in on_finalize
, so there is no need to do it again in on_initialize
.
[#9326]: [HRMP] Check messages order before enqueing them
Related to #8860
This PR adds a check in order to ensure that the collator has respected the proper order when sending the HRMP messages to the runtime.
[#9677]: Update elastic scaling documentation
Updated elastic scaling guide. Removes the guide for the MVP version.
[#9401]: Replace log
with tracing
on bp-runtime
This PR replaces log
with tracing
instrumentation on bp-runtime
by providing structured logging.
[#9308]: Replace log
with tracing
on pallet-bridge-messages
This PR replaces log
with tracing
instrumentation on pallet-bridge-messages
by providing structured logging.
[#9544]: Disable reserve_transfer_assets for DOT|KSM|WND|PAS
The reserve_transfer_assets extrinsic on pallet-xcm is also affected by the same issue as transfer_assets.
These extrinsics have been updated to return an error when dealing with DOT|KSM|WND|PAS, effectively disabling them.
We can't afford these extrinsics to be enabled after the Asset Hub Migration (AHM) and risk trapping assets due to chain misconfigurations.
All chains need to update and coordinate with their dapps to move to the alternatives, like transfer_assets_using_type_and_then
or execute
.
[#8789]: [pallet-revive] Add contract instantiated event
instantiate
and instantiate_with_code
emit a Instantiated
event.
[#9107]: Add block number and extrinsic index to PureCreated event
Enhances PureCreated event with current block number and extrinsic index.
Uses system BadContext error for extrinsic index retrieval.
[#9514]: Paras: Clean up AuthorizedCodeHash
when offboarding
This PR updates the Paras
pallet to clear entries in AuthorizedCodeHash
as part of the offboarding process.
[#8436]: Fix calling nominate on a validator that doesn’t exist silently succeeds
This PR fixes a bug where calling nominate on a validator that doesn’t exist silently succeeds.
It also updates all the tests that had an incorrect setup - they were simulating elections with unregistered validators.
[#9501]: [revive] revm move existing files
- Move exisiting files in pallet-revive to accomodate the upcoming EVM backend
- Add solc/resolc compilation feature for fixtures
[#9604]: Society pallet: Make fields of storage-persisted types public
Fields of types persisted in storage have been made public.
[#9384]: [AHM] Make stuff public and derive
Preparation for Asset hub migration by making fields public and doing some tweaks.
Also hide one silently truncating constructor from `ParaId``.
[#9112]: Fix seal_call benchmark
Fix seal_call benchmark, ensure that the call actually succeed
[#9539]: [XCMP] take_first_concatenated_xcm()
improvements
This PR:
- improves
take_first_concatenated_xcm()
avoiding the XCM re-encoding - makes the benchmarks for
take_first_concatenated_xcm()
more granular, accounting for the number of bytes of the message
[#9454]: [pallet-revive] Migrate blake2_128
from host function to pre-compile
Moves the unstable host function hash_blake2_128
to the System
pre-compile.
[#8903]: ParachainSystem: Do not emit the SelectCore
digest
This will be moved into an inherent digest.
[#9511]: EPMB/Signed: Make invulnerables non-eject-able
Follow-up to #8877 and audits: Make it such that invulnerable accounts cannot be ejected from the election signed queue altogether.
[#9002]: Remove SelectCore
and GetCoreSelectorApi
Downstream users need to remove the SelectCore
type from the parachain_system::Config
:
- type SelectCore = ...;
+
Also the GetCoreSelectorApi
got removed. If you had implemented it before in your runtime, you can remove it.
[#9057]: Align parameters for EventEmitter::emit_sent_event
Corrected markdown and indentation for the emit_sent_event
function parameters in the EventEmitter
trait documentation for better readability.
[#9381]: Replace log
with tracing
on pallet-bridge-relayers
This PR replaces log
with tracing
instrumentation on pallet-bridge-relayers
by providing structured logging.
[#8932]: pallet-balances: Do not create account in benchmarking
This particular benchmark is about benchmarking the account creation, so we should not create it before :)
Closes: #8927
[#9516]: Fix for promote_fast
benchmark
Fixed benchmark generation/compilation for promote_fast
MaxRank
change from u32
to u16
.
[#9166]: pallet-bags-list: Emit ScoreUpdated
event only if it has changed
follow-up to #8684, ensuring all blocks don't have x events when auto-rebag feature is enabled.
[#8732]: Add comprehensive tracing to XCM-related modules
This PR replaces log
with tracing
instrumentation on XCM-related modules to significantly improve debugging capabilities for XCM execution flows. The implementation provides structured logging throughout XCM components with consistent log targets, making it easier to diagnose execution failures, fee calculation errors, and routing issues with zero runtime impact.
[#9482]: [pallet-revive] expose exec::Key
This is a fix for the fact that exec::Key
is exposed from within pallet_revive::tracing::Tracing
interface, but not from the crate itself making custom tracers effectively unimplementable outside said crate.
In my case it's useful for implementing custom tracers for integration with foundry
[#9747]: staking-async: handle uninitialized state in try-state checks
- Add early return in do_try_state when pallet is uninitialized
- Add test for empty state validation
[#8787]: Westend governance authorize_upgrade integration tests
Integration tests covering authorize_upgrade
with whitelisting via Collectives for Westend network
[#8694]: Fix pallet_migrations benchmark when FailedMigrationHandler emits events
When FailedMigrationHandler emits events, the UpgradeFailed
event is not the last one, so assert_last_event
fails. Fixed by checking that the UpgradeFailed
event is emitted, even if it is not the last one.
[#9126]: XCM precompile - don't support older XCM versions (3 and 4)
The latest XCM version is 5.
A lot of parachains are still running V3 or V4 which is why we haven't removed them, but the XCM precompile is new and should only have to deal with versions 5 and onwards.
No need to keep dragging 3 and 4 in contracts.
This is the default behavior, there's no need to configure anything in pallet-xcm.
[#9497]: Society pallet supports non-consecutive block provider
Society pallet correctly handles situations where on_initialize is invoked with block numbers that:
- increase but are not strictly consecutive (e.g., jump from 5 → 10), or
- are repeated (e.g., multiple blocks are built at the same Relay Chain parent block, all reporting the same BlockNumberProvider value).
This situation may occur when the BlockNumberProvider is not local - for example, on a parachain using the Relay Chain block number provider.
[#9796]: pallet-assets: extract precompiles to its own pallet
Assets pallet includes pallet-revive precompiles and subsequently pull a lot of EVM related dependencies by default. This change
extracts the precompiles into a new pallet pallet-assets-precompiles
.
[#9225]: Add supported_version to pallet-xcm genesis config
Adds a supported_version
field to the pallet-xcm genesis config, which allows specifying versioned locations at genesis.
[#9378]: Replace log
with tracing
on pallet-bridge-beefy
This PR replaces log
with tracing
instrumentation on pallet-bridge-beefy
by providing structured logging.
[#9176]: Allow locking to bump consumer without limits
Locking is a system-level operation, and can only increment the consumer limit at most once. Therefore, it should use inc_consumer_without_limits
. This behavior is optional, and is only used in the call path of LockableCurrency
. Reserves, Holds and Freezes (and other operations like transfer etc.) have the ability to return DispatchResult
and don't need this bypass. This is demonstrated in the unit tests added.
[#4300]: XCM NFT types that use Granular NFT traits
This PR provides new XCM types and tools for building NFT Asset Transactors.
The new types use general and granular NFT traits from #5620.
The new types use a more general approach, making integration into any chain with various NFT implementations easier.
Also, the new types provide greater flexibility for supporting derivative NFTs,
allowing several possible approaches depending on the given chain's team's goals or restrictions (see the pallet-derivatives crate docs and mock docs).
[#8922]: paras pallet: don't assign core if para_kind is ParaThread
Only force assign core to genesis para if declared as parachain.
For parathread, proceed only with registering the para.
[#9659]: staking-async: prevent manual application of cancelled slashes
Fix security vulnerability where the permissionless apply_slash
extrinsic could be used to manually apply slashes that governance had cancelled via cancel_deferred_slash
.
[#9799]: Added pallet-root-offences to Westend relay-chain runtime
Needed to let us test a manual slash on Westend relay-chain.
[#8684]: Add optional auto-rebag within on-idle
Introduced an optional on_idle
hook for automatic account rebagging, improving the incremental correction of account positions within the bags-list during block execution's idle phase. This feature leverages new storage and configurable constants, alongside enhanced logging and internal helpers. Setting MaxAutoRebagPerBlock
to 0
(e.g., type MaxAutoRebagPerBlock = ();
) disables this functionality, preserving pre-upgrade pallet behavior. make sure that after setting value of MaxAutoRebagPerBlock
you regenerate weight for your runtime.
[#7953]: Add deposit for setting session keys
Setting session keys might put some funds on hold in the future, depending on how runtimes use this feature.
Requires pallet_session::Config
to specify:
type Currency
, assigned to an instance ofpallet_balances
.type KeyDeposit
, the amount of deposit. Set to()
to assert no deposit amount is needed.
[#9409]: Replace log
with tracing
on xcm-emulator
This PR replaces log
with tracing
instrumentation on xcm-emulator
by providing structured logging.
[#8881]: [pallet-revive] only record diff if value changed
Only record storage change in diff mode if the value differ from the initial one.
Previous implementation would report a diff for example when the old value was written again.
Updated tests in paritytech/evm-test-suite#96
[#8938]: Make NoOpPoll
generic over Moment
This PR enhances the flexibility of the NoOpPoll
implementation by introducing a generic Moment
parameter. This change enables support for diverse clock configurations across different runtimes, allowing NoOpPoll
to work seamlessly with various block number implementations (e.g., u32
, u64
, or custom block number types).
[#9101]: [revive] eth-decimals
On Ethereum, 1 ETH is represented as 10^18 wei (wei being the smallest unit).
On Polkadot 1 DOT is defined as 10^10 plancks. It means that any value smaller than 10^8 wei can not be expressed with the native balance. Any contract that attempts to use such a value currently reverts with a DecimalPrecisionLoss error.
In theory, RPC can define a decimal representation different from Ethereum mainnet (10^18). In practice tools (frontend libraries, wallets, and compilers) ignore it and expect 18 decimals.
The current behaviour breaks eth compatibility and needs to be updated. See issue #109 for more details.
Fix paritytech/contract-issues#109
weights compare
[#8851]: Add address revive runtime API
This gives an easy way for substrate user to convert an Account ID into the mapped H160 address
[#9294]: Replace log
with tracing
on pallet-bridge-grandpa
This PR replaces log
with tracing
instrumentation on pallet-bridge-grandpa
by providing structured logging.
[#9186]: pallet-staking-async: Use saturating addition for era reward points
This PR replaces regular addition with saturating addition when accumulating era reward points in pallet-staking-async to prevent potential overflow.
Changelog for Node Operator
ℹ️ These changes are relevant to: Those who don't write any code and only run code.
[#9272]: track authorities from aura digests
Closes #9064.
Tracks AURA authorities in a ForkTree
. The fork tree is updated whenever there is an authorities change log in the digest. If the fork tree doesn't contain the authorities, they are fetched for the runtime (should only happen at startup, or if something weird is going on with forks maybe).
[#9424]: feat(warp sync): store headers and justifications during warp sync
Store justifications and headers for authority set changes blocks during warp sync to be able to respond to warp sync requests from peers even without gap sync. In a follow-up PR, gap sync will be disabled if block pruning is enabled. This PR ensures that warp sync still works across the network, even on pruned nodes.
[#9446]: Cumulus: Remove --relay-chain-light-client
This PR removes the experimental flag --relay-chain-light-client from cumulus and as a consequence, smoldot and smoldot-light as workspace dependencies.
Closes #9013
[#9047]: Add extra information to the harmless error logs during validate_transaction
Adds additional information to the harmless error logs "Bad input data provided" during validate_transaction
.
[#8651]: polkadot-omni-node: add GetParachainInfo
runtime api
This PR deprecates the para_id
field of parachain chain specifications.
- Both
polkadot-omni-node
&polkadot-parachain
are still supporting thepara_id
field passed via chain specifications, whileparachain-template-node
supports only runtime API based provided parachain id. - This PR also changes
minimal-template-runtime
to not run anymore with Omni Node. chain-spec-builder
still supports generating chain specifications withpara_id
field.- Starting with
stable2509
polkadot-parachain
/parachain-template-node
will generate chain specs that are not compatible
with prior node versions becausepara_id
field will not be added anymore to the resulting chain specs.
Starting with stable2509
the para_id
field of chain specification is not required anymore, and runtime developers will be able
to specify it to nodes by implementing the runtime API cumulus_primitives_core::GetParachainInfo
.
Starting with stable2512
the para_id
field of chain specification will not be supported anymore by node versions and
chain-spec-builder
will drop its support, so it is mandatory for runtimes to implement the GetParachainInfo
trait
to still be compatible with the nodes.
[#9015]: consensus/grandpa: Fix high number of peer disconnects with invalid justification
A grandpa race-casse has been identified in the versi-net stack around authority set changes, which leads to the following:
- T0 / Node A: Completes round (15)
- T1 / Node A: Applies new authority set change and increments the SetID (from 0 to 1)
- T2 / Node B: Sends Precommit for round (15) with SetID (0) -- previous set ID
- T3 / Node B: Applies new authority set change and increments the SetID (1)
In this scenario, Node B is not aware at the moment of sending justifications that the Set ID has changed.
The downstream effect is that Node A will not be able to verify the signature of justifications, since a different SetID is taken into account. This will cascade through the sync engine, where the Node B is wrongfully banned and disconnected.
This PR aims to fix the edge-case by making the grandpa resilient to verifying prior setIDs for signatures.
When the signature of the grandpa justification fails to decode, the prior SetID is also verified. If the prior SetID produces a valid signature, then the outdated justification error is propagated through the code (ie SignatureResult::OutdatedSet
).
The sync engine will handle the outdated justifications as invalid, but without banning the peer. This leads to increased stability of the network during authority changes, which caused frequent disconnects to versi-net in the past.
Review Notes
- Main changes that verify prior SetId on failures are placed in check_message_signature_with_buffer
- Sync engine no longer disconnects outdated justifications in process_service_command
Testing Done
- Deployed the PR to versi-net with 40 validators
- Prior we have noticed 10/40 validators disconnecting every 15-20 minutes, leading to instability
- Over past 24h the issue has been mitigated: https://grafana.teleport.parity.io/goto/FPNWlmsHR?orgId=1
- Note: bootnodes 0 and 1 are currently running outdated versions that do not incorporate this SetID verification improvement
Part of: #8872
[#9147]: babe: keep stateless verification in Verifier
, move everything else to the import queue
Only do stateless verification without runtime calls in the BabeVerifier
, do all other verification in the import queue.
[#8076]: Enable statement store with new CLI arg in polkadot-omni-node and polkadot-parachain
In polkadot-omni-node-lib
, a new cli arg --enable-statement-store
is introduced, if set to true then the statement store is enabled in the node.
The statement store is an off-chain data-store for signed statements accessible via RPC and offchain worker.
It uses the runtime api to get the allowance associated to an account.
This takes effect in polkadot-omni-node
and polkadot-parachain
and any node depending on polkadot-omni-node-lib
.
In cumulus-client-service
the BuildNetworkParams
now takes the metrics configuration explicitly, you can use the same configuration as before using the network backend used when calling build_network
:
let metrics = NetworkBackend::register_notification_metrics(
parachain_config.prometheus_config.as_ref().map(|config| &config.registry),
);
[#9280]: fix: skip verifying imported blocks
Closes #9277. Still WIP testing
[#7985]: Collect system infomation on FreeBSD OS
Adds support for collecting system information on FreeBSD. This allows Decentralized Nodes operators to be compliant with the Telemetry rule without maintaining patches.
Changelog for Runtime User
ℹ️ These changes are relevant to: Anyone using the runtime. This can be a token holder or a dev writing a front end for a chain.
[#8987]: EPMB/unsigned: fixed multi-page winner computation
Change the calculation of MaxWinnersPerPage
in FullSupportsOfMiner
to Pages * MaxWinnersPerPage
(instead of the overall maximum number of winners across pages)
to prevent the computed solution from having a low overall total of winners, which could result in a WrongWinnerCount
error.
[#9606]: Expose account/contract revive types to use externally
Exposes revive types to use in foundry-polkadot project.
[#9125]: [Xcm Precompile] Remove return value
This PR removes any return value from xcm send and execute. Additionally it improves upon the documentation of the interface by reorganising where comments are placed.
[#7997]: [AHM] The Asset Hub Migration on Westend
Post AHM changes for Westend Relay and Asset Hub.
[#9632]: staking-async: implement lazy era pruning extrinsic
Move era pruning from automatic unbounded deletions to a permissionless lazy pruning system.
The new system processes era pruning across multiple blocks using a state machine pattern, ensuring storage operations remain bounded and preventing PoV size exhaustion.
[#8925]: Multisig::as_multi_threshold_1: Send MultisigExecuted
event
So the behavior is the same as as_multi
when it comes to sending an event.
Closes: #8924
[#4081]: [pallet-broker] Force-unpool provisionally pooled regions before redispatching them
This PR force removes regions from the pool before allowing them to be redispatched (through partition
/interlace
/assign
) for regions pooled with Provisional
finality. To claim any revenue from before this point, claim_revenue
should be called before
partitioning/interleaving/reassigning as it cannot be claimed afterwards.
[#8693]: Add XCM Precompile to pallet-xcm
This PR allows smart contract developers to call multiple XCM APIs from smart contracts/Ethereum tooling.
[#9136]: Fix Configuration:set_max_upward_queue_size
The set_max_upward_queue_size
function now correctly allows setting the maximum upward queue size to values larger than the maximum individual message size.
[#8108]: Fix reserve
and can_reserve
methods in pallet-balances
to properly handle reserved balances
Fixes a bug that was causing unexpected LiquidityRestrictions
errors when attempting to reserve funds.
[#9187]: Staking Async: Improve slash cancellation to handle multiple slash fractions and pages
This PR fixes an issue where governance could not effectively cancel deferred slashes when subsequent offence reports increased the slash fraction. The solution introduces a new CancelledSlashes
storage item that tracks cancelled slashes by era and validator with their maximum slash fractions to cancel.
Key changes:
- Added
CancelledSlashes
storage map to track cancelled slashes by era - Updated
cancel_deferred_slash
to acceptVec<(AccountId, Perbill)>
allowing governance to specify the slash fraction to cancel for each validator - Modified slash application logic to check
CancelledSlashes
before applying any slash - Automatic cleanup of
CancelledSlashes
after all slashes for an era are processed
This ensures governance can cancel slashes even when the slash fraction changes due to additional offence reports,
addressing a critical limitation in the previous implementation.
[#9544]: Disable reserve_transfer_assets for DOT|KSM|WND|PAS
The reserve_transfer_assets extrinsic on pallet-xcm is also affected by the same issue as transfer_assets.
These extrinsics have been updated to return an error when dealing with DOT|KSM|WND|PAS, effectively disabling them.
We can't afford these extrinsics to be enabled after the Asset Hub Migration (AHM) and risk trapping assets due
to chain misconfigurations.
All apps should switch to transfer_assets_using_type_and_then
or execute
.
[#9023]: [XCM Precompile] Rename functions and improve docs in the Solidity interface
This PR changes the function names on the XCM Precompile from xcmExecute
and xcmSend
to execute
and send
, respectively. This is a breaking change because it modifies the ABI-encoded function selectors, which are calculated using bytes4(keccak256(FUNCTION_SIGNATURE))
.
bytes4(keccak256("xcmSend(bytes,bytes)"))
-> 0xc0addb55
is going to be now
bytes4(keccak256("send(bytes,bytes)"))
-> 0x7f0a3bf9
bytes4(keccak256("xcmExecute(bytes,(uint64,uint64)))"))
=> 0x377df829
is going to be now
bytes4(keccak256("execute(bytes,(uint64,uint64)))"))
=> 0xd3b7e04d
It also adds new documentation to the precompile, directing developers to the official Polkadot XCM documentation. Additionally, it explicitly sets return values for both functions to clarify that the return value matches what is returned by pallet_xcm::send()
and pallet_xcm::execute()
.
[#9126]: XCM precompile - don't support older XCM versions (3 and 4)
The XCM precompile will only support XCM from version 5 (current) onwards.
Versions 3 and 4 won't be supported.
[#7953]: Add deposit for setting session keys
Setting session keys might put some funds on hold in the future, depending on how runtimes use this feature.
Requires pallet_session::Config
to specify:
type Currency
, assigned to an instance ofpallet_balances
.type KeyDeposit
, the amount of deposit. Set to()
to assert no deposit amount is needed.
Rust compiler versions
This release was built and tested against the following versions of rustc
.
Other versions may work.
- Rust Stable:
1.88.0
Runtimes
The information about the runtimes included in this release can be found below.
The runtimes have been built using srtool v0.18.3 and rustc 1.88.0 (6b00bc388 2025-06-23)
.
Westend
🏋️ Runtime Size: 2.37 MB (2489616 bytes)
🔥 Core Version: westend-1020001 (parity-westend-0.tx27.au2)
🗜 Compressed: Yes: 75.11%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0xdffece2940ea27d72d192b817f63db65d79806a53ca759976056b001eb6f090a
🗳️ authorizeUpgrade hash: 0x88292fcc772fd6fe18813b22421c2e72334f5aa511292725a27f25401d5a920e
🗳️ Blake2-256 hash: 0x2e3ec4cf2d056a808288ba8b404f469eb92eedb9161b110da7e7f60f229b126b
📦 IPFS: QmSJxZvh3uNui851CZuT9eB7u1EPevJWm4UbFumNYQEpAS
Westend Assethub
🏋️ Runtime Size: 2.96 MB (3100030 bytes)
🔥 Core Version: westmint-1020001 (westmint-0.tx16.au1)
🗜 Compressed: Yes: 77.09%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0x7107f512065bdbeb9a7c931964571804ad8a750ed03d5bc68b85989aa1ecebbe
🗳️ authorizeUpgrade hash: 0xf3a87e069a5882dc3a2075fcb21348b128c0e5ffeefca1d72db442d10ad703ab
🗳️ Blake2-256 hash: 0x303025e38718fa40ab1467fee0d582ab64f2e1fadff9ca8ba3df38e71705d904
📦 IPFS: QmcczdoT2XfrE8cq5dWs6H6LHyP61o7EA4F256vHdFn6KK
Westend Bridgehub
🏋️ Runtime Size: 1.76 MB (1848872 bytes)
🔥 Core Version: bridge-hub-westend-1020001 (bridge-hub-westend-0.tx6.au1)
🗜 Compressed: Yes: 74.76%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0x12835bcba6fd43b129dcb654a0d4371f5c9bfcb1ca656240f346b5963487e6af
🗳️ authorizeUpgrade hash: 0x3c39b2c83e9e6e04eed2ce37e1dc1ed948b8ac7f61eed82c354ba7b64e1968fb
🗳️ Blake2-256 hash: 0xdc9fdc0c25d17929903e4048d21501daddce8ed21bf0823a70bfa4be7a524155
📦 IPFS: QmdoKdmo2rbjNehB7gNiidaYg3fSw3bCexjCJbrR8T75uS
Westend Collectives
🏋️ Runtime Size: 1.60 MB (1674329 bytes)
🔥 Core Version: collectives-westend-1020001 (collectives-westend-0.tx6.au1)
🗜 Compressed: Yes: 76.15%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0x66e999ffd42fd5cda595391c95ca7aa44f74acb5cf35073875dbe552deac745c
🗳️ authorizeUpgrade hash: 0x76d2a9af6723a44a80aa4a1ebd0f79923159450964362f51d035c2bb7d444fc4
🗳️ Blake2-256 hash: 0x43a244c3253ce41e55beb0b2b3696b7243291ba37b4d040a38cf23f9e1704249
📦 IPFS: QmZfbQW8XY9GVhzicruJjad1otVqqBiPEZ6rWaifKSFBLw
Westend Coretime
🏋️ Runtime Size: 1.42 MB (1487427 bytes)
🔥 Core Version: coretime-westend-1020001 (coretime-westend-0.tx2.au1)
🗜 Compressed: Yes: 75.24%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0x3821b20d256c74deddf28bb3b50418b425b314d35f1731645a45b3a6b0fc0a63
🗳️ authorizeUpgrade hash: 0xf128a29af2c87678c2a7a5415a82257bf84eec9764b52edc2724c359f8d1088f
🗳️ Blake2-256 hash: 0xd63f1c0253e0beac1823969a8f39a69878c5a9b128f2b8cdcdd0376738872d8a
📦 IPFS: QmXokS2pMhMUK6P5n1AFc5cs48g7zKJGFnMm1shfWZw3Q7
Westend Glutton
🏋️ Runtime Size: 659.40 kB (675230 bytes)
🔥 Core Version: glutton-westend-1020001 (glutton-westend-0.tx1.au1)
🗜 Compressed: Yes: 73.28%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0x276c6e98358c306c6cc5109209ddedd4ce785c7821086193918b4f495c363eb4
🗳️ authorizeUpgrade hash: 0xc7f9a55c8f8eb29078d4caae7848d8535c4141f2c369bbcf24a030dc2267b100
🗳️ Blake2-256 hash: 0x00d0bc8653b4d697a84bcbcc30f08072e045c270621b2c15be6b9f7ac4516b76
📦 IPFS: QmYdbS2seDzjBxGFnzyLCxCaAnLzSXnk1d56nbDRKsZnFv
Westend People
🏋️ Runtime Size: 1.41 MB (1477173 bytes)
🔥 Core Version: people-westend-1020001 (people-westend-0.tx2.au1)
🗜 Compressed: Yes: 75.21%
🎁 Metadata version: V14
🗳️ system.setCode hash: 0xb3008f372827483b07df3302a2c3ece0fd851174fdce73300587c992120ca943
🗳️ authorizeUpgrade hash: 0x3b6d42fa97dd0f1cc0e3cc8bc20c504d899f8367a245fadc6b64c074b9e80a6a
🗳️ Blake2-256 hash: 0xfb32525a9e454d3da1ee9c53dd32b47e72fc319a23b36daee617439d87ae82c8
📦 IPFS: Qmai1YJdFFvySSD3eprwdrVUf1tHkmzT4tCBL6huTddVs4
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:latest
or
docker pull parity/polkadot-parachain:latest