mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-20 22:11:01 +00:00
introduce RelaychainStateProvider to parachain-system (#2268)
* introduce RelaychainStateProvider to parachain-system * bring back RelaychainBlockNumberProvider, adds some docs and derives * allow deprecated * Apply suggestions from code review Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de> * deprecation message --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de>
This commit is contained in:
@@ -42,6 +42,7 @@ use frame_support::{
|
|||||||
storage,
|
storage,
|
||||||
traits::Get,
|
traits::Get,
|
||||||
weights::Weight,
|
weights::Weight,
|
||||||
|
RuntimeDebug,
|
||||||
};
|
};
|
||||||
use frame_system::{ensure_none, ensure_root};
|
use frame_system::{ensure_none, ensure_root};
|
||||||
use polkadot_parachain::primitives::RelayChainBlockNumber;
|
use polkadot_parachain::primitives::RelayChainBlockNumber;
|
||||||
@@ -1126,11 +1127,33 @@ pub trait OnSystemEvent {
|
|||||||
fn on_validation_code_applied();
|
fn on_validation_code_applied();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Implements [`BlockNumberProvider`] that returns relay chain block number fetched from
|
/// Holds the most recent relay-parent state root and block number of the current parachain block.
|
||||||
/// validation data.
|
#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo, Default, RuntimeDebug)]
|
||||||
/// NTOE: When validation data is not available (e.g. within on_initialize), 0 will be returned.
|
pub struct RelayChainState {
|
||||||
|
/// Current relay chain height.
|
||||||
|
pub number: relay_chain::BlockNumber,
|
||||||
|
/// State root for current relay chain height.
|
||||||
|
pub state_root: relay_chain::Hash,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This exposes the [`RelayChainState`] to other runtime modules.
|
||||||
|
///
|
||||||
|
/// Enables parachains to read relay chain state via state proofs.
|
||||||
|
pub trait RelaychainStateProvider {
|
||||||
|
/// May be called by any runtime module to obtain the current state of the relay chain.
|
||||||
|
///
|
||||||
|
/// **NOTE**: This is not guaranteed to return monotonically increasing relay parents.
|
||||||
|
fn current_relay_chain_state() -> RelayChainState;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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.
|
||||||
|
///
|
||||||
|
/// **NOTE**: This has been deprecated, please use [`RelaychainDataProvider`]
|
||||||
|
#[deprecated = "Use `RelaychainDataProvider` instead"]
|
||||||
pub struct RelaychainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);
|
pub struct RelaychainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
impl<T: Config> BlockNumberProvider for RelaychainBlockNumberProvider<T> {
|
impl<T: Config> BlockNumberProvider for RelaychainBlockNumberProvider<T> {
|
||||||
type BlockNumber = relay_chain::BlockNumber;
|
type BlockNumber = relay_chain::BlockNumber;
|
||||||
|
|
||||||
@@ -1139,6 +1162,47 @@ impl<T: Config> BlockNumberProvider for RelaychainBlockNumberProvider<T> {
|
|||||||
.map(|d| d.relay_parent_number)
|
.map(|d| d.relay_parent_number)
|
||||||
.unwrap_or_default()
|
.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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Config> RelaychainStateProvider for RelaychainDataProvider<T> {
|
||||||
|
fn current_relay_chain_state() -> RelayChainState {
|
||||||
|
Pallet::<T>::validation_data()
|
||||||
|
.map(|d| RelayChainState {
|
||||||
|
number: d.relay_parent_number,
|
||||||
|
state_root: d.relay_parent_storage_root,
|
||||||
|
})
|
||||||
|
.unwrap_or_default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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")]
|
#[cfg(feature = "runtime-benchmarks")]
|
||||||
fn set_block_number(block: Self::BlockNumber) {
|
fn set_block_number(block: Self::BlockNumber) {
|
||||||
let mut validation_data = Pallet::<T>::validation_data().unwrap_or_else(||
|
let mut validation_data = Pallet::<T>::validation_data().unwrap_or_else(||
|
||||||
|
|||||||
Reference in New Issue
Block a user