diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index 2338192da1f1071df98bba14efa8b57768b60296..2eb242e73871d86939d6067cf75d47ac7b7a6d32 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -310,7 +310,7 @@ pub mod pallet { let relay_state_proof = RelayChainStateProof::new( T::SelfParaId::get(), vfp.relay_parent_storage_root, - relay_chain_state, + relay_chain_state.clone(), ) .expect("Invalid relay chain state proof"); @@ -352,6 +352,7 @@ pub mod pallet { .expect("Invalid messaging state in relay chain state proof"); <ValidationData<T>>::put(&vfp); + <RelayStateProof<T>>::put(relay_chain_state); <RelevantMessagingState<T>>::put(relevant_messaging_state.clone()); <HostConfiguration<T>>::put(host_config); @@ -484,6 +485,16 @@ pub mod pallet { pub(super) type UpgradeRestrictionSignal<T: Config> = StorageValue<_, Option<relay_chain::v2::UpgradeRestriction>, ValueQuery>; + /// The state proof for the last relay parent block. + /// + /// This field is meant to be updated each block with the validation data inherent. Therefore, + /// before processing of the inherent, e.g. in `on_initialize` this data may be stale. + /// + /// This data is also absent from the genesis. + #[pallet::storage] + #[pallet::getter(fn relay_state_proof)] + pub(super) type RelayStateProof<T: Config> = StorageValue<_, sp_trie::StorageProof>; + /// The snapshot of some state related to messaging relevant to the current parachain as per /// the relay parent. /// diff --git a/cumulus/primitives/parachain-inherent/src/client_side.rs b/cumulus/primitives/parachain-inherent/src/client_side.rs index 99c27bc8241f0f1bf4a2c56ccd359f642b517c01..000094f07094ed62d6c563644a30397a15caf32b 100644 --- a/cumulus/primitives/parachain-inherent/src/client_side.rs +++ b/cumulus/primitives/parachain-inherent/src/client_side.rs @@ -93,6 +93,9 @@ async fn collect_relay_storage_proof( .unwrap_or_default(); let mut relevant_keys = Vec::new(); + relevant_keys.push(relay_well_known_keys::CURRENT_BLOCK_RANDOMNESS.to_vec()); + relevant_keys.push(relay_well_known_keys::ONE_EPOCH_AGO_RANDOMNESS.to_vec()); + relevant_keys.push(relay_well_known_keys::TWO_EPOCHS_AGO_RANDOMNESS.to_vec()); relevant_keys.push(relay_well_known_keys::CURRENT_SLOT.to_vec()); relevant_keys.push(relay_well_known_keys::ACTIVE_CONFIG.to_vec()); relevant_keys.push(relay_well_known_keys::dmq_mqc_head(para_id));