diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock index 334202f74a..7da679fe0f 100644 --- a/polkadot/Cargo.lock +++ b/polkadot/Cargo.lock @@ -5672,6 +5672,7 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", + "sp-state-machine", "sp-storage", "sp-transaction-pool", "sp-trie", diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 0cb3fdc670..67cdbe1beb 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -39,6 +39,7 @@ sp-session = { git = "https://github.com/paritytech/substrate", branch = "master sp-storage = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } # Substrate Pallets pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/polkadot/node/service/src/chain_spec.rs b/polkadot/node/service/src/chain_spec.rs index 90b690d4bd..67dece91f3 100644 --- a/polkadot/node/service/src/chain_spec.rs +++ b/polkadot/node/service/src/chain_spec.rs @@ -66,7 +66,32 @@ pub type KusamaChainSpec = service::GenericChainSpec; /// The `ChainSpec` parametrized for the rococo runtime. -pub type RococoChainSpec = service::GenericChainSpec; +pub type RococoChainSpec = service::GenericChainSpec; + +/// Extension for the Rococo genesis config to support a custom changes to the genesis state. +#[derive(serde::Serialize, serde::Deserialize)] +pub struct RococoGenesisExt { + /// The runtime genesis config. + runtime_genesis_config: rococo::GenesisConfig, + /// The session length in blocks. + /// + /// If `None` is supplied, the default value is used. + session_length_in_blocks: Option, +} + +impl sp_runtime::BuildStorage for RococoGenesisExt { + fn assimilate_storage( + &self, + storage: &mut sp_core::storage::Storage, + ) -> Result<(), String> { + sp_state_machine::BasicExternalities::execute_with_storage(storage, || { + if let Some(length) = self.session_length_in_blocks.as_ref() { + rococo::constants::time::EpochDurationInBlocks::set(length); + } + }); + self.runtime_genesis_config.assimilate_storage(storage) + } +} pub fn polkadot_config() -> Result { PolkadotChainSpec::from_json_bytes(&include_bytes!("../res/polkadot.json")[..]) @@ -925,7 +950,10 @@ pub fn rococo_staging_testnet_config() -> Result { "Rococo Staging Testnet", "rococo_staging_testnet", ChainType::Live, - move || rococo_staging_testnet_config_genesis(wasm_binary), + move || RococoGenesisExt { + runtime_genesis_config: rococo_staging_testnet_config_genesis(wasm_binary), + session_length_in_blocks: None, + }, boot_nodes, Some( TelemetryEndpoints::new(vec![(ROCOCO_STAGING_TELEMETRY_URL.to_string(), 0)]) @@ -1542,7 +1570,11 @@ pub fn rococo_local_testnet_config() -> Result { "Rococo Local Testnet", "rococo_local_testnet", ChainType::Local, - move || rococo_local_testnet_genesis(wasm_binary), + move || RococoGenesisExt { + runtime_genesis_config: rococo_local_testnet_genesis(wasm_binary), + // Use 1 minute session length. + session_length_in_blocks: Some(10), + }, vec![], None, Some(DEFAULT_PROTOCOL_ID), diff --git a/polkadot/runtime/rococo/src/constants.rs b/polkadot/runtime/rococo/src/constants.rs index a18cd34b28..d213acb778 100644 --- a/polkadot/runtime/rococo/src/constants.rs +++ b/polkadot/runtime/rococo/src/constants.rs @@ -33,7 +33,9 @@ pub mod time { use primitives::v0::{Moment, BlockNumber}; pub const MILLISECS_PER_BLOCK: Moment = 6000; pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; - pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS; + frame_support::parameter_types! { + pub storage EpochDurationInBlocks: BlockNumber = 1 * HOURS; + } // These time units are defined in number of blocks. pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 6093286555..89cb3e2e5f 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -328,13 +328,13 @@ parameter_types! { pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // quarter of the last session will be for election. - pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; + pub ElectionLookahead: BlockNumber = EpochDurationInBlocks::get() / 4; pub const MaxIterations: u32 = 10; pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); } parameter_types! { - pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; + pub SessionDuration: BlockNumber = EpochDurationInBlocks::get() as _; } parameter_types! { @@ -457,12 +457,11 @@ impl pallet_session::Config for Runtime { } parameter_types! { - pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64; pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } impl pallet_babe::Config for Runtime { - type EpochDuration = EpochDuration; + type EpochDuration = EpochDurationInBlocks; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger @@ -798,7 +797,7 @@ sp_api::impl_runtime_apis! { // babe_primitives::BabeGenesisConfiguration { slot_duration: Babe::slot_duration(), - epoch_length: EpochDuration::get(), + epoch_length: EpochDurationInBlocks::get().into(), c: PRIMARY_PROBABILITY, genesis_authorities: Babe::authorities(), randomness: Babe::randomness(),