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