mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 07:01:03 +00:00
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:
@@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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%
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user