Skip to content

Commit

Permalink
Collective pallet: max proposal weight (paritytech#13771)
Browse files Browse the repository at this point in the history
* collective: max proposal weight

* fix test

---------

Co-authored-by: parity-processbot <>
  • Loading branch information
muharem authored and nathanwhit committed Jul 19, 2023
1 parent 39d7116 commit e110578
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 2 deletions.
4 changes: 4 additions & 0 deletions bin/node/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ parameter_types! {
})
.avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)
.build_or_panic();
pub MaxCollectivesProposalWeight: Weight = Perbill::from_percent(50) * RuntimeBlockWeights::get().max_block;
}

const_assert!(NORMAL_DISPATCH_RATIO.deconstruct() >= AVERAGE_ON_INITIALIZE_RATIO.deconstruct());
Expand Down Expand Up @@ -1012,6 +1013,7 @@ impl pallet_collective::Config<CouncilCollective> for Runtime {
type DefaultVote = pallet_collective::PrimeDefaultVote;
type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>;
type SetMembersOrigin = EnsureRoot<Self::AccountId>;
type MaxProposalWeight = MaxCollectivesProposalWeight;
}

parameter_types! {
Expand Down Expand Up @@ -1072,6 +1074,7 @@ impl pallet_collective::Config<TechnicalCollective> for Runtime {
type DefaultVote = pallet_collective::PrimeDefaultVote;
type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>;
type SetMembersOrigin = EnsureRoot<Self::AccountId>;
type MaxProposalWeight = MaxCollectivesProposalWeight;
}

type EnsureRootOrHalfCouncil = EitherOfDiverse<
Expand Down Expand Up @@ -1700,6 +1703,7 @@ impl pallet_collective::Config<AllianceCollective> for Runtime {
type DefaultVote = pallet_collective::PrimeDefaultVote;
type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>;
type SetMembersOrigin = EnsureRoot<Self::AccountId>;
type MaxProposalWeight = MaxCollectivesProposalWeight;
}

parameter_types! {
Expand Down
6 changes: 5 additions & 1 deletion frame/alliance/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,12 @@ type AccountId = u64;

parameter_types! {
pub const BlockHashCount: BlockNumber = 250;
pub BlockWeights: frame_system::limits::BlockWeights =
frame_system::limits::BlockWeights::simple_max(Weight::MAX);
}
impl frame_system::Config for Test {
type BaseCallFilter = frame_support::traits::Everything;
type BlockWeights = ();
type BlockWeights = BlockWeights;
type BlockLength = ();
type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall = RuntimeCall;
Expand Down Expand Up @@ -97,6 +99,7 @@ parameter_types! {
pub const MotionDuration: BlockNumber = MOTION_DURATION_IN_BLOCKS;
pub const MaxProposals: u32 = 100;
pub const MaxMembers: u32 = 100;
pub MaxProposalWeight: Weight = sp_runtime::Perbill::from_percent(50) * BlockWeights::get().max_block;
}
type AllianceCollective = pallet_collective::Instance1;
impl pallet_collective::Config<AllianceCollective> for Test {
Expand All @@ -109,6 +112,7 @@ impl pallet_collective::Config<AllianceCollective> for Test {
type DefaultVote = pallet_collective::PrimeDefaultVote;
type WeightInfo = ();
type SetMembersOrigin = EnsureRoot<Self::AccountId>;
type MaxProposalWeight = MaxProposalWeight;
}

parameter_types! {
Expand Down
14 changes: 14 additions & 0 deletions frame/collective/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,10 @@ pub mod pallet {

/// Origin allowed to set collective members
type SetMembersOrigin: EnsureOrigin<<Self as frame_system::Config>::RuntimeOrigin>;

/// The maximum weight of a dispatch call that can be proposed and executed.
#[pallet::constant]
type MaxProposalWeight: Get<Weight>;
}

#[pallet::genesis_config]
Expand Down Expand Up @@ -667,6 +671,11 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
) -> Result<(u32, DispatchResultWithPostInfo), DispatchError> {
let proposal_len = proposal.encoded_size();
ensure!(proposal_len <= length_bound as usize, Error::<T, I>::WrongProposalLength);
let proposal_weight = proposal.get_dispatch_info().weight;
ensure!(
proposal_weight.all_lte(T::MaxProposalWeight::get()),
Error::<T, I>::WrongProposalWeight
);

let proposal_hash = T::Hashing::hash_of(&proposal);
ensure!(!<ProposalOf<T, I>>::contains_key(proposal_hash), Error::<T, I>::DuplicateProposal);
Expand All @@ -689,6 +698,11 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
) -> Result<(u32, u32), DispatchError> {
let proposal_len = proposal.encoded_size();
ensure!(proposal_len <= length_bound as usize, Error::<T, I>::WrongProposalLength);
let proposal_weight = proposal.get_dispatch_info().weight;
ensure!(
proposal_weight.all_lte(T::MaxProposalWeight::get()),
Error::<T, I>::WrongProposalWeight
);

let proposal_hash = T::Hashing::hash_of(&proposal);
ensure!(!<ProposalOf<T, I>>::contains_key(proposal_hash), Error::<T, I>::DuplicateProposal);
Expand Down
42 changes: 41 additions & 1 deletion frame/collective/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,13 @@ pub type MaxMembers = ConstU32<100>;
parameter_types! {
pub const MotionDuration: u64 = 3;
pub const MaxProposals: u32 = 257;
pub BlockWeights: frame_system::limits::BlockWeights =
frame_system::limits::BlockWeights::simple_max(Weight::MAX);
pub static MaxProposalWeight: Weight = default_max_proposal_weight();
}
impl frame_system::Config for Test {
type BaseCallFilter = frame_support::traits::Everything;
type BlockWeights = ();
type BlockWeights = BlockWeights;
type BlockLength = ();
type DbWeight = ();
type RuntimeOrigin = RuntimeOrigin;
Expand Down Expand Up @@ -127,6 +130,7 @@ impl Config<Instance1> for Test {
type DefaultVote = PrimeDefaultVote;
type WeightInfo = ();
type SetMembersOrigin = EnsureRoot<Self::AccountId>;
type MaxProposalWeight = MaxProposalWeight;
}
impl Config<Instance2> for Test {
type RuntimeOrigin = RuntimeOrigin;
Expand All @@ -138,6 +142,7 @@ impl Config<Instance2> for Test {
type DefaultVote = MoreThanMajorityThenPrimeDefaultVote;
type WeightInfo = ();
type SetMembersOrigin = EnsureRoot<Self::AccountId>;
type MaxProposalWeight = MaxProposalWeight;
}
impl mock_democracy::Config for Test {
type RuntimeEvent = RuntimeEvent;
Expand All @@ -153,6 +158,7 @@ impl Config for Test {
type DefaultVote = PrimeDefaultVote;
type WeightInfo = ();
type SetMembersOrigin = EnsureRoot<Self::AccountId>;
type MaxProposalWeight = MaxProposalWeight;
}

pub struct ExtBuilder {}
Expand Down Expand Up @@ -201,6 +207,10 @@ fn record(event: RuntimeEvent) -> EventRecord<RuntimeEvent, H256> {
EventRecord { phase: Phase::Initialization, event, topics: vec![] }
}

fn default_max_proposal_weight() -> Weight {
sp_runtime::Perbill::from_percent(80) * BlockWeights::get().max_block
}

#[test]
fn motions_basic_environment_works() {
ExtBuilder::default().build_and_execute(|| {
Expand All @@ -209,6 +219,36 @@ fn motions_basic_environment_works() {
});
}

#[test]
fn proposal_weight_limit_works() {
ExtBuilder::default().build_and_execute(|| {
let proposal = make_proposal(42);
let proposal_len: u32 = proposal.using_encoded(|p| p.len() as u32);

assert_ok!(Collective::propose(
RuntimeOrigin::signed(1),
2,
Box::new(proposal.clone()),
proposal_len
));

// set a small limit for max proposal weight.
MaxProposalWeight::set(Weight::from_parts(1, 1));
assert_noop!(
Collective::propose(
RuntimeOrigin::signed(1),
2,
Box::new(proposal.clone()),
proposal_len
),
Error::<Test, Instance1>::WrongProposalWeight
);

// reset the max weight to default.
MaxProposalWeight::set(default_max_proposal_weight());
});
}

#[test]
fn close_works() {
ExtBuilder::default().build_and_execute(|| {
Expand Down
2 changes: 2 additions & 0 deletions frame/utility/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ parameter_types! {
pub const MotionDuration: BlockNumber = MOTION_DURATION_IN_BLOCKS;
pub const MaxProposals: u32 = 100;
pub const MaxMembers: u32 = 100;
pub MaxProposalWeight: Weight = sp_runtime::Perbill::from_percent(50) * BlockWeights::get().max_block;
}

type CouncilCollective = pallet_collective::Instance1;
Expand All @@ -222,6 +223,7 @@ impl pallet_collective::Config<CouncilCollective> for Test {
type DefaultVote = pallet_collective::PrimeDefaultVote;
type WeightInfo = ();
type SetMembersOrigin = frame_system::EnsureRoot<Self::AccountId>;
type MaxProposalWeight = MaxProposalWeight;
}

impl example::Config for Test {}
Expand Down

0 comments on commit e110578

Please sign in to comment.