From dbff87c268f18bdd8ef01a09f61ce910f2a5ab33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <git@kchr.de> Date: Mon, 8 Jan 2024 12:45:17 +0000 Subject: [PATCH] Return latest known relay chain block number in `on_initialize` etc (#2862) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This changes `RelaychainDataProvider` to return the latest known relay chain block number in `on_initialize` et all, aka when the `validation_data` wasn't yet set by the inherent. --------- Co-authored-by: Dónal Murray <donal.murray@parity.io> --- cumulus/pallets/parachain-system/src/lib.rs | 53 +++++++-------------- prdoc/pr_2862.prdoc | 11 +++++ 2 files changed, 29 insertions(+), 35 deletions(-) create mode 100644 prdoc/pr_2862.prdoc diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index ba8aff0e369..5a0fa57fb17 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -1683,20 +1683,33 @@ pub trait RelaychainStateProvider { } /// Implements [`BlockNumberProvider`] that returns relay chain block number fetched from validation -/// data. When validation data is not available (e.g. within on_initialize), 0 will be returned. +/// data. +/// +/// When validation data is not available (e.g. within `on_initialize`), it will fallback to use +/// [`Pallet::last_relay_block_number()`]. /// /// **NOTE**: This has been deprecated, please use [`RelaychainDataProvider`] #[deprecated = "Use `RelaychainDataProvider` instead"] -pub struct RelaychainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>); +pub type RelaychainBlockNumberProvider<T> = RelaychainDataProvider<T>; -#[allow(deprecated)] -impl<T: Config> BlockNumberProvider for RelaychainBlockNumberProvider<T> { +/// Implements [`BlockNumberProvider`] and [`RelaychainStateProvider`] that returns relevant relay +/// data fetched from validation data. +/// +/// NOTE: When validation data is not available (e.g. within `on_initialize`): +/// +/// - [`current_relay_chain_state`](Self::current_relay_chain_state): Will return the default value +/// of [`RelayChainState`]. +/// - [`current_block_number`](Self::current_block_number): Will return +/// [`Pallet::last_relay_block_number()`]. +pub struct RelaychainDataProvider<T>(sp_std::marker::PhantomData<T>); + +impl<T: Config> BlockNumberProvider for RelaychainDataProvider<T> { type BlockNumber = relay_chain::BlockNumber; fn current_block_number() -> relay_chain::BlockNumber { Pallet::<T>::validation_data() .map(|d| d.relay_parent_number) - .unwrap_or_default() + .unwrap_or_else(|| Pallet::<T>::last_relay_block_number()) } #[cfg(feature = "runtime-benchmarks")] @@ -1739,33 +1752,3 @@ impl<T: Config> RelaychainStateProvider for RelaychainDataProvider<T> { ValidationData::<T>::put(validation_data) } } - -/// Implements [`BlockNumberProvider`] and [`RelaychainStateProvider`] that returns relevant relay -/// data fetched from validation data. -/// NOTE: When validation data is not available (e.g. within on_initialize), default values will be -/// returned. -pub struct RelaychainDataProvider<T>(sp_std::marker::PhantomData<T>); - -impl<T: Config> BlockNumberProvider for RelaychainDataProvider<T> { - type BlockNumber = relay_chain::BlockNumber; - - fn current_block_number() -> relay_chain::BlockNumber { - Pallet::<T>::validation_data() - .map(|d| d.relay_parent_number) - .unwrap_or_default() - } - - #[cfg(feature = "runtime-benchmarks")] - fn set_block_number(block: Self::BlockNumber) { - let mut validation_data = Pallet::<T>::validation_data().unwrap_or_else(|| - // PersistedValidationData does not impl default in non-std - PersistedValidationData { - parent_head: vec![].into(), - relay_parent_number: Default::default(), - max_pov_size: Default::default(), - relay_parent_storage_root: Default::default(), - }); - validation_data.relay_parent_number = block; - ValidationData::<T>::put(validation_data) - } -} diff --git a/prdoc/pr_2862.prdoc b/prdoc/pr_2862.prdoc new file mode 100644 index 00000000000..fa136b5d98a --- /dev/null +++ b/prdoc/pr_2862.prdoc @@ -0,0 +1,11 @@ +title: Return latest known relay chain block number in `on_initialize` etc. + +doc: + - audience: Runtime Dev + description: | + `RelaychainDataProvider` and `RelaychainBlockNumberProvider` will now return the latest known + relay chain block number in `on_initialize`, aka when `validation_data` wasn't yet set by + the inherent. + +crates: + - name: "cumulus-pallet-parachain-system" -- GitLab