diff --git a/parity/cli/config.full.toml b/parity/cli/config.full.toml index b0e91e56c..a98d62493 100644 --- a/parity/cli/config.full.toml +++ b/parity/cli/config.full.toml @@ -101,6 +101,7 @@ reseal_min_period = 4000 reseal_max_period = 60000 work_queue_size = 20 relay_set = "cheap" +min_gas_price = 0 usd_per_tx = "0.0025" usd_per_eth = "auto" price_update_period = "hourly" diff --git a/parity/cli/mod.rs b/parity/cli/mod.rs index fa3df6123..d637c20eb 100644 --- a/parity/cli/mod.rs +++ b/parity/cli/mod.rs @@ -16,6 +16,7 @@ #[macro_use] mod usage; +mod presets; use dir; usage! { @@ -266,6 +267,8 @@ usage! { or |c: &Config| otry!(c.mining).tx_time_limit.clone().map(Some), flag_relay_set: String = "cheap", or |c: &Config| otry!(c.mining).relay_set.clone(), + flag_min_gas_price: Option = None, + or |c: &Config| otry!(c.mining).min_gas_price.clone().map(Some), flag_usd_per_tx: String = "0.0025", or |c: &Config| otry!(c.mining).usd_per_tx.clone(), flag_usd_per_eth: String = "auto", @@ -548,6 +551,7 @@ struct Mining { tx_gas_limit: Option, tx_time_limit: Option, relay_set: Option, + min_gas_price: Option, usd_per_tx: Option, usd_per_eth: Option, price_update_period: Option, @@ -819,6 +823,7 @@ mod tests { flag_tx_gas_limit: Some("6283184".into()), flag_tx_time_limit: Some(100u64), flag_relay_set: "cheap".into(), + flag_min_gas_price: Some(0u64), flag_usd_per_tx: "0.0025".into(), flag_usd_per_eth: "auto".into(), flag_price_update_period: "hourly".into(), @@ -1051,6 +1056,7 @@ mod tests { reseal_max_period: Some(60000), work_queue_size: None, relay_set: None, + min_gas_price: None, usd_per_tx: None, usd_per_eth: None, price_update_period: Some("hourly".into()), diff --git a/parity/cli/presets/config.dev-insecure.toml b/parity/cli/presets/config.dev-insecure.toml new file mode 100644 index 000000000..3a9956f8e --- /dev/null +++ b/parity/cli/presets/config.dev-insecure.toml @@ -0,0 +1,16 @@ +[parity] +no_consensus = true +chain = "dev" + +[mining] +reseal_min_period = 0 +min_gas_price = 0 + +[rpc] +interface = "all" +apis = ["all"] +hosts = ["all"] + +[ipfs] +enable = false # this is the default +hosts = ["all"] \ No newline at end of file diff --git a/parity/cli/presets/config.dev.toml b/parity/cli/presets/config.dev.toml new file mode 100644 index 000000000..f38e17348 --- /dev/null +++ b/parity/cli/presets/config.dev.toml @@ -0,0 +1,6 @@ +[parity] +chain = "dev" + +[mining] +reseal_min_period = 0 +min_gas_price = 0 \ No newline at end of file diff --git a/parity/cli/presets/config.insecure.toml b/parity/cli/presets/config.insecure.toml new file mode 100644 index 000000000..6e67db3d7 --- /dev/null +++ b/parity/cli/presets/config.insecure.toml @@ -0,0 +1,11 @@ +[parity] +no_consensus = true + +[rpc] +interface = "all" +apis = ["all"] +hosts = ["all"] + +[ipfs] +enable = false # this is the default +hosts = ["all"] \ No newline at end of file diff --git a/parity/cli/presets/config.mining.toml b/parity/cli/presets/config.mining.toml new file mode 100644 index 000000000..52e004942 --- /dev/null +++ b/parity/cli/presets/config.mining.toml @@ -0,0 +1,31 @@ +[network] +# Parity will try to maintain connection to at least 50 peers. +min_peers = 50 +# Parity will maintain at most 100 peers. +max_peers = 100 + +[ipc] +# You won't be able to use IPC to interact with Parity. +disable = true + +[dapps] +# You won't be able to access any web Dapps. +disable = true + +[mining] +# Prepare a block to seal even when there are no miners connected. +force_sealing = true +# New pending block will be created for all transactions (both local and external). +reseal_on_txs = "all" +# New pending block will be created only once per 4000 milliseconds. +reseal_min_period = 4000 +# Parity will keep/relay at most 2048 transactions in queue. +tx_queue_size = 2048 + +[footprint] +# If defined will never use more then 256MB for all caches. (Overrides other cache settings). +cache_size = 256 + +[misc] +# Logging pattern (`=`, e.g. `own_tx=trace`). +logging = "miner=trace,own_tx=trace" \ No newline at end of file diff --git a/parity/cli/presets/config.non-standard-ports.toml b/parity/cli/presets/config.non-standard-ports.toml new file mode 100644 index 000000000..e4013ff94 --- /dev/null +++ b/parity/cli/presets/config.non-standard-ports.toml @@ -0,0 +1,7 @@ +[network] +# Parity will listen for connections on port 30305. +port = 30305 + +[rpc] +# JSON-RPC over HTTP will be accessible on port 8645. +port = 8645 \ No newline at end of file diff --git a/parity/cli/presets/mod.rs b/parity/cli/presets/mod.rs new file mode 100644 index 000000000..ca1ad4559 --- /dev/null +++ b/parity/cli/presets/mod.rs @@ -0,0 +1,28 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::io::{Error, ErrorKind}; + +pub fn preset_config_string(arg: &str) -> Result<&'static str, Error> { + match arg.to_lowercase().as_ref() { + "dev" => Ok(include_str!("./config.dev.toml")), + "mining" => Ok(include_str!("./config.mining.toml")), + "non-standard-ports" => Ok(include_str!("./config.non-standard-ports.toml")), + "insecure" => Ok(include_str!("./config.insecure.toml")), + "dev-insecure" => Ok(include_str!("./config.dev-insecure.toml")), + _ => Err(Error::new(ErrorKind::InvalidInput, "Config doesn't match any presets [dev, mining, non-standard-ports, insecure, dev-insecure]")) + } +} \ No newline at end of file diff --git a/parity/cli/usage.rs b/parity/cli/usage.rs index 26f697ed8..182efca92 100644 --- a/parity/cli/usage.rs +++ b/parity/cli/usage.rs @@ -151,23 +151,24 @@ macro_rules! usage { let config_file = raw_args.flag_config.clone().unwrap_or_else(|| raw_args.clone().into_args(Config::default()).flag_config); let config_file = replace_home(&::dir::default_data_path(), &config_file); - let config = match (fs::File::open(&config_file), raw_args.flag_config.is_some()) { + match (fs::File::open(&config_file), raw_args.flag_config.clone()) { // Load config file (Ok(mut file), _) => { println_stderr!("Loading config file from {}", &config_file); let mut config = String::new(); file.read_to_string(&mut config).map_err(|e| ArgsError::Config(config_file, e))?; - Self::parse_config(&config)? + Ok(raw_args.into_args(Self::parse_config(&config)?)) }, // Don't display error in case default config cannot be loaded. - (Err(_), false) => Config::default(), + (Err(_), None) => Ok(raw_args.into_args(Config::default())), // Config set from CLI (fail with error) - (Err(e), true) => { - return Err(ArgsError::Config(config_file, e)); + (Err(_), Some(ref config_arg)) => { + match presets::preset_config_string(config_arg) { + Ok(s) => Ok(raw_args.into_args(Self::parse_config(&s)?)), + Err(e) => Err(ArgsError::Config(config_file, e)) + } }, - }; - - Ok(raw_args.into_args(config)) + } } #[cfg(test)] diff --git a/parity/cli/usage.txt b/parity/cli/usage.txt index 1bfb8c499..1c9e1e22c 100644 --- a/parity/cli/usage.txt +++ b/parity/cli/usage.txt @@ -77,8 +77,10 @@ Operating Options: subcommands (default: {flag_light}). Convenience Options: - -c --config CONFIG Specify a filename containing a configuration file. - (default: {flag_config}) +-c --config CONFIG Specify a configuration. CONFIG may be either a + configuration file or a preset: dev, insecure, dev-insecure, + mining, or non-standard-ports. + (default: {flag_config}). --ports-shift SHIFT Add SHIFT to all port numbers Parity is listening on. Includes network port and all servers (RPC, WebSockets, UI, IPFS, SecretStore). (default: {flag_ports_shift}) @@ -294,6 +296,10 @@ Sealing/Mining Options: means we relay nothing if not mining); lenient - Same as strict when mining, and cheap when not (default: {flag_relay_set}). + --min-gas-price WEI Minimum amount of Wei per GAS to be paid for a + transaction to be accepted for mining. Overrides + --basic-tx-usd. + (default: {flag_min_gas_price:?}) --usd-per-tx USD Amount of USD to be paid for a basic transaction (default: {flag_usd_per_tx}). The minimum gas price is set accordingly. @@ -464,9 +470,7 @@ Legacy Options: --ipc-off Equivalent to --no-ipc. --ipcapi APIS Equivalent to --ipc-apis APIS. --ipcpath PATH Equivalent to --ipc-path PATH. - --gasprice WEI Minimum amount of Wei per GAS to be paid for a - transaction to be accepted for mining. Overrides - --basic-tx-usd. + --gasprice WEI Equivalent to --min-gas-price WEI. --etherbase ADDRESS Equivalent to --author ADDRESS. --extradata STRING Equivalent to --extra-data STRING. --cache MB Equivalent to --cache-size MB. diff --git a/parity/configuration.rs b/parity/configuration.rs index ea6f00a81..6d5990aa0 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -36,7 +36,7 @@ use parity_rpc::NetworkSettings; use cache::CacheConfig; use helpers::{to_duration, to_mode, to_block_id, to_u256, to_pending_set, to_price, replace_home, replace_home_and_local, geth_ipc_path, parity_ipc_path, to_bootnodes, to_addresses, to_address, to_gas_limit, to_queue_strategy}; -use params::{SpecType, ResealPolicy, AccountsConfig, GasPricerConfig, MinerExtras, Pruning, Switch}; +use params::{ResealPolicy, AccountsConfig, GasPricerConfig, MinerExtras, Pruning, Switch}; use ethcore_logger::Config as LogConfig; use dir::{self, Directories, default_hypervisor_path, default_local_path, default_data_path}; use dapps::Configuration as DappsConfiguration; @@ -331,13 +331,6 @@ impl Configuration { }; let verifier_settings = self.verifier_settings(); - - // Special presets are present for the dev chain. - let (gas_pricer_conf, miner_options) = match spec { - SpecType::Dev => (GasPricerConfig::Fixed(0.into()), self.miner_options(0)?), - _ => (self.gas_pricer_config()?, self.miner_options(self.args.flag_reseal_min_period)?), - }; - let whisper_config = self.whisper_config(); let run_cmd = RunCmd { @@ -349,14 +342,14 @@ impl Configuration { pruning_memory: self.args.flag_pruning_memory, daemon: daemon, logger_config: logger_config.clone(), - miner_options: miner_options, + miner_options: self.miner_options(self.args.flag_reseal_min_period)?, ws_conf: ws_conf, http_conf: http_conf, ipc_conf: ipc_conf, net_conf: net_conf, network_id: network_id, acc_conf: self.accounts_config()?, - gas_pricer_conf: gas_pricer_conf, + gas_pricer_conf: self.gas_pricer_config()?, miner_extras: self.miner_extras()?, stratum: self.stratum_options()?, update_policy: update_policy, @@ -630,8 +623,10 @@ impl Configuration { U256::from_dec_str(&format!("{:.0}", wei_per_gas)).unwrap() } - if let Some(d) = self.args.flag_gasprice.as_ref() { - return Ok(GasPricerConfig::Fixed(to_u256(d)?)); + if let Some(dec) = self.args.flag_gasprice.as_ref() { + return Ok(GasPricerConfig::Fixed(to_u256(dec)?)); + } else if let Some(dec) = self.args.flag_min_gas_price { + return Ok(GasPricerConfig::Fixed(U256::from(dec))); } let usd_per_tx = to_price(&self.args.flag_usd_per_tx)?; @@ -1599,11 +1594,12 @@ mod tests { } #[test] - fn test_dev_chain() { - let args = vec!["parity", "--chain", "dev"]; - let conf = parse(&args); + fn test_dev_preset() { + let args = vec!["parity", "--config", "dev"]; + let conf = Configuration::parse(&args, None).unwrap(); match conf.into_command().unwrap().cmd { Cmd::Run(c) => { + assert_eq!(c.net_settings.chain, "dev"); assert_eq!(c.gas_pricer_conf, GasPricerConfig::Fixed(0.into())); assert_eq!(c.miner_options.reseal_min_period, Duration::from_millis(0)); }, @@ -1611,6 +1607,96 @@ mod tests { } } + #[test] + fn test_mining_preset() { + let args = vec!["parity", "--config", "mining"]; + let conf = Configuration::parse(&args, None).unwrap(); + match conf.into_command().unwrap().cmd { + Cmd::Run(c) => { + assert_eq!(c.net_conf.min_peers, 50); + assert_eq!(c.net_conf.max_peers, 100); + assert_eq!(c.ipc_conf.enabled, false); + assert_eq!(c.dapps_conf.enabled, false); + assert_eq!(c.miner_options.force_sealing, true); + assert_eq!(c.miner_options.reseal_on_external_tx, true); + assert_eq!(c.miner_options.reseal_on_own_tx, true); + assert_eq!(c.miner_options.reseal_min_period, Duration::from_millis(4000)); + assert_eq!(c.miner_options.tx_queue_size, 2048); + assert_eq!(c.cache_config, CacheConfig::new_with_total_cache_size(256)); + assert_eq!(c.logger_config.mode.unwrap(), "miner=trace,own_tx=trace"); + }, + _ => panic!("Should be Cmd::Run"), + } + } + + #[test] + fn test_non_standard_ports_preset() { + let args = vec!["parity", "--config", "non-standard-ports"]; + let conf = Configuration::parse(&args, None).unwrap(); + match conf.into_command().unwrap().cmd { + Cmd::Run(c) => { + assert_eq!(c.net_settings.network_port, 30305); + assert_eq!(c.net_settings.rpc_port, 8645); + }, + _ => panic!("Should be Cmd::Run"), + } + } + + #[test] + fn test_insecure_preset() { + let args = vec!["parity", "--config", "insecure"]; + let conf = Configuration::parse(&args, None).unwrap(); + match conf.into_command().unwrap().cmd { + Cmd::Run(c) => { + assert_eq!(c.update_policy.require_consensus, false); + assert_eq!(c.net_settings.rpc_interface, "0.0.0.0"); + match c.http_conf.apis { + ApiSet::List(set) => assert_eq!(set, ApiSet::All.list_apis()), + _ => panic!("Incorrect rpc apis"), + } + // "web3,eth,net,personal,parity,parity_set,traces,rpc,parity_accounts"); + assert_eq!(c.http_conf.hosts, None); + assert_eq!(c.ipfs_conf.hosts, None); + }, + _ => panic!("Should be Cmd::Run"), + } + } + + #[test] + fn test_dev_insecure_preset() { + let args = vec!["parity", "--config", "dev-insecure"]; + let conf = Configuration::parse(&args, None).unwrap(); + match conf.into_command().unwrap().cmd { + Cmd::Run(c) => { + assert_eq!(c.net_settings.chain, "dev"); + assert_eq!(c.gas_pricer_conf, GasPricerConfig::Fixed(0.into())); + assert_eq!(c.miner_options.reseal_min_period, Duration::from_millis(0)); + assert_eq!(c.update_policy.require_consensus, false); + assert_eq!(c.net_settings.rpc_interface, "0.0.0.0"); + match c.http_conf.apis { + ApiSet::List(set) => assert_eq!(set, ApiSet::All.list_apis()), + _ => panic!("Incorrect rpc apis"), + } + // "web3,eth,net,personal,parity,parity_set,traces,rpc,parity_accounts"); + assert_eq!(c.http_conf.hosts, None); + assert_eq!(c.ipfs_conf.hosts, None); + }, + _ => panic!("Should be Cmd::Run"), + } + } + + #[test] + fn test_override_preset() { + let args = vec!["parity", "--config", "mining", "--min-peers=99"]; + let conf = Configuration::parse(&args, None).unwrap(); + match conf.into_command().unwrap().cmd { + Cmd::Run(c) => { + assert_eq!(c.net_conf.min_peers, 99); + }, + _ => panic!("Should be Cmd::Run"), + } + } + #[test] fn should_apply_ports_shift() { // given