From d5b802ce28d4a00375e9b043ca7e8690c59262a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <bkchr@users.noreply.github.com> Date: Fri, 28 May 2021 23:35:26 +0200 Subject: [PATCH] Check that we have set the validation data inherent (#451) --- cumulus/pallets/parachain-system/src/lib.rs | 58 ++++++++++----------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index 96ebcf2be7f..e52169ef187 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -28,20 +28,19 @@ //! Users must ensure that they register this pallet as an inherent provider. use cumulus_primitives_core::{ - relay_chain, CollationInfo, - AbridgedHostConfiguration, ChannelStatus, DmpMessageHandler, GetChannelInfo, - InboundDownwardMessage, InboundHrmpMessage, MessageSendError, OnValidationData, + relay_chain, AbridgedHostConfiguration, ChannelStatus, CollationInfo, DmpMessageHandler, + GetChannelInfo, InboundDownwardMessage, InboundHrmpMessage, MessageSendError, OnValidationData, OutboundHrmpMessage, ParaId, PersistedValidationData, UpwardMessage, UpwardMessageSender, XcmpMessageHandler, XcmpMessageSource, }; use cumulus_primitives_parachain_inherent::ParachainInherentData; use frame_support::{ - ensure, dispatch::{DispatchError, DispatchResult}, + ensure, + inherent::{InherentData, InherentIdentifier, ProvideInherent}, storage, traits::Get, - weights::{PostDispatchInfo, Weight, Pays}, - inherent::{InherentData, InherentIdentifier, ProvideInherent}, + weights::{Pays, PostDispatchInfo, Weight}, }; use frame_system::{ensure_none, ensure_root}; use polkadot_parachain::primitives::RelayChainBlockNumber; @@ -108,6 +107,11 @@ pub mod pallet { fn on_finalize(_: T::BlockNumber) { <DidSetValidationCode<T>>::kill(); + assert!( + <ValidationData<T>>::exists(), + "set_validation_data inherent needs to be present in every block!" + ); + let host_config = match Self::host_configuration() { Some(ok) => ok, None => { @@ -118,18 +122,17 @@ pub mod pallet { return; } }; - let relevant_messaging_state = - match Self::relevant_messaging_state() { - Some(ok) => ok, - None => { - debug_assert!( - false, - "relevant messaging state is promised to be set until `on_finalize`; \ + let relevant_messaging_state = match Self::relevant_messaging_state() { + Some(ok) => ok, + None => { + debug_assert!( + false, + "relevant messaging state is promised to be set until `on_finalize`; \ qed", - ); - return; - } - }; + ); + return; + } + }; <PendingUpwardMessages<T>>::mutate(|up| { let (count, size) = relevant_messaging_state.relay_dispatch_queue_size; @@ -181,10 +184,8 @@ pub mod pallet { let outbound_messages = T::OutboundXcmpMessageSource::take_outbound_messages(maximum_channels) .into_iter() - .map(|(recipient, data)| OutboundHrmpMessage { - recipient, - data, - }).collect::<Vec<_>>(); + .map(|(recipient, data)| OutboundHrmpMessage { recipient, data }) + .collect::<Vec<_>>(); HrmpOutboundMessages::<T>::put(outbound_messages); } @@ -681,8 +682,8 @@ impl<T: Config> Pallet<T> { let mut weight_used = 0; if dm_count != 0 { Self::deposit_event(Event::DownwardMessagesReceived(dm_count)); - let max_weight = <ReservedDmpWeightOverride<T>>::get() - .unwrap_or_else(T::ReservedDmpWeight::get); + let max_weight = + <ReservedDmpWeightOverride<T>>::get().unwrap_or_else(T::ReservedDmpWeight::get); let message_iter = downward_messages .into_iter() @@ -728,11 +729,9 @@ impl<T: Config> Pallet<T> { // A violation of the assertion below indicates that one of the messages submitted // by the collator was sent from a sender that doesn't have a channel opened to // this parachain, according to the relay-parent state. - assert!( - ingress_channels - .binary_search_by_key(sender, |&(s, _)| s) - .is_ok(), - ); + assert!(ingress_channels + .binary_search_by_key(sender, |&(s, _)| s) + .is_ok(),); } // Second, prepare horizontal messages for a more convenient processing: @@ -863,8 +862,7 @@ impl<T: Config> Pallet<T> { Error::<T>::OverlappingUpgrades ); let vfp = Self::validation_data().ok_or(Error::<T>::ValidationDataNotAvailable)?; - let cfg = - Self::host_configuration().ok_or(Error::<T>::HostConfigurationNotAvailable)?; + let cfg = Self::host_configuration().ok_or(Error::<T>::HostConfigurationNotAvailable)?; ensure!( validation_function.len() <= cfg.max_code_size as usize, Error::<T>::TooBig -- GitLab