Skip to content

Commit

Permalink
Validators don't get slashed for offlineness until 10% at once (parit…
Browse files Browse the repository at this point in the history
…ytech#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>
  • Loading branch information
gavofyork and joepetrowski authored Nov 27, 2019
1 parent a3fb0fd commit 994a173
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
12 changes: 9 additions & 3 deletions frame/im-online/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -653,8 +653,14 @@ impl<Offender: Clone> Offence<Offender> for UnresponsivenessOffence<Offender> {
}

fn slash_fraction(offenders: u32, validator_set_count: u32) -> Perbill {
// the formula is min((3 * (k - 1)) / n, 1) * 0.05
let x = Perbill::from_rational_approximation(3 * (offenders - 1), validator_set_count);
x.saturating_mul(Perbill::from_percent(5))
// the formula is min((3 * (k - (n / 10 + 1))) / n, 1) * 0.07
// basically, 10% can be offline with no slash, but after that, it linearly climbs up to 7%
// 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()
}
}
}
11 changes: 8 additions & 3 deletions frame/im-online/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,19 @@ fn test_unresponsiveness_slash_fraction() {
);

assert_eq!(
UnresponsivenessOffence::<()>::slash_fraction(3, 50),
Perbill::from_parts(6000000), // 0.6%
UnresponsivenessOffence::<()>::slash_fraction(5, 50),
Perbill::zero(), // 0%
);

assert_eq!(
UnresponsivenessOffence::<()>::slash_fraction(7, 50),
Perbill::from_parts(4200000), // 0.42%
);

// One third offline should be punished around 5%.
assert_eq!(
UnresponsivenessOffence::<()>::slash_fraction(17, 50),
Perbill::from_parts(48000000), // 4.8%
Perbill::from_parts(46200000), // 4.62%
);
}

Expand Down

0 comments on commit 994a173

Please sign in to comment.