diff --git a/parity/configuration.rs b/parity/configuration.rs index 908dcb954..5b14660a9 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -32,7 +32,7 @@ use ethcore_rpc::NetworkSettings; use cache::CacheConfig; use helpers::{to_duration, to_mode, to_block_id, to_u256, to_pending_set, to_price, replace_home, geth_ipc_path, parity_ipc_path, to_bootnodes, to_addresses, to_address}; -use params::{ResealPolicy, AccountsConfig, GasPricerConfig, MinerExtras}; +use params::{ResealPolicy, AccountsConfig, GasPricerConfig, MinerExtras, SpecType}; use ethcore_logger::Config as LogConfig; use dir::Directories; use dapps::Configuration as DappsConfiguration; @@ -440,13 +440,23 @@ impl Configuration { ret.min_peers = self.min_peers(); let mut net_path = PathBuf::from(self.directories().db); net_path.push("network"); + let net_specific_path = net_path.join(&try!(self.network_specific_path())); ret.config_path = Some(net_path.to_str().unwrap().to_owned()); + ret.net_config_path = Some(net_specific_path.to_str().unwrap().to_owned()); ret.reserved_nodes = try!(self.init_reserved_nodes()); - ret.allow_non_reserved = !self.args.flag_reserved_only; Ok(ret) } + fn network_specific_path(&self) -> Result { + let spec_type : SpecType = try!(self.chain().parse()); + let spec = try!(spec_type.spec()); + let id = try!(self.network_id()); + let mut path = PathBuf::new(); + path.push(format!("{}", id.unwrap_or_else(|| spec.network_id()))); + Ok(path) + } + fn network_id(&self) -> Result, String> { let net_id = self.args.flag_network_id.as_ref().or(self.args.flag_networkid.as_ref()); match net_id { diff --git a/parity/helpers.rs b/parity/helpers.rs index d0688d3de..778dc1265 100644 --- a/parity/helpers.rs +++ b/parity/helpers.rs @@ -172,6 +172,7 @@ pub fn default_network_config() -> ::ethsync::NetworkConfiguration { use ethsync::NetworkConfiguration; NetworkConfiguration { config_path: Some(replace_home("$HOME/.parity/network")), + net_config_path: Some(replace_home("$HOME/.parity/network/1")), listen_address: Some("0.0.0.0:30303".into()), public_address: None, udp_port: None, diff --git a/sync/src/api.rs b/sync/src/api.rs index 608d9d521..f98387abd 100644 --- a/sync/src/api.rs +++ b/sync/src/api.rs @@ -215,8 +215,10 @@ impl ManageNetwork for EthSync { #[derive(Binary, Debug, Clone, PartialEq, Eq)] /// Network service configuration pub struct NetworkConfiguration { - /// Directory path to store network configuration. None means nothing will be saved + /// Directory path to store general network configuration. None means nothing will be saved pub config_path: Option, + /// Directory path to store network-specific configuration. None means nothing will be saved + pub net_config_path: Option, /// IP address to listen for incoming connections. Listen to all connections by default pub listen_address: Option, /// IP address to advertise. Detected automatically if none. @@ -264,6 +266,7 @@ impl NetworkConfiguration { Ok(BasicNetworkConfiguration { config_path: self.config_path, + net_config_path: self.net_config_path, listen_address: match self.listen_address { None => None, Some(addr) => Some(try!(SocketAddr::from_str(&addr))) }, public_address: match self.public_address { None => None, Some(addr) => Some(try!(SocketAddr::from_str(&addr))) }, udp_port: self.udp_port, @@ -283,6 +286,7 @@ impl From for NetworkConfiguration { fn from(other: BasicNetworkConfiguration) -> Self { NetworkConfiguration { config_path: other.config_path, + net_config_path: other.net_config_path, listen_address: other.listen_address.and_then(|addr| Some(format!("{}", addr))), public_address: other.public_address.and_then(|addr| Some(format!("{}", addr))), udp_port: other.udp_port, diff --git a/util/network/src/host.rs b/util/network/src/host.rs index 5951288f0..a414ade40 100644 --- a/util/network/src/host.rs +++ b/util/network/src/host.rs @@ -53,8 +53,10 @@ const MAINTENANCE_TIMEOUT: u64 = 1000; #[derive(Debug, PartialEq, Clone)] /// Network service configuration pub struct NetworkConfiguration { - /// Directory path to store network configuration. None means nothing will be saved + /// Directory path to store general network configuration. None means nothing will be saved pub config_path: Option, + /// Directory path to store network-specific configuration. None means nothing will be saved + pub net_config_path: Option, /// IP address to listen for incoming connections. Listen to all connections by default pub listen_address: Option, /// IP address to advertise. Detected automatically if none. @@ -90,6 +92,7 @@ impl NetworkConfiguration { pub fn new() -> Self { NetworkConfiguration { config_path: None, + net_config_path: None, listen_address: None, public_address: None, udp_port: None, @@ -367,7 +370,7 @@ impl Host { }, |s| KeyPair::from_secret(s).expect("Error creating node secret key")) }; - let path = config.config_path.clone(); + let path = config.net_config_path.clone(); // Setup the server socket let tcp_listener = try!(TcpListener::bind(&listen_address)); listen_address = SocketAddr::new(listen_address.ip(), try!(tcp_listener.local_addr()).port());