-
Notifications
You must be signed in to change notification settings - Fork 782
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Parachains: Use relay chain slot for velocity measurement #6825
Conversation
bot fmt |
@skunert https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7892036 was started for your command Comment |
@skunert Command |
bot fmt |
@skunert https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/7898854 was started for your command Comment |
@skunert Command |
/cmd prdoc --bump patch --audience runtime_dev,node_dev |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM overall!
let Ok(Some(api_version)) = | ||
runtime_api.api_version::<dyn AuraUnincludedSegmentApi<Block>>(parent_hash) | ||
else { | ||
return Some(SlotClaim::unchecked::<P>(author_pub, para_slot, timestamp)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
shouldn't we return None
if we couldn't get the api version?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, if we have None
, it means the api doesn't exist and we should return an error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I changed this to be backward compatible with the previous behaviour. If we are building on top of the included block, the previous implementation would return Some
. I don't think it is likely that someone runs this with a runtime without AuraUnincludedSegmentApi
, but technically its possible.
@@ -70,20 +74,7 @@ pub mod pallet { | |||
// Fetch the authorities once to get them into the storage proof of the PoV. | |||
Authorities::<T>::get(); | |||
|
|||
let new_slot = pallet_aura::CurrentSlot::<T>::get(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it feels a bit weird that the pallet now has a RelaySlotInfo
storage item that is never updated by the pallet (but only in an optional ConsensusHook
, which parachains could in theory overwrite). Not a big deal though
let Ok(Some(api_version)) = | ||
runtime_api.api_version::<dyn AuraUnincludedSegmentApi<Block>>(parent_hash) | ||
else { | ||
return Some(SlotClaim::unchecked::<P>(author_pub, para_slot, timestamp)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, if we have None
, it means the api doesn't exist and we should return an error.
bot fmt |
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
bot fmt |
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
None => (relay_chain_slot, 0), | ||
}; | ||
|
||
// We need to allow one additional block to be built to fill the unincluded segment. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't really get this comment.
Co-authored-by: Bastian Köcher <git@kchr.de>
All GitHub workflows were cancelled due to failure one of the required jobs. |
* master: (33 commits) Implement `pallet-asset-rewards` (#3926) [pallet-revive] Add host function `to_account_id` (#7091) [pallet-revive] Remove revive events (#7164) [pallet-revive] Remove debug buffer (#7163) litep2p: Provide partial results to speedup GetRecord queries (#7099) [pallet-revive] Bump asset-hub westend spec version (#7176) Remove 0 as a special case in gas/storage meters (#6890) [pallet-revive] Fix `caller_is_root` return value (#7086) req-resp/litep2p: Reject inbound requests from banned peers (#7158) Add "run to block" tools (#7109) Fix reversed error message in DispatchInfo (#7170) approval-voting: Make importing of duplicate assignment idempotent (#6971) Parachains: Use relay chain slot for velocity measurement (#6825) PRDOC: Document `validate: false` (#7117) xcm: convert properly assets in xcmpayment apis (#7134) CI: Only format umbrella crate during umbrella check (#7139) approval-voting: Fix sending of assignments after restart (#6973) Retry approval on availability failure if the check is still needed (#6807) [pallet-revive-eth-rpc] persist eth transaction hash (#6836) litep2p: Sufix litep2p to the identify agent version for visibility (#7133) ...
…d block (#7205) Follow-up to #6825, which introduced this bug. We use the `can_build_upon` method to ask the runtime if it is fine to build another block. The runtime checks this based on the [`ConsensusHook`](https://github.com/paritytech/polkadot-sdk/blob/c1b7c3025aa4423d4cf3e57309b60fb7602c2db6/cumulus/pallets/aura-ext/src/consensus_hook.rs#L110-L110) implementation, the most popular one being the `FixedConsensusHook`. In #6825 I removed a check that would always allow us to build when we are building on an included block. Turns out this check is still required when: 1. The [`UnincludedSegment` ](https://github.com/paritytech/polkadot-sdk/blob/c1b7c3025aa4423d4cf3e57309b60fb7602c2db6/cumulus/pallets/parachain-system/src/lib.rs#L758-L758) storage item in pallet-parachain-system is equal or larger than the unincluded segment. 2. We are calling the `can_build_upon` runtime API where the included block has progressed offchain to the current parent block (so last entry in the `UnincludedSegment` storage item). In this scenario the last entry in `UnincludedSegment` does not have a hash assigned yet (because it was not available in `on_finalize` of the previous block). So the unincluded segment will be reported at its maximum length which will forbid building another block. Ideally we would have a more elegant solution than to rely on the node-side here. But for now the check is reintroduced and a test is added to not break it again by accident. --------- Co-authored-by: command-bot <> Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com>
closes #3967
Changes
We now use relay chain slots to measure velocity on chain. Previously we were storing the current parachain slot. Then in
on_state_proof
of theConsensusHook
we were checking how many blocks were athored in the current parachain slot. This works well when the parachain slot time and relay chain slot time is the same. With elastic scaling, we can have parachain slot times lower than that of the relay chain. In these cases we want to measure velocity in relation to the relay chain. This PR adjusts that.Migration
This PR includes a migration. Storage item
SlotInfo
of palletaura-ext
is renamed toRelaySlotInfo
to better reflect its new content. A migration has been added that just kills the old storage item.RelaySlotInfo
will beNone
initially but its value will be adjusted after one new relay chain slot arrives.