Browse Source

Change upgrade runtime proposal

- change upgrade runtime proposal in the codex module: add allowed proposers whitelist
- add tests
Shamil Gadelshin 5 years ago
parent
commit
020f3c7adc

+ 11 - 0
runtime-modules/proposals/codex/src/lib.rs

@@ -81,6 +81,9 @@ pub trait Trait:
     /// Defines max wasm code length of the runtime upgrade proposal.
     type RuntimeUpgradeWasmProposalMaxLength: Get<u32>;
 
+    /// Defines allowed proposers (by member id list) for the runtime upgrade proposal.
+    type RuntimeUpgradeProposalAllowedProposers: Get<Vec<MemberId<Self>>>;
+
     /// Validates member id and origin combination
     type MembershipOriginValidator: ActorOriginValidator<
         Self::Origin,
@@ -124,6 +127,9 @@ decl_error! {
         /// Provided WASM code for the runtime upgrade proposal is empty
         RuntimeProposalIsEmpty,
 
+        /// Runtime upgrade proposal can be created only by hardcoded members
+        RuntimeProposalProposerNotInTheAllowedProposersList,
+
         /// Invalid balance value for the spending proposal
         SpendingProposalZeroBalance,
 
@@ -229,6 +235,11 @@ decl_module! {
             ensure!(wasm.len() as u32 <= T::RuntimeUpgradeWasmProposalMaxLength::get(),
                 Error::RuntimeProposalSizeExceeded);
 
+            ensure!(
+                T::RuntimeUpgradeProposalAllowedProposers::get().contains(&member_id),
+                Error::RuntimeProposalProposerNotInTheAllowedProposersList
+            );
+
             let wasm_hash = blake2_256(&wasm);
 
             let proposal_code =

+ 2 - 0
runtime-modules/proposals/codex/src/tests/mock.rs

@@ -156,6 +156,7 @@ impl VotersParameters for MockVotersParameters {
 parameter_types! {
     pub const TextProposalMaxLength: u32 = 20_000;
     pub const RuntimeUpgradeWasmProposalMaxLength: u32 = 20_000;
+    pub const RuntimeUpgradeProposalAllowedProposers: Vec<u64> = vec![1];
 }
 
 impl governance::election::Trait for Test {
@@ -246,6 +247,7 @@ impl staking::SessionInterface<u64> for Test {
 impl crate::Trait for Test {
     type TextProposalMaxLength = TextProposalMaxLength;
     type RuntimeUpgradeWasmProposalMaxLength = RuntimeUpgradeWasmProposalMaxLength;
+    type RuntimeUpgradeProposalAllowedProposers = RuntimeUpgradeProposalAllowedProposers;
     type MembershipOriginValidator = ();
 }
 

+ 17 - 0
runtime-modules/proposals/codex/src/tests/mod.rs

@@ -241,6 +241,23 @@ fn create_upgrade_runtime_proposal_codex_call_fails_with_incorrect_wasm_size() {
     });
 }
 
+#[test]
+fn create_upgrade_runtime_proposal_codex_call_fails_with_not_allowed_member_id() {
+    initial_test_ext().execute_with(|| {
+        assert_eq!(
+            ProposalCodex::create_runtime_upgrade_proposal(
+                RawOrigin::Signed(1).into(),
+                110,
+                b"title".to_vec(),
+                b"body".to_vec(),
+                Some(<BalanceOf<Test>>::from(50000u32)),
+                b"wasm".to_vec(),
+            ),
+            Err(Error::RuntimeProposalProposerNotInTheAllowedProposersList)
+        );
+    });
+}
+
 #[test]
 fn create_set_election_parameters_proposal_common_checks_succeed() {
     initial_test_ext().execute_with(|| {

+ 2 - 0
runtime/src/lib.rs

@@ -860,12 +860,14 @@ impl proposals_discussion::Trait for Runtime {
 parameter_types! {
     pub const TextProposalMaxLength: u32 = 60_000;
     pub const RuntimeUpgradeWasmProposalMaxLength: u32 = 2_000_000;
+    pub const RuntimeUpgradeProposalAllowedProposers: Vec<u64> = Vec::new(); //TODO set allowed members
 }
 
 impl proposals_codex::Trait for Runtime {
     type MembershipOriginValidator = MembershipOriginValidator<Self>;
     type TextProposalMaxLength = TextProposalMaxLength;
     type RuntimeUpgradeWasmProposalMaxLength = RuntimeUpgradeWasmProposalMaxLength;
+    type RuntimeUpgradeProposalAllowedProposers = RuntimeUpgradeProposalAllowedProposers;
 }
 
 construct_runtime!(