From 6fa40ec199a2275a38ceccb1990875e3c51a0094 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sat, 23 Mar 2019 08:16:22 +0100 Subject: [PATCH] Fix up the offline validator API to accept controller (#2090) --- substrate/node/runtime/src/lib.rs | 4 +- .../release/node_runtime.compact.wasm | Bin 923504 -> 923727 bytes substrate/srml/staking/src/lib.rs | 94 ++++++++++-------- substrate/srml/staking/src/tests.rs | 18 ++-- 4 files changed, 61 insertions(+), 55 deletions(-) diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index 80260801ef..ddfa241e37 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/node/runtime/src/lib.rs @@ -58,8 +58,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 39, - impl_version: 39, + spec_version: 40, + impl_version: 40, apis: RUNTIME_API_VERSIONS, }; diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 3af4c1768d944ea6959626a002a34ef27a0bcfa2..bb36c2cbf77fa7b65c3e11bbe5b2ed5db61de609 100644 GIT binary patch delta 16925 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 delta 17164 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 N%j}^)#4?}q{ts$3?;ijF diff --git a/substrate/srml/staking/src/lib.rs b/substrate/srml/staking/src/lib.rs index aa3ef1d4b2..68e26a8e63 100644 --- a/substrate/srml/staking/src/lib.rs +++ b/substrate/srml/staking/src/lib.rs @@ -960,56 +960,62 @@ impl Module { /// Call when a validator is determined to be offline. `count` is the /// number of offences the validator has committed. - pub fn on_offline_validator(v: T::AccountId, count: usize) { + /// + /// NOTE: This is called with the controller (not the stash) account id. + pub fn on_offline_validator(controller: T::AccountId, count: usize) { use primitives::traits::CheckedShl; - // Early exit if validator is invulnerable. - if Self::invulnerables().contains(&v) { - return - } + if let Some(l) = Self::ledger(&controller) { + let stash = l.stash; - let slash_count = Self::slash_count(&v); - let new_slash_count = slash_count + count as u32; - >::insert(&v, new_slash_count); - let grace = Self::offline_slash_grace(); + // Early exit if validator is invulnerable. + if Self::invulnerables().contains(&stash) { + return + } - if RECENT_OFFLINE_COUNT > 0 { - let item = (v.clone(), >::block_number(), count as u32); - >::mutate(|v| if v.len() >= RECENT_OFFLINE_COUNT { - let index = v.iter() - .enumerate() - .min_by_key(|(_, (_, block, _))| block) - .expect("v is non-empty; qed") - .0; - v[index] = item; + let slash_count = Self::slash_count(&stash); + let new_slash_count = slash_count + count as u32; + >::insert(&stash, new_slash_count); + let grace = Self::offline_slash_grace(); + + if RECENT_OFFLINE_COUNT > 0 { + let item = (stash.clone(), >::block_number(), count as u32); + >::mutate(|v| if v.len() >= RECENT_OFFLINE_COUNT { + let index = v.iter() + .enumerate() + .min_by_key(|(_, (_, block, _))| block) + .expect("v is non-empty; qed") + .0; + v[index] = item; + } else { + v.push(item); + }); + } + + let prefs = Self::validators(&stash); + let unstake_threshold = prefs.unstake_threshold.min(MAX_UNSTAKE_THRESHOLD); + let max_slashes = grace + unstake_threshold; + + let event = if new_slash_count > max_slashes { + let slash_exposure = Self::stakers(&stash).total; + let offline_slash_base = Self::offline_slash() * slash_exposure; + // They're bailing. + let slash = offline_slash_base + // Multiply slash_mantissa by 2^(unstake_threshold with upper bound) + .checked_shl(unstake_threshold) + .map(|x| x.min(slash_exposure)) + .unwrap_or(slash_exposure); + let _ = Self::slash_validator(&stash, slash); + >::remove(&stash); + let _ = Self::apply_force_new_era(false); + + RawEvent::OfflineSlash(stash.clone(), slash) } else { - v.push(item); - }); + RawEvent::OfflineWarning(stash.clone(), slash_count) + }; + + Self::deposit_event(event); } - - let prefs = Self::validators(&v); - let unstake_threshold = prefs.unstake_threshold.min(MAX_UNSTAKE_THRESHOLD); - let max_slashes = grace + unstake_threshold; - - let event = if new_slash_count > max_slashes { - let slash_exposure = Self::stakers(&v).total; - let offline_slash_base = Self::offline_slash() * slash_exposure; - // They're bailing. - let slash = offline_slash_base - // Multiply slash_mantissa by 2^(unstake_threshold with upper bound) - .checked_shl(unstake_threshold) - .map(|x| x.min(slash_exposure)) - .unwrap_or(slash_exposure); - let _ = Self::slash_validator(&v, slash); - >::remove(&v); - let _ = Self::apply_force_new_era(false); - - RawEvent::OfflineSlash(v.clone(), slash) - } else { - RawEvent::OfflineWarning(v.clone(), slash_count) - }; - - Self::deposit_event(event); } } diff --git a/substrate/srml/staking/src/tests.rs b/substrate/srml/staking/src/tests.rs index 50c5772985..86b583fab8 100644 --- a/substrate/srml/staking/src/tests.rs +++ b/substrate/srml/staking/src/tests.rs @@ -117,7 +117,7 @@ fn invulnerability_should_work() { // Set account 11 as an offline validator with a large number of reports // Should exit early if invulnerable - Staking::on_offline_validator(11, 100); + Staking::on_offline_validator(10, 100); // Show that account 11 has not been touched assert_eq!(Staking::slash_count(&11), 0); @@ -146,7 +146,7 @@ fn offline_should_slash_and_kick() { // Account 10 has the funds we just gave it assert_eq!(Balances::free_balance(&11), 1000); // Report account 10 as offline, one greater than unstake threshold - Staking::on_offline_validator(11, 4); + Staking::on_offline_validator(10, 4); // Confirm user has been reported assert_eq!(Staking::slash_count(&11), 4); // Confirm balance has been reduced by 2^unstake_threshold * offline_slash() * amount_at_stake. @@ -181,7 +181,7 @@ fn offline_grace_should_delay_slashing() { assert_eq!(Staking::slash_count(&11), 0); // Report account 10 up to the threshold - Staking::on_offline_validator(11, default_unstake_threshold as usize + offline_slash_grace as usize); + Staking::on_offline_validator(10, default_unstake_threshold as usize + offline_slash_grace as usize); // Confirm slash count assert_eq!(Staking::slash_count(&11), 4); @@ -189,7 +189,7 @@ fn offline_grace_should_delay_slashing() { assert_eq!(Balances::free_balance(&11), 70); // Report account 10 one more time - Staking::on_offline_validator(11, 1); + Staking::on_offline_validator(10, 1); assert_eq!(Staking::slash_count(&11), 5); // User gets slashed assert_eq!(Balances::free_balance(&11), 0); @@ -236,8 +236,8 @@ fn max_unstake_threshold_works() { >::put(Perbill::from_fraction(0.0001)); // Report each user 1 more than the max_unstake_threshold - Staking::on_offline_validator(11, MAX_UNSTAKE_THRESHOLD as usize + 1); - Staking::on_offline_validator(21, MAX_UNSTAKE_THRESHOLD as usize + 1); + Staking::on_offline_validator(10, MAX_UNSTAKE_THRESHOLD as usize + 1); + Staking::on_offline_validator(20, MAX_UNSTAKE_THRESHOLD as usize + 1); // Show that each balance only gets reduced by 2^max_unstake_threshold times 10% // of their total stake. @@ -264,7 +264,7 @@ fn slashing_does_not_cause_underflow() { Session::check_rotate_session(System::block_number()); // Should not panic - Staking::on_offline_validator(11, 100); + Staking::on_offline_validator(10, 100); // Confirm that underflow has not occurred, and account balance is set to zero assert_eq!(Balances::free_balance(&11), 0); }); @@ -1261,7 +1261,7 @@ fn slot_stake_is_least_staked_validator_and_limits_maximum_punishment() { assert_eq!(Staking::slot_stake(), 79); // // If 10 gets slashed now, despite having +1000 in stash, it will be slashed byt 79, which is the slot stake - Staking::on_offline_validator(11, 4); + Staking::on_offline_validator(10, 4); // // Confirm user has been reported assert_eq!(Staking::slash_count(&11), 4); // // check the balance of 10 (slash will be deducted from free balance.) @@ -1288,7 +1288,7 @@ fn on_free_balance_zero_stash_removes_validator() { // Set some storage items which we expect to be cleaned up // Initiate slash count storage item - Staking::on_offline_validator(11, 1); + Staking::on_offline_validator(10, 1); // Set payee information assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Stash));