parity-zcash/pzec/config.rs

203 lines
6.4 KiB
Rust
Raw Normal View History

use std::net;
2016-10-02 18:01:46 -07:00
use clap;
use storage;
2019-01-15 01:16:27 -08:00
use keys::Address;
2017-08-09 06:26:21 -07:00
use message::Services;
2018-11-13 04:21:56 -08:00
use network::{Network, ConsensusParams};
use p2p::InternetProtocol;
2018-11-14 00:02:34 -08:00
use seednodes::{zcash_seednodes, zcash_testnet_seednodes};
use rpc_apis::ApiSet;
use {USER_AGENT, REGTEST_USER_AGENT};
use primitives::hash::H256;
2016-12-07 05:14:52 -08:00
use rpc::HttpConfiguration as RpcHttpConfig;
use verification::VerificationLevel;
use sync::VerificationParameters;
use util::open_db;
2016-10-02 18:01:46 -07:00
pub struct Config {
2017-11-01 02:30:15 -07:00
pub network: Network,
pub consensus: ConsensusParams,
2017-08-09 06:26:21 -07:00
pub services: Services,
2016-10-02 18:01:46 -07:00
pub port: u16,
pub connect: Option<net::SocketAddr>,
pub host: net::IpAddr,
2016-11-30 05:37:17 -08:00
pub seednodes: Vec<String>,
2017-08-29 06:36:26 -07:00
pub quiet: bool,
pub inbound_connections: u32,
pub outbound_connections: u32,
pub p2p_threads: usize,
2016-11-21 00:52:27 -08:00
pub db_cache: usize,
2016-11-24 22:58:04 -08:00
pub data_dir: Option<String>,
pub user_agent: String,
pub internet_protocol: InternetProtocol,
2016-12-07 05:14:52 -08:00
pub rpc_config: RpcHttpConfig,
2017-01-10 00:58:55 -08:00
pub block_notify_command: Option<String>,
pub verification_params: VerificationParameters,
pub db: storage::SharedStore,
2019-01-15 01:16:27 -08:00
pub miner_address: Option<Address>,
2016-10-02 18:01:46 -07:00
}
2016-11-21 00:52:27 -08:00
pub const DEFAULT_DB_CACHE: usize = 512;
pub fn parse(matches: &clap::ArgMatches) -> Result<Config, String> {
let db_cache = match matches.value_of("db-cache") {
Some(s) => s.parse().map_err(|_| "Invalid cache size - should be number in MB".to_owned())?,
None => DEFAULT_DB_CACHE,
};
let data_dir = match matches.value_of("data-dir") {
Some(s) => Some(s.parse().map_err(|_| "Invalid data-dir".to_owned())?),
None => None,
};
let db = open_db(&data_dir, db_cache);
2017-08-29 06:36:26 -07:00
let quiet = matches.is_present("quiet");
2017-11-01 02:30:15 -07:00
let network = match (matches.is_present("testnet"), matches.is_present("regtest")) {
(true, false) => Network::Testnet,
(false, true) => Network::Regtest,
(false, false) => Network::Mainnet,
2016-11-05 07:32:57 -07:00
(true, true) => return Err("Only one testnet option can be used".into()),
2016-10-02 18:01:46 -07:00
};
2018-11-13 04:21:56 -08:00
let consensus = ConsensusParams::new(network);
2017-11-01 02:30:15 -07:00
let (in_connections, out_connections) = match network {
Network::Testnet | Network::Mainnet | Network::Other(_) => (10, 10),
Network::Regtest | Network::Unitest => (1, 0),
};
2017-11-01 02:30:15 -07:00
let p2p_threads = match network {
Network::Testnet | Network::Mainnet | Network::Other(_) => 4,
Network::Regtest | Network::Unitest => 1,
};
// to skip idiotic 30 seconds delay in test-scripts
2018-11-13 04:21:56 -08:00
let user_agent_suffix = "";
2017-11-01 02:30:15 -07:00
let user_agent = match network {
Network::Testnet | Network::Mainnet | Network::Unitest | Network::Other(_) => format!("{}{}", USER_AGENT, user_agent_suffix),
Network::Regtest => REGTEST_USER_AGENT.into(),
};
2016-10-02 18:01:46 -07:00
let port = match matches.value_of("port") {
Some(port) => port.parse().map_err(|_| "Invalid port".to_owned())?,
2018-11-13 04:21:56 -08:00
None => network.port(),
};
let connect = match matches.value_of("connect") {
Some(s) => Some(match s.parse::<net::SocketAddr>() {
Err(_) => s.parse::<net::IpAddr>()
2018-11-13 04:21:56 -08:00
.map(|ip| net::SocketAddr::new(ip, network.port()))
.map_err(|_| "Invalid connect".to_owned()),
Ok(a) => Ok(a),
}?),
None => None,
};
2017-12-26 22:52:57 -08:00
let seednodes: Vec<String> = match matches.value_of("seednode") {
Some(s) => vec![s.parse().map_err(|_| "Invalid seednode".to_owned())?],
2018-11-13 04:21:56 -08:00
None => match network {
Network::Mainnet => zcash_seednodes().into_iter().map(Into::into).collect(),
2018-11-14 00:02:34 -08:00
Network::Testnet => zcash_testnet_seednodes().into_iter().map(Into::into).collect(),
Network::Other(_) | Network::Regtest | Network::Unitest => Vec::new(),
2016-11-30 05:37:17 -08:00
},
2016-10-02 18:01:46 -07:00
};
let only_net = match matches.value_of("only-net") {
Some(s) => s.parse()?,
None => InternetProtocol::default(),
};
let host = match matches.value_of("host") {
Some(s) => s.parse::<net::IpAddr>().map_err(|_| "Invalid host".to_owned())?,
None => match only_net {
InternetProtocol::IpV6 => "::".parse().unwrap(),
_ => "0.0.0.0".parse().unwrap(),
}
};
2017-11-01 02:30:15 -07:00
let rpc_config = parse_rpc_config(network, matches)?;
2016-12-07 05:14:52 -08:00
2017-01-10 00:58:55 -08:00
let block_notify_command = match matches.value_of("blocknotify") {
2019-02-02 14:35:00 -08:00
Some(s) => Some(s.parse().map_err(|_| "Invalid blocknotify command".to_owned())?),
2017-01-10 00:58:55 -08:00
None => None,
};
2017-08-09 06:26:21 -07:00
let services = Services::default().with_network(true);
let verification_level = match matches.value_of("verification-level") {
Some(s) if s == "full" => VerificationLevel::Full,
Some(s) if s == "header" => VerificationLevel::Header,
Some(s) if s == "none" => VerificationLevel::NoVerification,
Some(s) => return Err(format!("Invalid verification level: {}", s)),
None => VerificationLevel::Full,
};
let verification_edge = match matches.value_of("verification-edge") {
Some(s) if verification_level != VerificationLevel::Full => {
let edge: H256 = s.parse().map_err(|_| "Invalid verification edge".to_owned())?;
edge.reversed()
},
2018-11-13 04:21:56 -08:00
_ => network.default_verification_edge(),
2017-08-09 06:26:21 -07:00
};
2019-01-15 01:16:27 -08:00
let miner_address = match matches.value_of("miner-address") {
2019-02-02 14:35:00 -08:00
Some(s) => Some(s.parse().map_err(|_| "Invalid miner-address command".to_owned())?),
2019-01-15 01:16:27 -08:00
None => None,
};
2016-10-02 18:01:46 -07:00
let config = Config {
2017-08-29 06:36:26 -07:00
quiet: quiet,
2017-11-01 02:30:15 -07:00
network: network,
consensus: consensus,
2017-08-09 06:26:21 -07:00
services: services,
2016-10-02 18:01:46 -07:00
port: port,
connect: connect,
host: host,
2016-11-30 05:37:17 -08:00
seednodes: seednodes,
inbound_connections: in_connections,
outbound_connections: out_connections,
p2p_threads: p2p_threads,
2016-11-21 00:52:27 -08:00
db_cache: db_cache,
2016-11-24 22:58:04 -08:00
data_dir: data_dir,
user_agent: user_agent,
internet_protocol: only_net,
2016-12-07 05:14:52 -08:00
rpc_config: rpc_config,
2017-01-10 00:58:55 -08:00
block_notify_command: block_notify_command,
verification_params: VerificationParameters {
verification_level: verification_level,
verification_edge: verification_edge,
},
db: db,
2019-01-15 01:16:27 -08:00
miner_address: miner_address,
2016-10-02 18:01:46 -07:00
};
Ok(config)
}
2016-12-07 05:14:52 -08:00
2017-11-01 02:30:15 -07:00
fn parse_rpc_config(network: Network, matches: &clap::ArgMatches) -> Result<RpcHttpConfig, String> {
let mut config = RpcHttpConfig::with_port(network.rpc_port());
2016-12-07 05:14:52 -08:00
config.enabled = !matches.is_present("no-jsonrpc");
if !config.enabled {
return Ok(config);
}
if let Some(apis) = matches.value_of("jsonrpc-apis") {
config.apis = ApiSet::List(vec![apis.parse().map_err(|_| "Invalid APIs".to_owned())?].into_iter().collect());
}
2016-12-07 05:14:52 -08:00
if let Some(port) = matches.value_of("jsonrpc-port") {
config.port = port.parse().map_err(|_| "Invalid JSON RPC port".to_owned())?;
2016-12-07 05:14:52 -08:00
}
if let Some(interface) = matches.value_of("jsonrpc-interface") {
config.interface = interface.to_owned();
}
if let Some(cors) = matches.value_of("jsonrpc-cors") {
config.cors = Some(vec![cors.parse().map_err(|_| "Invalid JSON RPC CORS".to_owned())?]);
}
if let Some(hosts) = matches.value_of("jsonrpc-hosts") {
config.hosts = Some(vec![hosts.parse().map_err(|_| "Invalid JSON RPC hosts".to_owned())?]);
}
2016-12-07 05:14:52 -08:00
Ok(config)
}