Validators don't get slashed for offlineness until 10% at once (#4232)

* Validators don't get slashed for offlineness until 10% at once

* Update frame/im-online/src/tests.rs

Co-Authored-By: Marcio Diaz <marcio.diaz@gmail.com>

* Update frame/im-online/src/tests.rs

Co-Authored-By: Marcio Diaz <marcio.diaz@gmail.com>

* Apply suggestions from code review

Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com>
This commit is contained in:
Gavin Wood
2019-11-27 18:57:03 +00:00
committed by GitHub
parent 77d0c065d3
commit de5686509c
2 changed files with 17 additions and 6 deletions
+9 -3
View File
@@ -653,8 +653,14 @@ impl<Offender: Clone> Offence<Offender> for UnresponsivenessOffence<Offender> {
} }
fn slash_fraction(offenders: u32, validator_set_count: u32) -> Perbill { fn slash_fraction(offenders: u32, validator_set_count: u32) -> Perbill {
// the formula is min((3 * (k - 1)) / n, 1) * 0.05 // the formula is min((3 * (k - (n / 10 + 1))) / n, 1) * 0.07
let x = Perbill::from_rational_approximation(3 * (offenders - 1), validator_set_count); // basically, 10% can be offline with no slash, but after that, it linearly climbs up to 7%
x.saturating_mul(Perbill::from_percent(5)) // when 13/30 are offline (around 5% when 1/3 are offline).
if let Some(threshold) = offenders.checked_sub(validator_set_count / 10 + 1) {
let x = Perbill::from_rational_approximation(3 * threshold, validator_set_count);
x.saturating_mul(Perbill::from_percent(7))
} else {
Perbill::default()
}
} }
} }
+8 -3
View File
@@ -38,14 +38,19 @@ fn test_unresponsiveness_slash_fraction() {
); );
assert_eq!( assert_eq!(
UnresponsivenessOffence::<()>::slash_fraction(3, 50), UnresponsivenessOffence::<()>::slash_fraction(5, 50),
Perbill::from_parts(6000000), // 0.6% Perbill::zero(), // 0%
);
assert_eq!(
UnresponsivenessOffence::<()>::slash_fraction(7, 50),
Perbill::from_parts(4200000), // 0.42%
); );
// One third offline should be punished around 5%. // One third offline should be punished around 5%.
assert_eq!( assert_eq!(
UnresponsivenessOffence::<()>::slash_fraction(17, 50), UnresponsivenessOffence::<()>::slash_fraction(17, 50),
Perbill::from_parts(48000000), // 4.8% Perbill::from_parts(46200000), // 4.62%
); );
} }