Session Delayed Para Changes / Actions Queue (#2406)

* initial implementation of lifecycles and upgrades

* clean up a bit

* fix doc comment

* more rigid lifecycle checks

* include paras which are transitioning, and lifecycle query

* format guide

* update api

* update guide

* explicit outgoing state, fix genesis

* handle outgoing with transitioning paras

* do not include transitioning paras in identifier

* Update roadmap/implementers-guide/src/runtime/paras.md

* Update roadmap/implementers-guide/src/runtime/paras.md

* Update roadmap/implementers-guide/src/runtime/paras.md

* Apply suggestions from code review

* Use matches macro

* Correct terms

* Apply suggestions from code review

* actions queue

* Revert "actions queue"

This reverts commit b2e9011ec8937d6c73e99292416c9692aeb30f73.

* collapse onboarding state

* starting actions queue

* consolidate actions queue

* schedule para initialize result

* more actions queue for upgrade/downgrade

* clean up with fully implemented actions queue

* fix tests

* fix scheduler tests

* fix hrmp tests

* fix test

* doc fixes

* fix hrmp test w/ valid para

* Update paras.md

* fix paras registrar

* Update propose_parachain.rs

* fix merge

* Introduce "shared" module

* fix rococo build

* fix up and use shared

* guide updates

* add shared config to common tests

* add shared to test-runtime

* remove println

* fix note

Co-authored-by: Gavin Wood <gavin@parity.io>
This commit is contained in:
Shawn Tabrizi
2021-02-18 23:20:18 -04:00
committed by GitHub
parent 006602eff2
commit a5defa7c7f
20 changed files with 654 additions and 698 deletions
+4
View File
@@ -65,6 +65,7 @@ use runtime_common::{paras_sudo_wrapper, paras_registrar};
use runtime_parachains::origin as parachains_origin;
use runtime_parachains::configuration as parachains_configuration;
use runtime_parachains::shared as parachains_shared;
use runtime_parachains::inclusion as parachains_inclusion;
use runtime_parachains::inclusion_inherent as parachains_inclusion_inherent;
use runtime_parachains::initializer as parachains_initializer;
@@ -187,6 +188,7 @@ construct_runtime! {
// Parachains modules.
ParachainsOrigin: parachains_origin::{Module, Origin},
ParachainsConfiguration: parachains_configuration::{Module, Call, Storage, Config<T>},
Shared: parachains_shared::{Module, Call, Storage},
Inclusion: parachains_inclusion::{Module, Call, Storage, Event<T>},
InclusionInherent: parachains_inclusion_inherent::{Module, Call, Storage, Inherent},
Scheduler: parachains_scheduler::{Module, Call, Storage},
@@ -500,6 +502,8 @@ impl parachains_origin::Config for Runtime {}
impl parachains_configuration::Config for Runtime {}
impl parachains_shared::Config for Runtime {}
/// Special `RewardValidators` that does nothing ;)
pub struct RewardValidators;
impl runtime_parachains::inclusion::RewardValidators for RewardValidators {
@@ -134,6 +134,8 @@ decl_error! {
DefinitelyNotWasm,
/// Registration requires at least one validator.
AtLeastOneValidatorRequired,
/// Couldn't schedule parachain cleanup.
CouldntCleanup,
}
}
@@ -195,11 +197,7 @@ decl_module! {
ensure!(validators.len() > 0, Error::<T>::AtLeastOneValidatorRequired);
ensure!(!Proposals::<T>::contains_key(&para_id), Error::<T>::ParachainIdAlreadyProposed);
ensure!(
!runtime_parachains::paras::Module::<T>::parachains().contains(&para_id),
Error::<T>::ParachainIdAlreadyTaken,
);
ensure!(
!runtime_parachains::paras::Module::<T>::upcoming_paras().contains(&para_id),
runtime_parachains::paras::Module::<T>::lifecycle(para_id).is_none(),
Error::<T>::ParachainIdAlreadyTaken,
);
ensure!(validation_code.0.starts_with(runtime_common::WASM_MAGIC), Error::<T>::DefinitelyNotWasm);
@@ -289,10 +287,10 @@ decl_module! {
if let Some(who) = who {
ensure!(who == info.proposer, Error::<T>::NotAuthorized);
}
runtime_parachains::schedule_para_cleanup::<T>(para_id).map_err(|_| Error::<T>::CouldntCleanup)?;
ParachainInfo::<T>::remove(&para_id);
info.validators.into_iter().for_each(|v| ValidatorsToRetire::<T>::append(v));
runtime_parachains::schedule_para_cleanup::<T>(para_id);
pallet_balances::Module::<T>::unreserve(&info.proposer, T::ProposeDeposit::get());
}
@@ -354,7 +352,8 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Module<T> {
parachain: true,
};
runtime_parachains::schedule_para_initialize::<T>(*id, genesis);
// Not much we can do if this fails...
let _ = runtime_parachains::schedule_para_initialize::<T>(*id, genesis);
validators.extend(proposal.validators);
}