From c251e1e0a03044b4a913e493f115df807aef14f1 Mon Sep 17 00:00:00 2001 From: ferrell-code Date: Sat, 31 Jul 2021 08:17:42 -0400 Subject: [PATCH] Parachains session_info.rs to FrameV2 (#3521) * migration * storage visability * migrate runtimes * runtimes * Update runtime/parachains/src/session_info.rs * Remove Call part import from all runtimes for ParaSessionInfo * Remove Call part import from runtime/test-runtime/src/lib.rs * Remove Call part import from parachain mocks Co-authored-by: Shawn Tabrizi Co-authored-by: Keith Yeung --- polkadot/runtime/kusama/src/lib.rs | 4 +- .../runtime/parachains/src/initializer.rs | 6 +- polkadot/runtime/parachains/src/mock.rs | 2 +- .../parachains/src/runtime_api_impl/v1.rs | 6 +- .../runtime/parachains/src/session_info.rs | 129 +++++++++--------- polkadot/runtime/rococo/src/lib.rs | 4 +- polkadot/runtime/test-runtime/src/lib.rs | 4 +- polkadot/runtime/westend/src/lib.rs | 4 +- 8 files changed, 80 insertions(+), 79 deletions(-) diff --git a/polkadot/runtime/kusama/src/lib.rs b/polkadot/runtime/kusama/src/lib.rs index 3d0ab1ebd0..f98d0db8b7 100644 --- a/polkadot/runtime/kusama/src/lib.rs +++ b/polkadot/runtime/kusama/src/lib.rs @@ -320,7 +320,7 @@ impl_opaque_keys! { pub babe: Babe, pub im_online: ImOnline, pub para_validator: Initializer, - pub para_assignment: ParasSessionInfo, + pub para_assignment: ParaSessionInfo, pub authority_discovery: AuthorityDiscovery, } } @@ -1483,7 +1483,7 @@ construct_runtime! { Dmp: parachains_dmp::{Pallet, Call, Storage} = 58, Ump: parachains_ump::{Pallet, Call, Storage, Event} = 59, Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event} = 60, - ParasSessionInfo: parachains_session_info::{Pallet, Call, Storage} = 61, + ParaSessionInfo: parachains_session_info::{Pallet, Storage} = 61, // Parachain Onboarding Pallets. Start indices at 70 to leave room. Registrar: paras_registrar::{Pallet, Call, Storage, Event} = 70, diff --git a/polkadot/runtime/parachains/src/initializer.rs b/polkadot/runtime/parachains/src/initializer.rs index 312df0d555..31a0b90441 100644 --- a/polkadot/runtime/parachains/src/initializer.rs +++ b/polkadot/runtime/parachains/src/initializer.rs @@ -137,7 +137,7 @@ pub mod pallet { paras::Pallet::::initializer_initialize(now) + scheduler::Module::::initializer_initialize(now) + inclusion::Pallet::::initializer_initialize(now) + - session_info::Module::::initializer_initialize(now) + + session_info::Pallet::::initializer_initialize(now) + T::DisputesHandler::initializer_initialize(now) + dmp::Pallet::::initializer_initialize(now) + ump::Pallet::::initializer_initialize(now) + @@ -154,7 +154,7 @@ pub mod pallet { ump::Pallet::::initializer_finalize(); dmp::Pallet::::initializer_finalize(); T::DisputesHandler::initializer_finalize(); - session_info::Module::::initializer_finalize(); + session_info::Pallet::::initializer_finalize(); inclusion::Pallet::::initializer_finalize(); scheduler::Module::::initializer_finalize(); paras::Pallet::::initializer_finalize(); @@ -236,7 +236,7 @@ impl Pallet { let outgoing_paras = paras::Pallet::::initializer_on_new_session(¬ification); scheduler::Module::::initializer_on_new_session(¬ification); inclusion::Pallet::::initializer_on_new_session(¬ification); - session_info::Module::::initializer_on_new_session(¬ification); + session_info::Pallet::::initializer_on_new_session(¬ification); T::DisputesHandler::initializer_on_new_session(¬ification); dmp::Pallet::::initializer_on_new_session(¬ification, &outgoing_paras); ump::Pallet::::initializer_on_new_session(¬ification, &outgoing_paras); diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index d44c2e2b64..650422ab81 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -54,7 +54,7 @@ frame_support::construct_runtime!( Dmp: dmp::{Pallet, Call, Storage}, Ump: ump::{Pallet, Call, Storage, Event}, Hrmp: hrmp::{Pallet, Call, Storage, Event}, - SessionInfo: session_info::{Pallet, Call, Storage}, + SessionInfo: session_info::{Pallet, Storage}, Disputes: disputes::{Pallet, Storage, Event}, } ); diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/v1.rs b/polkadot/runtime/parachains/src/runtime_api_impl/v1.rs index 7c61cbd7a7..b2591ab6c9 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/v1.rs @@ -239,7 +239,7 @@ pub fn session_index_for_child() -> SessionIndex { /// Gets next, current and some historical authority ids using `session_info` module. pub fn relevant_authority_ids() -> Vec { let current_session_index = session_index_for_child::(); - let earliest_stored_session = >::earliest_stored_session(); + let earliest_stored_session = >::earliest_stored_session(); // Due to `max_validators`, the `SessionInfo` stores only the validators who are actively // selected to participate in parachain consensus. We'd like all authorities for the current @@ -250,7 +250,7 @@ pub fn relevant_authority_ids>::session_info(session_index); + let info = >::session_info(session_index); if let Some(mut info) = info { authority_ids.append(&mut info.discovery_keys); } @@ -308,7 +308,7 @@ where /// Get the session info for the given session, if stored. pub fn session_info(index: SessionIndex) -> Option { - >::session_info(index) + >::session_info(index) } /// Implementation for the `dmq_contents` function of the runtime API. diff --git a/polkadot/runtime/parachains/src/session_info.rs b/polkadot/runtime/parachains/src/session_info.rs index 49627c1e67..e25a907546 100644 --- a/polkadot/runtime/parachains/src/session_info.rs +++ b/polkadot/runtime/parachains/src/session_info.rs @@ -14,54 +14,56 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! The session info module provides information about validator sets +//! The session info pallet provides information about validator sets //! from prior sessions needed for approvals and disputes. //! //! See https://w3f.github.io/parachain-implementers-guide/runtime/session_info.html. use primitives::v1::{AssignmentId, AuthorityDiscoveryId, SessionIndex, SessionInfo}; -use frame_support::{ - decl_storage, decl_module, decl_error, - traits::OneSessionHandler, weights::Weight, -}; +use frame_support::pallet_prelude::*; +use frame_support::traits::OneSessionHandler; use crate::{configuration, paras, scheduler, shared}; use crate::util::take_active_subset; use sp_std::vec::Vec; -pub trait Config: - frame_system::Config - + configuration::Config - + shared::Config - + paras::Config - + scheduler::Config - + AuthorityDiscoveryConfig -{ -} +pub use pallet::*; -decl_storage! { - trait Store for Module as ParaSessionInfo { - /// Assignment keys for the current session. - /// Note that this API is private due to it being prone to 'off-by-one' at session boundaries. - /// When in doubt, use `Sessions` API instead. - AssignmentKeysUnsafe: Vec; - /// The earliest session for which previous session info is stored. - EarliestStoredSession get(fn earliest_stored_session): SessionIndex; - /// Session information in a rolling window. - /// Should have an entry in range `EarliestStoredSession..=CurrentSessionIndex`. - /// Does not have any entries before the session index in the first session change notification. - Sessions get(fn session_info): map hasher(identity) SessionIndex => Option; +#[frame_support::pallet] +pub mod pallet { + use super::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: + frame_system::Config + + configuration::Config + + shared::Config + + paras::Config + + scheduler::Config + + AuthorityDiscoveryConfig + { } -} -decl_error! { - pub enum Error for Module { } -} + /// Assignment keys for the current session. + /// Note that this API is private due to it being prone to 'off-by-one' at session boundaries. + /// When in doubt, use `Sessions` API instead. + #[pallet::storage] + pub(super) type AssignmentKeysUnsafe = StorageValue<_, Vec, ValueQuery>; -decl_module! { - /// The session info module. - pub struct Module for enum Call where origin: ::Origin { - type Error = Error; - } + /// The earliest session for which previous session info is stored. + #[pallet::storage] + #[pallet::getter(fn earliest_stored_session)] + pub(crate) type EarliestStoredSession = StorageValue<_, SessionIndex, ValueQuery>; + + /// Session information in a rolling window. + /// Should have an entry in range `EarliestStoredSession..=CurrentSessionIndex`. + /// Does not have any entries before the session index in the first session change notification. + #[pallet::storage] + #[pallet::getter(fn session_info)] + pub(crate) type Sessions = StorageMap<_, Identity, SessionIndex, SessionInfo>; } /// An abstraction for the authority discovery pallet @@ -77,7 +79,7 @@ impl AuthorityDiscoveryConfig for T { } } -impl Module { +impl Pallet { /// Handle an incoming session change. pub(crate) fn initializer_on_new_session( notification: &crate::initializer::SessionChangeNotification @@ -88,7 +90,7 @@ impl Module { let validators = notification.validators.clone(); let discovery_keys = ::authorities(); - let assignment_keys = AssignmentKeysUnsafe::get(); + let assignment_keys = AssignmentKeysUnsafe::::get(); let active_set = >::active_validator_indices(); let validator_groups = >::validator_groups(); @@ -100,20 +102,20 @@ impl Module { let needed_approvals = config.needed_approvals; let new_session_index = notification.session_index; - let old_earliest_stored_session = EarliestStoredSession::get(); + let old_earliest_stored_session = EarliestStoredSession::::get(); let new_earliest_stored_session = new_session_index.saturating_sub(dispute_period); let new_earliest_stored_session = core::cmp::max(new_earliest_stored_session, old_earliest_stored_session); // remove all entries from `Sessions` from the previous value up to the new value // avoid a potentially heavy loop when introduced on a live chain - if old_earliest_stored_session != 0 || Sessions::get(0).is_some() { + if old_earliest_stored_session != 0 || Sessions::::get(0).is_some() { for idx in old_earliest_stored_session..new_earliest_stored_session { - Sessions::remove(&idx); + Sessions::::remove(&idx); } // update `EarliestStoredSession` based on `config.dispute_period` - EarliestStoredSession::set(new_earliest_stored_session); + EarliestStoredSession::::set(new_earliest_stored_session); } else { // just introduced on a live chain - EarliestStoredSession::set(new_session_index); + EarliestStoredSession::::set(new_session_index); } // create a new entry in `Sessions` with information about the current session let new_session_info = SessionInfo { @@ -128,23 +130,23 @@ impl Module { no_show_slots, needed_approvals, }; - Sessions::insert(&new_session_index, &new_session_info); + Sessions::::insert(&new_session_index, &new_session_info); } - /// Called by the initializer to initialize the session info module. + /// Called by the initializer to initialize the session info pallet. pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { 0 } - /// Called by the initializer to finalize the session info module. + /// Called by the initializer to finalize the session info pallet. pub(crate) fn initializer_finalize() {} } -impl sp_runtime::BoundToRuntimeAppPublic for Module { +impl sp_runtime::BoundToRuntimeAppPublic for Pallet { type Public = AssignmentId; } -impl OneSessionHandler for Module { +impl OneSessionHandler for Pallet { type Key = AssignmentId; fn on_genesis_session<'a, I: 'a>(_validators: I) @@ -157,7 +159,7 @@ impl OneSessionHandler for Mod where I: Iterator { let assignment_keys: Vec<_> = validators.map(|(_, v)| v).collect(); - AssignmentKeysUnsafe::set(assignment_keys); + AssignmentKeysUnsafe::::set(assignment_keys); } fn on_disabled(_i: usize) { } @@ -169,11 +171,10 @@ mod tests { use super::*; use crate::mock::{ new_test_ext, Configuration, SessionInfo, System, MockGenesisConfig, - Origin, ParasShared, + Origin, ParasShared, Test }; use crate::initializer::SessionChangeNotification; use crate::configuration::HostConfiguration; - use frame_support::traits::{OnFinalize, OnInitialize}; use primitives::v1::{BlockNumber, ValidatorId, ValidatorIndex}; use keyring::Sr25519Keyring; @@ -259,11 +260,11 @@ mod tests { // Move to session 10 run_to_block(100, session_changes); // Earliest stored session is 10 - 2 = 8 - assert_eq!(EarliestStoredSession::get(), 8); + assert_eq!(EarliestStoredSession::::get(), 8); // Pruning works as expected - assert!(Sessions::get(7).is_none()); - assert!(Sessions::get(8).is_some()); - assert!(Sessions::get(9).is_some()); + assert!(Sessions::::get(7).is_none()); + assert!(Sessions::::get(8).is_some()); + assert!(Sessions::::get(9).is_some()); // changing dispute_period works let dispute_period = 5; @@ -278,29 +279,29 @@ mod tests { assert_eq!(config.dispute_period, 5); run_to_block(200, session_changes); - assert_eq!(EarliestStoredSession::get(), 20 - dispute_period); + assert_eq!(EarliestStoredSession::::get(), 20 - dispute_period); // Increase dispute period even more let new_dispute_period = 16; Configuration::set_dispute_period(Origin::root(), new_dispute_period).unwrap(); run_to_block(210, session_changes); - assert_eq!(EarliestStoredSession::get(), 21 - dispute_period); + assert_eq!(EarliestStoredSession::::get(), 21 - dispute_period); // Two sessions later it kicks in run_to_block(220, session_changes); let config = Configuration::config(); assert_eq!(config.dispute_period, 16); // Earliest session stays the same - assert_eq!(EarliestStoredSession::get(), 21 - dispute_period); + assert_eq!(EarliestStoredSession::::get(), 21 - dispute_period); // We still don't have enough stored sessions to start pruning run_to_block(300, session_changes); - assert_eq!(EarliestStoredSession::get(), 21 - dispute_period); + assert_eq!(EarliestStoredSession::::get(), 21 - dispute_period); // now we do run_to_block(420, session_changes); - assert_eq!(EarliestStoredSession::get(), 42 - new_dispute_period); + assert_eq!(EarliestStoredSession::::get(), 42 - new_dispute_period); }) } @@ -308,14 +309,14 @@ mod tests { fn session_info_is_based_on_config() { new_test_ext(genesis_config()).execute_with(|| { run_to_block(1, new_session_every_block); - let session = Sessions::get(&1).unwrap(); + let session = Sessions::::get(&1).unwrap(); assert_eq!(session.needed_approvals, 3); // change some param Configuration::set_needed_approvals(Origin::root(), 42).unwrap(); // 2 sessions later run_to_block(3, new_session_every_block); - let session = Sessions::get(&3).unwrap(); + let session = Sessions::::get(&3).unwrap(); assert_eq!(session.needed_approvals, 42); }) } @@ -349,9 +350,9 @@ mod tests { assert_eq!(ParasShared::active_validator_indices(), active_set); - AssignmentKeysUnsafe::set(unscrambled_assignment.clone()); + AssignmentKeysUnsafe::::set(unscrambled_assignment.clone()); crate::mock::set_discovery_authorities(unscrambled_discovery.clone()); - assert_eq!(::authorities(), unscrambled_discovery); + assert_eq!(::authorities(), unscrambled_discovery); // invoke directly, because `run_to_block` will invoke `Shared` and clobber our // values. @@ -360,7 +361,7 @@ mod tests { validators: validators.clone(), ..Default::default() }); - let session = Sessions::get(&1).unwrap(); + let session = Sessions::::get(&1).unwrap(); assert_eq!(session.validators, validators); assert_eq!( diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 790248daf6..142e8f7313 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -189,7 +189,7 @@ impl_opaque_keys! { pub babe: Babe, pub im_online: ImOnline, pub para_validator: Initializer, - pub para_assignment: SessionInfo, + pub para_assignment: ParaSessionInfo, pub authority_discovery: AuthorityDiscovery, pub beefy: Beefy, } @@ -232,7 +232,7 @@ construct_runtime! { Dmp: parachains_dmp::{Pallet, Call, Storage}, Ump: parachains_ump::{Pallet, Call, Storage, Event}, Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event, Config}, - SessionInfo: parachains_session_info::{Pallet, Call, Storage}, + ParaSessionInfo: parachains_session_info::{Pallet, Storage}, // Parachain Onboarding Pallets Registrar: paras_registrar::{Pallet, Call, Storage, Event}, diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 78d6e821e2..86a3755dd6 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -264,7 +264,7 @@ impl_opaque_keys! { pub grandpa: Grandpa, pub babe: Babe, pub para_validator: Initializer, - pub para_assignment: SessionInfo, + pub para_assignment: ParaSessionInfo, pub authority_discovery: AuthorityDiscovery, } } @@ -543,7 +543,7 @@ construct_runtime! { ParasShared: parachains_shared::{Pallet, Call, Storage}, Scheduler: parachains_scheduler::{Pallet, Call, Storage}, ParasSudoWrapper: paras_sudo_wrapper::{Pallet, Call}, - SessionInfo: parachains_session_info::{Pallet, Call, Storage}, + ParaSessionInfo: parachains_session_info::{Pallet, Storage}, Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event}, Ump: parachains_ump::{Pallet, Call, Storage, Event}, Dmp: parachains_dmp::{Pallet, Call, Storage}, diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index cdc849a104..1c083519f3 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -304,7 +304,7 @@ impl_opaque_keys! { pub babe: Babe, pub im_online: ImOnline, pub para_validator: Initializer, - pub para_assignment: ParasSessionInfo, + pub para_assignment: ParaSessionInfo, pub authority_discovery: AuthorityDiscovery, } } @@ -1073,7 +1073,7 @@ construct_runtime! { Dmp: parachains_dmp::{Pallet, Call, Storage} = 49, Ump: parachains_ump::{Pallet, Call, Storage, Event} = 50, Hrmp: parachains_hrmp::{Pallet, Call, Storage, Event} = 51, - ParasSessionInfo: parachains_session_info::{Pallet, Call, Storage} = 52, + ParaSessionInfo: parachains_session_info::{Pallet, Storage} = 52, // Parachain Onboarding Pallets. Start indices at 60 to leave room. Registrar: paras_registrar::{Pallet, Call, Storage, Event} = 60,