diff --git a/substrate/core/service/src/chain_spec.rs b/substrate/core/service/src/chain_spec.rs index f92918355c..cfaf1de894 100644 --- a/substrate/core/service/src/chain_spec.rs +++ b/substrate/core/service/src/chain_spec.rs @@ -76,6 +76,7 @@ struct ChainSpecFile { pub id: String, pub boot_nodes: Vec, pub telemetry_url: Option, + pub protocol_id: Option, } /// A configuration of a chain. Can be used to build a genesis block. @@ -101,6 +102,10 @@ impl ChainSpec { self.spec.telemetry_url.as_ref().map(String::as_str) } + pub fn protocol_id(&self) -> Option<&str> { + self.spec.protocol_id.as_ref().map(String::as_str) + } + /// Parse json content into a `ChainSpec` pub fn from_embedded(json: &'static [u8]) -> Result { let spec = json::from_slice(json).map_err(|e| format!("Error parsing spec file: {}", e))?; @@ -126,7 +131,8 @@ impl ChainSpec { id: &str, constructor: fn() -> G, boot_nodes: Vec, - telemetry_url: Option<&str> + telemetry_url: Option<&str>, + protocol_id: Option<&str>, ) -> Self { let spec = ChainSpecFile { @@ -134,6 +140,7 @@ impl ChainSpec { id: id.to_owned(), boot_nodes: boot_nodes, telemetry_url: telemetry_url.map(str::to_owned), + protocol_id: protocol_id.map(str::to_owned), }; ChainSpec { spec, diff --git a/substrate/core/service/src/components.rs b/substrate/core/service/src/components.rs index eb1134074d..f9957e4531 100644 --- a/substrate/core/service/src/components.rs +++ b/substrate/core/service/src/components.rs @@ -131,9 +131,6 @@ pub trait ServiceFactory: 'static { /// Other configuration for service members. type Configuration: Default; - /// Network protocol id. - const NETWORK_PROTOCOL_ID: network::ProtocolId; - //TODO: replace these with a constructor trait. that TransactionPool implements. /// Extrinsic pool constructor for the full client. fn build_full_transaction_pool(config: TransactionPoolOptions, client: Arc>) diff --git a/substrate/core/service/src/lib.rs b/substrate/core/service/src/lib.rs index 7ae45b788e..5a5051b73e 100644 --- a/substrate/core/service/src/lib.rs +++ b/substrate/core/service/src/lib.rs @@ -84,6 +84,8 @@ pub use components::{ServiceFactory, FullBackend, FullExecutor, LightBackend, ComponentExHash, ComponentExtrinsic, }; +const DEFAULT_PROTOCOL_ID: &'static str = "sup"; + /// Substrate service. pub struct Service { client: Arc>, @@ -171,7 +173,15 @@ impl Service specialization: network_protocol, }; - let network = network::Service::new(network_params, Components::Factory::NETWORK_PROTOCOL_ID)?; + let mut protocol_id = network::ProtocolId::default(); + let protocol_id_full = config.chain_spec.protocol_id().unwrap_or(DEFAULT_PROTOCOL_ID).as_bytes(); + if protocol_id_full.len() > protocol_id.len() { + warn!("Protocol ID truncated to {} chars", protocol_id.len()); + } + let id_len = protocol_id_full.len().min(protocol_id.len()); + &mut protocol_id[0..id_len].copy_from_slice(&protocol_id_full[0..id_len]); + + let network = network::Service::new(network_params, protocol_id)?; on_demand.map(|on_demand| on_demand.set_service_link(Arc::downgrade(&network))); { diff --git a/substrate/node/network/src/lib.rs b/substrate/node/network/src/lib.rs index 9a931ef131..4dad6e3f78 100644 --- a/substrate/node/network/src/lib.rs +++ b/substrate/node/network/src/lib.rs @@ -43,9 +43,6 @@ use substrate_network::{message, generic_message}; use substrate_network::specialization::Specialization; use substrate_network::StatusMessage as GenericFullStatus; -/// Demo protocol id. -pub const PROTOCOL_ID: ::substrate_network::ProtocolId = *b"dot"; - type FullStatus = GenericFullStatus; /// Specialization of the network service for the node protocol. diff --git a/substrate/node/service/src/chain_spec.rs b/substrate/node/service/src/chain_spec.rs index f0806c0d3e..82c68d537f 100644 --- a/substrate/node/service/src/chain_spec.rs +++ b/substrate/node/service/src/chain_spec.rs @@ -120,6 +120,7 @@ pub fn staging_testnet_config() -> ChainSpec { staging_testnet_config_genesis, boot_nodes, Some(STAGING_TELEMETRY_URL.into()), + None, ) } @@ -214,7 +215,7 @@ fn development_config_genesis() -> GenesisConfig { /// Development config (single validator Alice) pub fn development_config() -> ChainSpec { - ChainSpec::from_genesis("Development", "development", development_config_genesis, vec![], None) + ChainSpec::from_genesis("Development", "development", development_config_genesis, vec![], None, None) } fn local_testnet_genesis() -> GenesisConfig { @@ -226,5 +227,5 @@ fn local_testnet_genesis() -> GenesisConfig { /// Local testnet config (multivalidator Alice + Bob) pub fn local_testnet_config() -> ChainSpec { - ChainSpec::from_genesis("Local Testnet", "local_testnet", local_testnet_genesis, vec![], None) + ChainSpec::from_genesis("Local Testnet", "local_testnet", local_testnet_genesis, vec![], None, None) } diff --git a/substrate/node/service/src/lib.rs b/substrate/node/service/src/lib.rs index ee9ebf7c94..f5b727cff6 100644 --- a/substrate/node/service/src/lib.rs +++ b/substrate/node/service/src/lib.rs @@ -102,8 +102,6 @@ impl service::ServiceFactory for Factory { type Genesis = GenesisConfig; type Configuration = CustomConfiguration; - const NETWORK_PROTOCOL_ID: network::ProtocolId = ::node_network::PROTOCOL_ID; - fn build_full_transaction_pool(config: TransactionPoolOptions, client: Arc>) -> Result>, Error> {