Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
142f6ac
notify when an authority appears to have missed their block
rphmeier Aug 9, 2018
3f09f5c
Runtime API
gavofyork Aug 9, 2018
6095a6d
offline tracker
rphmeier Aug 9, 2018
21f40e5
Merge branch 'rh-note-offline-validator' of github.com:paritytech/pol…
rphmeier Aug 9, 2018
13a5e89
Move to consensus
gavofyork Aug 9, 2018
8c0fd55
Merge branch 'rh-note-offline-validator' of github.com:paritytech/pol…
gavofyork Aug 9, 2018
de23e91
generating reports of offline indices
rphmeier Aug 9, 2018
5433ef3
stubbed-out evaluation logic
rphmeier Aug 9, 2018
603e5a2
Slashing data pathwat
gavofyork Aug 9, 2018
08f598e
Merge branch 'rh-note-offline-validator' of github.com:paritytech/pol…
rphmeier Aug 9, 2018
4e2ceef
usize -> u32
rphmeier Aug 9, 2018
cff0577
Slash bad validators.
gavofyork Aug 9, 2018
825e1a4
Merge branch 'rh-note-offline-validator' of github.com:paritytech/pol…
gavofyork Aug 9, 2018
14b27cc
update to rhododendron 0.3
rphmeier Aug 9, 2018
00f23eb
Merge branch 'rh-note-offline-validator' of github.com:paritytech/pol…
rphmeier Aug 9, 2018
b827eec
fix compilation of polkadot-consensus
rphmeier Aug 9, 2018
6dd3524
Support offline noting in checked_block
gavofyork Aug 9, 2018
1cb58de
Merge branch 'rh-note-offline-validator' of github.com:paritytech/pol…
gavofyork Aug 9, 2018
241f28f
include offline reports in block authorship voting
rphmeier Aug 10, 2018
614b011
do not vote validators offline after some time
rphmeier Aug 10, 2018
b122ed4
add test for offline-tracker
rphmeier Aug 10, 2018
9724a69
fix test build
rphmeier Aug 10, 2018
60aadd3
bump spec version
rphmeier Aug 10, 2018
2fb0343
Merge remote-tracking branch 'upstream/master' into rh-note-offline-v…
rphmeier Aug 10, 2018
7602e59
update wasm
rphmeier Aug 10, 2018
922035d
Only allow validators that are possible to slash
gavofyork Aug 10, 2018
a6bea42
Fix grumble
tomusdrw Aug 3, 2018
a61396e
More idiomatic
gavofyork Aug 10, 2018
1d787e1
New Wasm.
gavofyork Aug 10, 2018
ab6957f
update rhododendron
rphmeier Aug 10, 2018
7696119
improve logging and reduce round time exponent
rphmeier Aug 10, 2018
2446ded
format offline validators in ss58
rphmeier Aug 10, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions substrate/runtime/democracy/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,7 @@ mod tests {
assert_eq!(Democracy::tally(r), (10, 0));

assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());

assert_eq!(Staking::era_length(), 2);
});
Expand Down Expand Up @@ -573,19 +573,19 @@ mod tests {
System::set_block_number(1);
assert_ok!(Democracy::vote(&1, 0, true));
assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());
assert_eq!(Staking::bonding_duration(), 4);

System::set_block_number(2);
assert_ok!(Democracy::vote(&1, 1, true));
assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());
assert_eq!(Staking::bonding_duration(), 3);

System::set_block_number(3);
assert_ok!(Democracy::vote(&1, 2, true));
assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());
assert_eq!(Staking::bonding_duration(), 2);
});
}
Expand All @@ -606,7 +606,7 @@ mod tests {
assert_eq!(Democracy::tally(r), (10, 0));

assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());

assert_eq!(Staking::era_length(), 2);
});
Expand All @@ -621,7 +621,7 @@ mod tests {
assert_ok!(Democracy::cancel_referendum(r));

assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());

assert_eq!(Staking::era_length(), 1);
});
Expand All @@ -639,7 +639,7 @@ mod tests {
assert_eq!(Democracy::tally(r), (0, 10));

assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());

assert_eq!(Staking::era_length(), 1);
});
Expand All @@ -660,7 +660,7 @@ mod tests {
assert_eq!(Democracy::tally(r), (110, 100));

assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());

assert_eq!(Staking::era_length(), 2);
});
Expand All @@ -677,7 +677,7 @@ mod tests {
assert_eq!(Democracy::tally(r), (60, 50));

assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());

assert_eq!(Staking::era_length(), 1);
});
Expand All @@ -698,7 +698,7 @@ mod tests {
assert_eq!(Democracy::tally(r), (100, 50));

assert_eq!(Democracy::end_block(System::block_number()), Ok(()));
Staking::on_session_change(true, 0);
Staking::on_session_change(0, Vec::new());

assert_eq!(Staking::era_length(), 2);
});
Expand Down
50 changes: 29 additions & 21 deletions substrate/runtime/staking/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,9 @@ decl_storage! {
// The current era stake threshold
pub StakeThreshold get(stake_threshold): b"sta:stake_threshold" => required T::Balance;

// The current bad validator slash.
pub CurrentSlash get(current_slash): b"sta:current_slash" => default T::Balance;

// The next free enumeration set.
pub NextEnumSet get(next_enum_set): b"sta:next_enum" => required T::AccountIndex;
// The enumeration sets.
Expand Down Expand Up @@ -589,10 +592,30 @@ impl<T: Trait> Module<T> {

/// Session has just changed. We need to determine whether we pay a reward, slash and/or
/// move to a new era.
fn new_session(normal_rotation: bool, actual_elapsed: T::Moment) {
fn new_session(actual_elapsed: T::Moment, bad_validators: Vec<T::AccountId>) {
let session_index = <session::Module<T>>::current_index();
let early_exit_era = bad_validators.len() > 0;

if bad_validators.len() > 0 {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

favor is_empty over bad_validators

// slash
let slash = Self::current_slash() + Self::early_era_slash();
<CurrentSlash<T>>::put(&slash);
for v in bad_validators.into_iter() {
if let Some(rem) = Self::slash(&v, slash) {
let noms = Self::current_nominators_for(&v);
let total = noms.iter().map(Self::voting_balance).fold(T::Balance::zero(), |acc, x| acc + x);
if !total.is_zero() {
let safe_mul_rational = |b| b * rem / total;// TODO: avoid overflow
for n in noms.iter() {
let _ = Self::slash(n, safe_mul_rational(Self::voting_balance(n))); // best effort - not much that can be done on fail.
}
}
}
}
} else {
// Zero any cumulative slash since we're healthy now.
<CurrentSlash<T>>::kill();

if normal_rotation {
// reward
let ideal_elapsed = <session::Module<T>>::ideal_session_duration();
let per65536: u64 = (T::Moment::sa(65536u64) * ideal_elapsed.clone() / actual_elapsed.max(ideal_elapsed)).as_();
Expand All @@ -609,25 +632,10 @@ impl<T: Trait> Module<T> {
let _ = Self::reward(v, safe_mul_rational(Self::voting_balance(v)));
}
}
} else {
// slash
let early_era_slash = Self::early_era_slash();
for v in <session::Module<T>>::validators().iter() {
if let Some(rem) = Self::slash(v, early_era_slash) {
let noms = Self::current_nominators_for(v);
let total = noms.iter().map(Self::voting_balance).fold(T::Balance::zero(), |acc, x| acc + x);
if !total.is_zero() {
let safe_mul_rational = |b| b * rem / total;// TODO: avoid overflow
for n in noms.iter() {
let _ = Self::slash(n, safe_mul_rational(Self::voting_balance(n))); // best effort - not much that can be done on fail.
}
}
}
}
}
if <ForcingNewEra<T>>::take().is_some()
|| ((session_index - Self::last_era_length_change()) % Self::sessions_per_era()).is_zero()
|| !normal_rotation
|| early_exit_era
{
Self::new_era();
}
Expand Down Expand Up @@ -797,9 +805,9 @@ impl<T: Trait> Executable for Module<T> {
}
}

impl<T: Trait> OnSessionChange<T::Moment> for Module<T> {
fn on_session_change(normal_rotation: bool, elapsed: T::Moment) {
Self::new_session(normal_rotation, elapsed);
impl<T: Trait> OnSessionChange<T::Moment, T::AccountId> for Module<T> {
fn on_session_change(elapsed: T::Moment, bad_validators: Vec<T::AccountId>) {
Self::new_session(elapsed, bad_validators);
}
}

Expand Down