From ebba5d1d3ccbd3efccb4b402c493aa27832ed2c7 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 12 Aug 2019 17:25:34 +0200 Subject: [PATCH] Revert "Forcing can be on or off." This reverts commit 583b0552d6894c4761f6ebf333c9b781c91ca0ef. --- substrate/node/cli/src/chain_spec.rs | 2 - substrate/node/executor/src/lib.rs | 1 - substrate/node/runtime/src/lib.rs | 4 +- substrate/srml/staking/src/lib.rs | 62 +++++++++------------------- substrate/srml/staking/src/mock.rs | 1 - substrate/srml/staking/src/tests.rs | 4 +- 6 files changed, 24 insertions(+), 50 deletions(-) diff --git a/substrate/node/cli/src/chain_spec.rs b/substrate/node/cli/src/chain_spec.rs index acedb5c14b..c14a2709c1 100644 --- a/substrate/node/cli/src/chain_spec.rs +++ b/substrate/node/cli/src/chain_spec.rs @@ -141,7 +141,6 @@ fn staging_testnet_config_genesis() -> GenesisConfig { (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { @@ -269,7 +268,6 @@ pub fn testnet_genesis( (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator) }).collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - .. Default::default() }), democracy: Some(DemocracyConfig::default()), collective_Instance1: Some(CouncilConfig { diff --git a/substrate/node/executor/src/lib.rs b/substrate/node/executor/src/lib.rs index c2e442fd58..a7dcb879d3 100644 --- a/substrate/node/executor/src/lib.rs +++ b/substrate/node/executor/src/lib.rs @@ -378,7 +378,6 @@ mod tests { offline_slash: Perbill::zero(), offline_slash_grace: 0, invulnerables: vec![alice(), bob(), charlie()], - .. Default::default() }), contracts: Some(ContractsConfig { current_schedule: Default::default(), diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index e47a6d8df7..c4c4ca3f8f 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/node/runtime/src/lib.rs @@ -80,8 +80,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 140, - impl_version: 140, + spec_version: 139, + impl_version: 139, apis: RUNTIME_API_VERSIONS, }; diff --git a/substrate/srml/staking/src/lib.rs b/substrate/srml/staking/src/lib.rs index 5a04ae5c5e..0d2ba102d1 100644 --- a/substrate/srml/staking/src/lib.rs +++ b/substrate/srml/staking/src/lib.rs @@ -555,22 +555,6 @@ pub trait Trait: system::Trait { type SessionInterface: self::SessionInterface; } -/// Mode of era-forcing. -#[derive(Copy, Clone, PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub enum Forcing { - /// Not forcing anything - just let whatever happen. - NotForcing, - /// Force a new era, then reset to `NotForcing` as soon as it is done. - ForceNew, - /// Avoid a new era indefinitely. - ForceNone, -} - -impl Default for Forcing { - fn default() -> Self { Forcing::NotForcing } -} - decl_storage! { trait Store for Module as Staking { @@ -641,7 +625,7 @@ decl_storage! { pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>; /// True if the next session change will be a new era regardless of index. - pub ForceEra get(force_era) config(): Forcing; + pub ForceNewEra get(forcing_new_era): bool; /// A mapping from still-bonded eras to the first session index of that era. BondedEras: Vec<(EraIndex, SessionIndex)>; @@ -1004,27 +988,18 @@ decl_module! { // ----- Root calls. - /// Force there to be no new eras indefinitely. + /// Force there to be a new era. This also forces a new session immediately after. + /// `apply_rewards` should be true for validators to get the session reward. /// /// # - /// - No arguments. - /// # - #[weight = SimpleDispatchInfo::FixedOperational(10_000)] - fn force_no_eras(origin) { - ensure_root(origin)?; - ForceEra::put(Forcing::ForceNone); - } - - /// Force there to be a new era at the end of the next session. After this, it will be - /// reset to normal (non-forced) behaviour. - /// - /// # - /// - No arguments. + /// - Independent of the arguments. + /// - Triggers the Phragmen election. Expensive but not user-controlled. + /// - Depends on state: `O(|edges| * |validators|)`. /// # #[weight = SimpleDispatchInfo::FixedOperational(10_000)] fn force_new_era(origin) { ensure_root(origin)?; - ForceEra::put(Forcing::ForceNew); + Self::apply_force_new_era() } /// Set the offline slash grace period. @@ -1154,17 +1129,16 @@ impl Module { fn new_session(session_index: SessionIndex) -> Option<(Vec, Vec<(T::AccountId, Exposure>)>)> { - match ForceEra::get() { - Forcing::ForceNew => ForceEra::kill(), - Forcing::NotForcing if session_index % T::SessionsPerEra::get() == 0 => (), - _ => return None, - } - let validators = T::SessionInterface::validators(); - let prior = validators.into_iter() - .map(|v| { let e = Self::stakers(&v); (v, e) }) - .collect(); + if ForceNewEra::take() || session_index % T::SessionsPerEra::get() == 0 { + let validators = T::SessionInterface::validators(); + let prior = validators.into_iter() + .map(|v| { let e = Self::stakers(&v); (v, e) }) + .collect(); - Self::new_era(session_index).map(move |new| (new, prior)) + Self::new_era(session_index).map(move |new| (new, prior)) + } else { + None + } } /// The era has changed - enact new staking set. @@ -1361,6 +1335,10 @@ impl Module { } } + fn apply_force_new_era() { + ForceNewEra::put(true); + } + /// Remove all associated data of a stash account from the staking system. /// /// This is called : diff --git a/substrate/srml/staking/src/mock.rs b/substrate/srml/staking/src/mock.rs index d8233e5f45..2459eda4e4 100644 --- a/substrate/srml/staking/src/mock.rs +++ b/substrate/srml/staking/src/mock.rs @@ -310,7 +310,6 @@ impl ExtBuilder { offline_slash: Perbill::from_percent(5), offline_slash_grace: 0, invulnerables: vec![], - .. Default::default() }.assimilate_storage(&mut storage); let _ = session::GenesisConfig:: { diff --git a/substrate/srml/staking/src/tests.rs b/substrate/srml/staking/src/tests.rs index 1e81787f33..cf0ef31526 100644 --- a/substrate/srml/staking/src/tests.rs +++ b/substrate/srml/staking/src/tests.rs @@ -108,7 +108,7 @@ fn no_offline_should_work() { assert_eq!(Staking::slash_count(&10), 0); assert_eq!(Balances::free_balance(&10), 1); // New era is not being forced - assert_eq!(Staking::force_era(), Forcing::NotForcing); + assert!(!Staking::forcing_new_era()); }); } @@ -163,7 +163,7 @@ fn invulnerability_should_work() { assert!(>::exists(&11)); // New era not being forced // NOTE: new era is always forced once slashing happens -> new validators need to be chosen. - assert_eq!(Staking::force_era(), Forcing::NotForcing); + assert!(!Staking::forcing_new_era()); }); }