diff --git a/runtime/src/parachains.rs b/runtime/src/parachains.rs index c2dde02d9f33..ac4c0df6720a 100644 --- a/runtime/src/parachains.rs +++ b/runtime/src/parachains.rs @@ -155,7 +155,7 @@ const WATERMARK_QUEUE_SIZE: usize = 20000; decl_storage! { trait Store for Module as Parachains { /// All authorities' keys at the moment. - pub Authorities get(authorities) config(authorities): Vec; + pub Authorities get(authorities): Vec; /// The parachains registered at present. pub Code get(parachain_code): map ParaId => Option>; /// The heads of the parachains registered at present. @@ -187,6 +187,10 @@ decl_storage! { /// None if not yet updated. pub DidUpdate: Option>; } + add_extra_genesis { + config(authorities): Vec; + build(|config| Module::::initialize_authorities(&config.authorities)) + } } decl_module! { @@ -814,6 +818,13 @@ impl Module { }) } + fn initialize_authorities(authorities: &[ValidatorId]) { + if !authorities.is_empty() { + assert!(Authorities::get().is_empty(), "Authorities are already initialized!"); + Authorities::put(authorities); + } + } + /* // TODO: Consider integrating if needed. (https://github.com/paritytech/polkadot/issues/223) /// Extract the parachain heads from the block. @@ -837,14 +848,14 @@ impl session::OneSessionHandler for Module { fn on_genesis_session<'a, I: 'a>(validators: I) where I: Iterator { - ::Authorities::put(&validators.map(|(_, key)| key).collect::>()) + Self::initialize_authorities(&validators.map(|(_, key)| key).collect::>()); } fn on_new_session<'a, I: 'a>(changed: bool, validators: I, _queued: I) where I: Iterator { if changed { - Self::on_genesis_session(validators) + ::Authorities::put(validators.map(|(_, key)| key).collect::>()); } } @@ -1139,7 +1150,7 @@ mod tests { GenesisConfig { authorities: authorities.clone(), - }.assimilate_storage(&mut t).unwrap(); + }.assimilate_storage::(&mut t).unwrap(); registrar::GenesisConfig:: { parachains, diff --git a/runtime/src/registrar.rs b/runtime/src/registrar.rs index dace68bf028c..47cdf1243a75 100644 --- a/runtime/src/registrar.rs +++ b/runtime/src/registrar.rs @@ -772,7 +772,7 @@ mod tests { parachains::GenesisConfig { authorities: authorities.clone(), - }.assimilate_storage(&mut t).unwrap(); + }.assimilate_storage::(&mut t).unwrap(); GenesisConfig:: { parachains, diff --git a/service/src/lib.rs b/service/src/lib.rs index b9022b885669..41e0a6d074f0 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -141,8 +141,8 @@ pub fn new_full(config: Configuration) { use substrate_network::DhtEvent; - let is_authority = config.roles.is_authority(); let is_collator = config.custom.collating_for.is_some(); + let is_authority = config.roles.is_authority() && !is_collator; let force_authoring = config.force_authoring; let max_block_data_size = config.custom.max_block_data_size; let db_path = config.database_path.clone(); @@ -169,13 +169,6 @@ pub fn new_full(config: Configuration) let (block_import, link_half, babe_link) = import_setup.take() .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); - if is_collator { - info!( - "The node cannot start as an authority because it is also configured to run as a collator." - ); - return Ok(service); - } - let client = service.client(); let known_oracle = client.clone(); let select_chain = if let Some(select_chain) = service.select_chain() {