runtime/inclusion: fix availability_threshold (#6931)

This commit is contained in:
ordian
2023-03-21 17:20:59 +01:00
committed by GitHub
parent 6414284ff5
commit 4ed3997938
3 changed files with 14 additions and 9 deletions
+2 -2
View File
@@ -1609,13 +1609,13 @@ where
/// The maximum number of validators `f` which may safely be faulty. /// The maximum number of validators `f` which may safely be faulty.
/// ///
/// The total number of validators is `n = 3f + e` where `e in { 1, 2, 3 }`. /// The total number of validators is `n = 3f + e` where `e in { 1, 2, 3 }`.
pub fn byzantine_threshold(n: usize) -> usize { pub const fn byzantine_threshold(n: usize) -> usize {
n.saturating_sub(1) / 3 n.saturating_sub(1) / 3
} }
/// The supermajority threshold of validators which represents a subset /// The supermajority threshold of validators which represents a subset
/// guaranteed to have at least f+1 honest validators. /// guaranteed to have at least f+1 honest validators.
pub fn supermajority_threshold(n: usize) -> usize { pub const fn supermajority_threshold(n: usize) -> usize {
n - byzantine_threshold(n) n - byzantine_threshold(n)
} }
@@ -28,10 +28,10 @@ use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec};
use frame_support::pallet_prelude::*; use frame_support::pallet_prelude::*;
use parity_scale_codec::{Decode, Encode}; use parity_scale_codec::{Decode, Encode};
use primitives::{ use primitives::{
AvailabilityBitfield, BackedCandidate, CandidateCommitments, CandidateDescriptor, supermajority_threshold, AvailabilityBitfield, BackedCandidate, CandidateCommitments,
CandidateHash, CandidateReceipt, CommittedCandidateReceipt, CoreIndex, GroupIndex, Hash, CandidateDescriptor, CandidateHash, CandidateReceipt, CommittedCandidateReceipt, CoreIndex,
HeadData, Id as ParaId, SigningContext, UncheckedSignedAvailabilityBitfields, ValidatorId, GroupIndex, Hash, HeadData, Id as ParaId, SigningContext, UncheckedSignedAvailabilityBitfields,
ValidatorIndex, ValidityAttestation, ValidatorId, ValidatorIndex, ValidityAttestation,
}; };
use scale_info::TypeInfo; use scale_info::TypeInfo;
use sp_runtime::{traits::One, DispatchError}; use sp_runtime::{traits::One, DispatchError};
@@ -899,9 +899,7 @@ impl<T: Config> Pallet<T> {
} }
const fn availability_threshold(n_validators: usize) -> usize { const fn availability_threshold(n_validators: usize) -> usize {
let mut threshold = (n_validators * 2) / 3; supermajority_threshold(n_validators)
threshold += (n_validators * 2) % 3;
threshold
} }
#[derive(derive_more::From, Debug)] #[derive(derive_more::From, Debug)]
@@ -710,6 +710,13 @@ fn bitfield_checks() {
}); });
} }
#[test]
fn availability_threshold_is_supermajority() {
assert_eq!(3, availability_threshold(4));
assert_eq!(5, availability_threshold(6));
assert_eq!(7, availability_threshold(9));
}
#[test] #[test]
fn supermajority_bitfields_trigger_availability() { fn supermajority_bitfields_trigger_availability() {
let chain_a = ParaId::from(1_u32); let chain_a = ParaId::from(1_u32);