From 2473f3e11fe98753393aa0a05fd4cf4e8d87c4c4 Mon Sep 17 00:00:00 2001 From: Andronik Date: Tue, 21 Mar 2023 15:56:54 +0100 Subject: [PATCH] runtime/inclusion: fix availability_threshold --- primitives/src/v4/mod.rs | 4 ++-- runtime/parachains/src/inclusion/mod.rs | 12 +++++------- runtime/parachains/src/inclusion/tests.rs | 7 +++++++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/primitives/src/v4/mod.rs b/primitives/src/v4/mod.rs index efd6db836c21..4319aba53e1d 100644 --- a/primitives/src/v4/mod.rs +++ b/primitives/src/v4/mod.rs @@ -1609,13 +1609,13 @@ where /// 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 }`. -pub fn byzantine_threshold(n: usize) -> usize { +pub const fn byzantine_threshold(n: usize) -> usize { n.saturating_sub(1) / 3 } /// The supermajority threshold of validators which represents a subset /// 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) } diff --git a/runtime/parachains/src/inclusion/mod.rs b/runtime/parachains/src/inclusion/mod.rs index e2bd5f8511d7..4f2f530e1211 100644 --- a/runtime/parachains/src/inclusion/mod.rs +++ b/runtime/parachains/src/inclusion/mod.rs @@ -28,10 +28,10 @@ use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use frame_support::pallet_prelude::*; use parity_scale_codec::{Decode, Encode}; use primitives::{ - AvailabilityBitfield, BackedCandidate, CandidateCommitments, CandidateDescriptor, - CandidateHash, CandidateReceipt, CommittedCandidateReceipt, CoreIndex, GroupIndex, Hash, - HeadData, Id as ParaId, SigningContext, UncheckedSignedAvailabilityBitfields, ValidatorId, - ValidatorIndex, ValidityAttestation, + supermajority_threshold, AvailabilityBitfield, BackedCandidate, CandidateCommitments, + CandidateDescriptor, CandidateHash, CandidateReceipt, CommittedCandidateReceipt, CoreIndex, + GroupIndex, Hash, HeadData, Id as ParaId, SigningContext, UncheckedSignedAvailabilityBitfields, + ValidatorId, ValidatorIndex, ValidityAttestation, }; use scale_info::TypeInfo; use sp_runtime::{traits::One, DispatchError}; @@ -899,9 +899,7 @@ impl Pallet { } const fn availability_threshold(n_validators: usize) -> usize { - let mut threshold = (n_validators * 2) / 3; - threshold += (n_validators * 2) % 3; - threshold + supermajority_threshold(n_validators) } #[derive(derive_more::From, Debug)] diff --git a/runtime/parachains/src/inclusion/tests.rs b/runtime/parachains/src/inclusion/tests.rs index 17ef7f7beac7..e0b341258307 100644 --- a/runtime/parachains/src/inclusion/tests.rs +++ b/runtime/parachains/src/inclusion/tests.rs @@ -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] fn supermajority_bitfields_trigger_availability() { let chain_a = ParaId::from(1_u32);