diff --git a/cumulus/pallets/collator-selection/src/mock.rs b/cumulus/pallets/collator-selection/src/mock.rs index 459b1cb5fdf28c118751c3afccc4b882891d1cc3..d13f9e9d8c44d3190cce7a168a26bad784824a0f 100644 --- a/cumulus/pallets/collator-selection/src/mock.rs +++ b/cumulus/pallets/collator-selection/src/mock.rs @@ -187,7 +187,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { candidacy_bond: 10, invulnerables, }; - let session = pallet_session::GenesisConfig::<Test> { keys }; + let session = pallet_session::GenesisConfig::<Test> { keys, ..Default::default() }; pallet_balances::GenesisConfig::<Test> { balances } .assimilate_storage(&mut t) .unwrap(); diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs index 3a87322664d91edb829b44603122c300602f2978..82f86e2b32ef00b50896bbc6208bda059dd8a8b3 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs @@ -62,6 +62,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: asset_hub_rococo_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs index 219d1306906cbc6c20609870bec496c5bd16eaeb..fd84030ed13be0b5deeb4490552f0d8c44678ad4 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs @@ -58,6 +58,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: asset_hub_westend_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs index 12778215b1320f591bec787198243c825313e858..3786d529ea6502988f92c18955722a7a0f9ebded 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs @@ -52,6 +52,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: bridge_hub_rococo_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/genesis.rs index 4be68e510f4d254dcf645db682b6cf34ff69e634..a160d18d4cf7a68c36526aa9ff6228e730c0a77a 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/genesis.rs @@ -51,6 +51,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: bridge_hub_westend_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/genesis.rs index 6a28b1a9dddb8ca8b118592d85ef11367569d2a0..d4ef184ea392de3bcd936b889aa030e032ad120c 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/genesis.rs @@ -51,6 +51,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: collectives_westend_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs index f72de52c4932474243f1bb06b775145df11779b6..e0f035c368e3966f1d2fc08b7d0bf2597fadda01 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs @@ -51,6 +51,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: coretime_rococo_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs index 222ffe7a63ab48d007496db31114b769a335b7bb..239ad3760c1120b5bfdf04f93e442bf1a50f2976 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs @@ -51,6 +51,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: coretime_westend_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs index b14009933029bfbc5cd5eeda9263126cd92a23c6..43d182facdd5186eb7ad5a770d0bc50d3c1b597b 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs @@ -47,6 +47,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: people_rococo_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs index d385fbebc821c05205f55bc5ea5f04d57ec9af21..0b99f19bc1309d49f1ae06b78d284c706443936b 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs @@ -47,6 +47,7 @@ pub fn genesis() -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: people_westend_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs index 450439f5ea3080b66c5c572dfdae972c23c52a4b..260875088bbcb2c68381bd2d6974f98520c5d616 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs @@ -59,6 +59,7 @@ pub fn genesis(para_id: u32) -> Storage { ) }) .collect(), + ..Default::default() }, polkadot_xcm: penpal_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs index 074a1de5e1852279ad32aafe97e40289cecb6758..9cb25b403600f7b8318b6d1ab41129a66107f0ac 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs @@ -75,6 +75,7 @@ pub fn genesis() -> Storage { ) }) .collect::<Vec<_>>(), + ..Default::default() }, babe: rococo_runtime::BabeConfig { authorities: Default::default(), diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs index b9f12932b84e163214f0cfc12d32d7da24b5bc05..172e6e0ac93ec9cf2ec2f95257ffa1af450ad5a1 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs @@ -77,6 +77,7 @@ pub fn genesis() -> Storage { ) }) .collect::<Vec<_>>(), + ..Default::default() }, staking: westend_runtime::StakingConfig { validator_count: validators::initial_authorities().len() as u32, diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs index 3fc3822a63eb9a2c98bc273814854ee2d56035bf..940aa1b734dfc856b5a72cf83cc14b5f8980bc5e 100644 --- a/cumulus/parachains/runtimes/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/test-utils/src/lib.rs @@ -242,7 +242,7 @@ impl<Runtime: BasicParachainRuntime> ExtBuilder<Runtime> { .assimilate_storage(&mut t) .unwrap(); - pallet_session::GenesisConfig::<Runtime> { keys: self.keys } + pallet_session::GenesisConfig::<Runtime> { keys: self.keys, ..Default::default() } .assimilate_storage(&mut t) .unwrap(); diff --git a/cumulus/polkadot-parachain/src/chain_spec/asset_hubs.rs b/cumulus/polkadot-parachain/src/chain_spec/asset_hubs.rs index 45920cdb6146b01765fb568506ef861c220b5792..af5bccdc416f4b49714222de3ebde7fe545feef8 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/asset_hubs.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/asset_hubs.rs @@ -389,6 +389,7 @@ fn asset_hub_rococo_genesis( ) }) .collect(), + ..Default::default() }, "polkadotXcm": asset_hub_rococo_runtime::PolkadotXcmConfig { safe_xcm_version: Some(SAFE_XCM_VERSION), diff --git a/prdoc/pr_5078.prdoc b/prdoc/pr_5078.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1805a27c3f28a4d16160af055420a7023e2edfd8 --- /dev/null +++ b/prdoc/pr_5078.prdoc @@ -0,0 +1,34 @@ +title: Add possibility to inject non-authorities session-keys in genesis + +doc: + - audience: Runtime Dev + description: | + Allows to inject a set of registered session-keys in pallet-session that are not + part of the first initial set of validators +crates: +- name: pallet-session + bump: major +- name: parachains-runtimes-test-utils + bump: patch +- name: pallet-staking + bump: none +- name: pallet-collator-selection + bump: none +- name: pallet-root-offences + bump: none +- name: pallet-babe + bump: none +- name: pallet-staking + bump: none +- name: pallet-grandpa + bump: none +- name: pallet-collator-selection + bump: none +- name: pallet-beefy + bump: none +- name: pallet-beefy-mmr + bump: none +- name: pallet-root-offences + bump: none +- name: polkadot-parachain-bin + bump: none \ No newline at end of file diff --git a/substrate/bin/node/cli/tests/res/default_genesis_config.json b/substrate/bin/node/cli/tests/res/default_genesis_config.json index b63e5ff549ef9d0a5742e26fe03a6167821cc97e..a2e52837d88222b18c42996bd13d400c97d4e920 100644 --- a/substrate/bin/node/cli/tests/res/default_genesis_config.json +++ b/substrate/bin/node/cli/tests/res/default_genesis_config.json @@ -34,7 +34,9 @@ "maxNominatorCount": null }, "session": { - "keys": [] + "keys": [], + "nonAuthorityKeys": [] + }, "democracy": {}, "council": { diff --git a/substrate/bin/node/testing/src/genesis.rs b/substrate/bin/node/testing/src/genesis.rs index c79612d68444c8bd64ad18c3b0a74ceed176eff8..7f5364744c667f711a5e2c32e20636e904ee02c2 100644 --- a/substrate/bin/node/testing/src/genesis.rs +++ b/substrate/bin/node/testing/src/genesis.rs @@ -54,6 +54,7 @@ pub fn config_endowed(extra_endowed: Vec<AccountId>) -> RuntimeGenesisConfig { (bob(), eve(), session_keys_from_seed(Ed25519Keyring::Bob.into())), (charlie(), ferdie(), session_keys_from_seed(Ed25519Keyring::Charlie.into())), ], + ..Default::default() }, staking: StakingConfig { stakers: vec![ diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index e193a2e3b645446906b7c7b328faafaa59c382b8..912cb3e27cd5bdf7e31adf33bf4d5e117d00682d 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -319,7 +319,7 @@ pub fn new_test_ext_raw_authorities(authorities: Vec<AuthorityId>) -> sp_io::Tes // NOTE: this will initialize the babe authorities // through OneSessionHandler::on_genesis_session - pallet_session::GenesisConfig::<Test> { keys: session_keys } + pallet_session::GenesisConfig::<Test> { keys: session_keys, ..Default::default() } .assimilate_storage(&mut t) .unwrap(); diff --git a/substrate/frame/beefy-mmr/src/mock.rs b/substrate/frame/beefy-mmr/src/mock.rs index 3adef4f32bf43a1aca43d39483303d35ee916ff6..1102f9677aaa4504c0432fd94338476dd6f5eaee 100644 --- a/substrate/frame/beefy-mmr/src/mock.rs +++ b/substrate/frame/beefy-mmr/src/mock.rs @@ -187,7 +187,7 @@ pub fn new_test_ext_raw_authorities(authorities: Vec<(u64, BeefyId)>) -> TestExt } }); - pallet_session::GenesisConfig::<Test> { keys: session_keys } + pallet_session::GenesisConfig::<Test> { keys: session_keys, ..Default::default() } .assimilate_storage(&mut t) .unwrap(); diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs index a0880660d0515279e0b69c8773dfb84b6ef73b3c..b423fa0bda89ffc3dc4f4cf1a0fa716851c012bd 100644 --- a/substrate/frame/beefy/src/mock.rs +++ b/substrate/frame/beefy/src/mock.rs @@ -269,7 +269,7 @@ impl ExtBuilder { } }); - pallet_session::GenesisConfig::<Test> { keys: session_keys } + pallet_session::GenesisConfig::<Test> { keys: session_keys, ..Default::default() } .assimilate_storage(&mut t) .unwrap(); diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs index 5c64f2a0bc20ff2226e0503fffe995a6ae8d97c0..d148c05e4d0d04365b03165b08f065a71c7dde53 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs @@ -573,6 +573,7 @@ impl ExtBuilder { .into_iter() .map(|(id, ..)| (id, id, SessionKeys { other: (id as u64).into() })) .collect(), + ..Default::default() } .assimilate_storage(&mut storage); diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs index 5ba7da7f9fda2a6e0d30f1b04b7aac1e808c55cb..ae230a0209a7d1ec5341fd200f766dc64e36da05 100644 --- a/substrate/frame/grandpa/src/mock.rs +++ b/substrate/frame/grandpa/src/mock.rs @@ -235,7 +235,7 @@ pub fn new_test_ext_raw_authorities(authorities: AuthorityList) -> sp_io::TestEx // NOTE: this will initialize the grandpa authorities // through OneSessionHandler::on_genesis_session - pallet_session::GenesisConfig::<Test> { keys: session_keys } + pallet_session::GenesisConfig::<Test> { keys: session_keys, ..Default::default() } .assimilate_storage(&mut t) .unwrap(); diff --git a/substrate/frame/root-offences/src/mock.rs b/substrate/frame/root-offences/src/mock.rs index ab43b723e8a9b86d8720d181eb29f01346f3d169..af073d7672cf4b62915dc98fbab069534f49905f 100644 --- a/substrate/frame/root-offences/src/mock.rs +++ b/substrate/frame/root-offences/src/mock.rs @@ -246,6 +246,7 @@ impl ExtBuilder { .into_iter() .map(|(id, ..)| (id, id, SessionKeys { other: id.into() })) .collect(), + ..Default::default() } .assimilate_storage(&mut storage); diff --git a/substrate/frame/session/src/historical/mod.rs b/substrate/frame/session/src/historical/mod.rs index fac580b49b3ab6c388e116af07fef1309dd8929e..a19364d577f6d10172341208267a75d4adaf4b3d 100644 --- a/substrate/frame/session/src/historical/mod.rs +++ b/substrate/frame/session/src/historical/mod.rs @@ -396,7 +396,7 @@ pub(crate) mod tests { frame_system::Pallet::<Test>::inc_providers(k); } }); - pallet_session::GenesisConfig::<Test> { keys } + pallet_session::GenesisConfig::<Test> { keys, ..Default::default() } .assimilate_storage(&mut t) .unwrap(); sp_io::TestExternalities::new(t) diff --git a/substrate/frame/session/src/historical/offchain.rs b/substrate/frame/session/src/historical/offchain.rs index 685a0be8e191edda97110f9f257b7fba170be5fe..e9ced89a8f1908a2b07002c5afae400ddd2f1b0e 100644 --- a/substrate/frame/session/src/historical/offchain.rs +++ b/substrate/frame/session/src/historical/offchain.rs @@ -171,7 +171,9 @@ mod tests { } }); - crate::GenesisConfig::<Test> { keys }.assimilate_storage(&mut t).unwrap(); + crate::GenesisConfig::<Test> { keys, ..Default::default() } + .assimilate_storage(&mut t) + .unwrap(); let mut ext = sp_io::TestExternalities::new(t); diff --git a/substrate/frame/session/src/lib.rs b/substrate/frame/session/src/lib.rs index e1a2a31911feb1a7765ae4ea034d47feaebefeee..325758d54dd89d939cc229d9bef04ce2cc339169 100644 --- a/substrate/frame/session/src/lib.rs +++ b/substrate/frame/session/src/lib.rs @@ -423,7 +423,14 @@ pub mod pallet { #[pallet::genesis_config] #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig<T: Config> { + /// Initial list of validator at genesis representing by their `(AccountId, ValidatorId, + /// Keys)`. These keys will be considered authorities for the first two sessions and they + /// will be valid at least until session 2 pub keys: Vec<(T::AccountId, T::ValidatorId, T::Keys)>, + /// List of (AccountId, ValidatorId, Keys) that will be registered at genesis, but not as + /// active validators. These keys are set, together with `keys`, as authority candidates + /// for future sessions (enactable from session 2 onwards) + pub non_authority_keys: Vec<(T::AccountId, T::ValidatorId, T::Keys)>, } #[pallet::genesis_build] @@ -446,7 +453,9 @@ pub mod pallet { } }); - for (account, val, keys) in self.keys.iter().cloned() { + for (account, val, keys) in + self.keys.iter().chain(self.non_authority_keys.iter()).cloned() + { Pallet::<T>::inner_set_keys(&val, keys) .expect("genesis config must not contain duplicates; qed"); if frame_system::Pallet::<T>::inc_consumers_without_limit(&account).is_err() { @@ -676,7 +685,7 @@ impl<T: Config> Pallet<T> { let mut now_session_keys = session_keys.iter(); let mut check_next_changed = |keys: &T::Keys| { if changed { - return + return; } // since a new validator set always leads to `changed` starting // as true, we can ensure that `now_session_keys` and `next_validators` diff --git a/substrate/frame/session/src/mock.rs b/substrate/frame/session/src/mock.rs index 25b81668cc084cbc226b283a60ec9b3184e9cc34..745b57d1be41fa13c65c1494d26f2b685666270c 100644 --- a/substrate/frame/session/src/mock.rs +++ b/substrate/frame/session/src/mock.rs @@ -215,7 +215,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { // An additional identity that we use. frame_system::Pallet::<Test>::inc_providers(&69); }); - pallet_session::GenesisConfig::<Test> { keys } + pallet_session::GenesisConfig::<Test> { keys, ..Default::default() } .assimilate_storage(&mut t) .unwrap(); diff --git a/substrate/frame/staking/src/mock.rs b/substrate/frame/staking/src/mock.rs index 7e6a87955b08371dddbecc6e17477ed5808173ef..7cc8e865916d0ff8bcfdcaa88181fd1a983cee43 100644 --- a/substrate/frame/staking/src/mock.rs +++ b/substrate/frame/staking/src/mock.rs @@ -535,6 +535,7 @@ impl ExtBuilder { .map(|id| (id, id, SessionKeys { other: id.into() })) .collect() }, + ..Default::default() } .assimilate_storage(&mut storage);