{
- let mut address: SocketAddr = address.parse().map_err(
- |_| format!("Invalid address: {}", address)
- )?;
- if let Some(port) = port {
- address.set_port(port);
- }
-
- Ok(address)
-}
-
/// Initialize the logger
pub fn init_logger(pattern: &str) {
use ansi_term::Colour;
@@ -766,116 +221,3 @@ fn kill_color(s: &str) -> String {
}
RE.replace_all(s, "").to_string()
}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- const TEST_VERSION_INFO: &'static VersionInfo = &VersionInfo {
- name: "node-test",
- version: "0.1.0",
- commit: "some_commit",
- executable_name: "node-test",
- description: "description",
- author: "author",
- support_url: "http://example.org",
- copyright_start_year: 2020,
- };
-
- #[test]
- fn keystore_path_is_generated_correctly() {
- let chain_spec = ChainSpec::from_genesis(
- "test",
- "test-id",
- || (),
- Vec::new(),
- None,
- None,
- None,
- None::<()>,
- );
-
- for keystore_path in vec![None, Some("/keystore/path")] {
- let args: Vec<&str> = vec![];
- let mut run_cmds = RunCmd::from_iter(args);
- run_cmds.keystore_path = keystore_path.clone().map(PathBuf::from);
-
- let mut node_config = Configuration::default();
- node_config.config_dir = Some(PathBuf::from("/test/path"));
- node_config.chain_spec = Some(chain_spec.clone());
- update_config_for_running_node(
- &mut node_config,
- run_cmds.clone(),
- ).unwrap();
-
- let expected_path = match keystore_path {
- Some(path) => PathBuf::from(path),
- None => PathBuf::from("/test/path/chains/test-id/keystore"),
- };
-
- assert_eq!(expected_path, node_config.keystore.path().unwrap().to_owned());
- }
- }
-
- #[test]
- fn ensure_load_spec_provide_defaults() {
- let chain_spec = ChainSpec::from_genesis(
- "test",
- "test-id",
- || (),
- vec!["boo".to_string()],
- Some(TelemetryEndpoints::new(vec![("foo".to_string(), 42)])),
- None,
- None,
- None::<()>,
- );
-
- let args: Vec<&str> = vec![];
- let cli = RunCmd::from_iter(args);
-
- let mut config = Configuration::new(TEST_VERSION_INFO);
- load_spec(&mut config, &cli.shared_params, |_| Ok(Some(chain_spec))).unwrap();
-
- assert!(config.chain_spec.is_some());
- assert!(!config.network.boot_nodes.is_empty());
- assert!(config.telemetry_endpoints.is_some());
- }
-
- #[test]
- fn ensure_update_config_for_running_node_provides_defaults() {
- let chain_spec = ChainSpec::from_genesis(
- "test",
- "test-id",
- || (),
- vec![],
- None,
- None,
- None,
- None::<()>,
- );
-
- let args: Vec<&str> = vec![];
- let cli = RunCmd::from_iter(args);
-
- let mut config = Configuration::new(TEST_VERSION_INFO);
- init(&cli.shared_params, &TEST_VERSION_INFO).unwrap();
- init_config(
- &mut config,
- &cli.shared_params,
- &TEST_VERSION_INFO,
- |_| Ok(Some(chain_spec)),
- ).unwrap();
- update_config_for_running_node(&mut config, cli).unwrap();
-
- assert!(config.config_dir.is_some());
- assert!(config.database.is_some());
- if let Some(DatabaseConfig::Path { ref cache_size, .. }) = config.database {
- assert!(cache_size.is_some());
- } else {
- panic!("invalid config.database variant");
- }
- assert!(!config.name.is_empty());
- assert!(config.network.config_path.is_some());
- assert!(!config.network.listen_addresses.is_empty());
- }
-}
diff --git a/client/cli/src/node_key.rs b/client/cli/src/node_key.rs
deleted file mode 100644
index 4401481ca56ce..0000000000000
--- a/client/cli/src/node_key.rs
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2017-2020 Parity Technologies (UK) Ltd.
-// This file is part of Substrate.
-
-// Substrate 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.
-
-// Substrate 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 Substrate. If not, see .
-
-use sc_network::{
- self,
- config::{
- NodeKeyConfig,
- },
-};
-use sp_core::H256;
-use regex::Regex;
-use std::{path::{Path, PathBuf}, str::FromStr};
-use crate::error;
-use crate::params::{NodeKeyParams, NodeKeyType};
-
-/// The file name of the node's Ed25519 secret key inside the chain-specific
-/// network config directory, if neither `--node-key` nor `--node-key-file`
-/// is specified in combination with `--node-key-type=ed25519`.
-const NODE_KEY_ED25519_FILE: &str = "secret_ed25519";
-
-/// Check whether a node name is considered as valid
-pub fn is_node_name_valid(_name: &str) -> Result<(), &str> {
- let name = _name.to_string();
- if name.chars().count() >= crate::NODE_NAME_MAX_LENGTH {
- return Err("Node name too long");
- }
-
- let invalid_chars = r"[\\.@]";
- let re = Regex::new(invalid_chars).unwrap();
- if re.is_match(&name) {
- return Err("Node name should not contain invalid chars such as '.' and '@'");
- }
-
- let invalid_patterns = r"(https?:\\/+)?(www)+";
- let re = Regex::new(invalid_patterns).unwrap();
- if re.is_match(&name) {
- return Err("Node name should not contain urls");
- }
-
- Ok(())
-}
-
-/// Create a `NodeKeyConfig` from the given `NodeKeyParams` in the context
-/// of an optional network config storage directory.
-pub fn node_key_config(params: NodeKeyParams, net_config_dir: &Option
)
- -> error::Result
-where
- P: AsRef
-{
- match params.node_key_type {
- NodeKeyType::Ed25519 =>
- params.node_key.as_ref().map(parse_ed25519_secret).unwrap_or_else(||
- Ok(params.node_key_file
- .or_else(|| net_config_file(net_config_dir, NODE_KEY_ED25519_FILE))
- .map(sc_network::config::Secret::File)
- .unwrap_or(sc_network::config::Secret::New)))
- .map(NodeKeyConfig::Ed25519)
- }
-}
-
-/// Create an error caused by an invalid node key argument.
-fn invalid_node_key(e: impl std::fmt::Display) -> error::Error {
- error::Error::Input(format!("Invalid node key: {}", e))
-}
-
-/// Parse a Ed25519 secret key from a hex string into a `sc_network::Secret`.
-fn parse_ed25519_secret(hex: &String) -> error::Result {
- H256::from_str(&hex).map_err(invalid_node_key).and_then(|bytes|
- sc_network::config::identity::ed25519::SecretKey::from_bytes(bytes)
- .map(sc_network::config::Secret::Input)
- .map_err(invalid_node_key))
-}
-
-fn net_config_file(net_config_dir: &Option
, name: &str) -> Option
-where
- P: AsRef
-{
- net_config_dir.as_ref().map(|d| d.as_ref().join(name))
-}
-
-#[cfg(test)]
-mod tests {
- use sc_network::config::identity::ed25519;
- use super::*;
-
- #[test]
- fn tests_node_name_good() {
- assert!(is_node_name_valid("short name").is_ok());
- }
-
- #[test]
- fn tests_node_name_bad() {
- assert!(is_node_name_valid("long names are not very cool for the ui").is_err());
- assert!(is_node_name_valid("Dots.not.Ok").is_err());
- assert!(is_node_name_valid("http://visit.me").is_err());
- assert!(is_node_name_valid("https://visit.me").is_err());
- assert!(is_node_name_valid("www.visit.me").is_err());
- assert!(is_node_name_valid("email@domain").is_err());
- }
-
- #[test]
- fn test_node_key_config_input() {
- fn secret_input(net_config_dir: Option) -> error::Result<()> {
- NodeKeyType::variants().iter().try_for_each(|t| {
- let node_key_type = NodeKeyType::from_str(t).unwrap();
- let sk = match node_key_type {
- NodeKeyType::Ed25519 => ed25519::SecretKey::generate().as_ref().to_vec()
- };
- let params = NodeKeyParams {
- node_key_type,
- node_key: Some(format!("{:x}", H256::from_slice(sk.as_ref()))),
- node_key_file: None
- };
- node_key_config(params, &net_config_dir).and_then(|c| match c {
- NodeKeyConfig::Ed25519(sc_network::config::Secret::Input(ref ski))
- if node_key_type == NodeKeyType::Ed25519 &&
- &sk[..] == ski.as_ref() => Ok(()),
- _ => Err(error::Error::Input("Unexpected node key config".into()))
- })
- })
- }
-
- assert!(secret_input(None).is_ok());
- assert!(secret_input(Some("x".to_string())).is_ok());
- }
-
- #[test]
- fn test_node_key_config_file() {
- fn secret_file(net_config_dir: Option) -> error::Result<()> {
- NodeKeyType::variants().iter().try_for_each(|t| {
- let node_key_type = NodeKeyType::from_str(t).unwrap();
- let tmp = tempfile::Builder::new().prefix("alice").tempdir()?;
- let file = tmp.path().join(format!("{}_mysecret", t)).to_path_buf();
- let params = NodeKeyParams {
- node_key_type,
- node_key: None,
- node_key_file: Some(file.clone())
- };
- node_key_config(params, &net_config_dir).and_then(|c| match c {
- NodeKeyConfig::Ed25519(sc_network::config::Secret::File(ref f))
- if node_key_type == NodeKeyType::Ed25519 && f == &file => Ok(()),
- _ => Err(error::Error::Input("Unexpected node key config".into()))
- })
- })
- }
-
- assert!(secret_file(None).is_ok());
- assert!(secret_file(Some("x".to_string())).is_ok());
- }
-
- #[test]
- fn test_node_key_config_default() {
- fn with_def_params(f: F) -> error::Result<()>
- where
- F: Fn(NodeKeyParams) -> error::Result<()>
- {
- NodeKeyType::variants().iter().try_for_each(|t| {
- let node_key_type = NodeKeyType::from_str(t).unwrap();
- f(NodeKeyParams {
- node_key_type,
- node_key: None,
- node_key_file: None
- })
- })
- }
-
- fn no_config_dir() -> error::Result<()> {
- with_def_params(|params| {
- let typ = params.node_key_type;
- node_key_config::(params, &None)
- .and_then(|c| match c {
- NodeKeyConfig::Ed25519(sc_network::config::Secret::New)
- if typ == NodeKeyType::Ed25519 => Ok(()),
- _ => Err(error::Error::Input("Unexpected node key config".into()))
- })
- })
- }
-
- fn some_config_dir(net_config_dir: String) -> error::Result<()> {
- with_def_params(|params| {
- let dir = PathBuf::from(net_config_dir.clone());
- let typ = params.node_key_type;
- node_key_config(params, &Some(net_config_dir.clone()))
- .and_then(move |c| match c {
- NodeKeyConfig::Ed25519(sc_network::config::Secret::File(ref f))
- if typ == NodeKeyType::Ed25519 &&
- f == &dir.join(NODE_KEY_ED25519_FILE) => Ok(()),
- _ => Err(error::Error::Input("Unexpected node key config".into()))
- })
- })
- }
-
- assert!(no_config_dir().is_ok());
- assert!(some_config_dir("x".to_string()).is_ok());
- }
-}
diff --git a/client/cli/src/params.rs b/client/cli/src/params.rs
deleted file mode 100644
index a1a8b9c5b4fef..0000000000000
--- a/client/cli/src/params.rs
+++ /dev/null
@@ -1,1202 +0,0 @@
-// Copyright 2018-2020 Parity Technologies (UK) Ltd.
-// This file is part of Substrate.
-
-// Substrate 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.
-
-// Substrate 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 Substrate. If not, see .
-
-use std::{str::FromStr, path::PathBuf};
-use structopt::{StructOpt, clap::arg_enum};
-use sc_service::{
- AbstractService, Configuration, ChainSpecExtension, RuntimeGenesis, ServiceBuilderCommand,
- config::DatabaseConfig,
-};
-use sp_runtime::traits::{Block as BlockT, Header as HeaderT};
-use crate::VersionInfo;
-use crate::error;
-use std::fmt::Debug;
-use log::info;
-use sc_network::config::build_multiaddr;
-use std::io;
-use std::fs;
-use std::io::{Read, Write, Seek};
-use sp_runtime::generic::BlockId;
-use crate::runtime::run_until_exit;
-use crate::node_key::node_key_config;
-use crate::execution_strategy::*;
-
-pub use crate::execution_strategy::ExecutionStrategy;
-
-impl Into for ExecutionStrategy {
- fn into(self) -> sc_client_api::ExecutionStrategy {
- match self {
- ExecutionStrategy::Native => sc_client_api::ExecutionStrategy::NativeWhenPossible,
- ExecutionStrategy::Wasm => sc_client_api::ExecutionStrategy::AlwaysWasm,
- ExecutionStrategy::Both => sc_client_api::ExecutionStrategy::Both,
- ExecutionStrategy::NativeElseWasm => sc_client_api::ExecutionStrategy::NativeElseWasm,
- }
- }
-}
-
-#[allow(missing_docs)]
-mod wasm_execution_method {
- use super::*;
-
- arg_enum! {
- /// How to execute Wasm runtime code
- #[derive(Debug, Clone, Copy)]
- pub enum WasmExecutionMethod {
- // Uses an interpreter.
- Interpreted,
- // Uses a compiled runtime.
- Compiled,
- }
- }
-
- impl WasmExecutionMethod {
- /// Returns list of variants that are not disabled by feature flags.
- pub fn enabled_variants() -> Vec<&'static str> {
- Self::variants()
- .iter()
- .cloned()
- .filter(|&name| cfg!(feature = "wasmtime") || name != "Compiled")
- .collect()
- }
- }
-}
-
-pub use wasm_execution_method::WasmExecutionMethod;
-
-impl Into for WasmExecutionMethod {
- fn into(self) -> sc_service::config::WasmExecutionMethod {
- match self {
- WasmExecutionMethod::Interpreted => sc_service::config::WasmExecutionMethod::Interpreted,
- #[cfg(feature = "wasmtime")]
- WasmExecutionMethod::Compiled => sc_service::config::WasmExecutionMethod::Compiled,
- #[cfg(not(feature = "wasmtime"))]
- WasmExecutionMethod::Compiled => panic!(
- "Substrate must be compiled with \"wasmtime\" feature for compiled Wasm execution"
- ),
- }
- }
-}
-
-arg_enum! {
- /// Whether off-chain workers are enabled.
- #[allow(missing_docs)]
- #[derive(Debug, Clone)]
- pub enum OffchainWorkerEnabled {
- Always,
- Never,
- WhenValidating,
- }
-}
-
-/// Shared parameters used by all `CoreParams`.
-#[derive(Debug, StructOpt, Clone)]
-pub struct SharedParams {
- /// Specify the chain specification (one of dev, local or staging).
- #[structopt(long = "chain", value_name = "CHAIN_SPEC")]
- pub chain: Option,
-
- /// Specify the development chain.
- #[structopt(long = "dev")]
- pub dev: bool,
-
- /// Specify custom base path.
- #[structopt(long = "base-path", short = "d", value_name = "PATH", parse(from_os_str))]
- pub base_path: Option,
-
- /// Sets a custom logging filter.
- #[structopt(short = "l", long = "log", value_name = "LOG_PATTERN")]
- pub log: Option,
-}
-
-/// Parameters for block import.
-#[derive(Debug, StructOpt, Clone)]
-pub struct ImportParams {
- /// Specify the state pruning mode, a number of blocks to keep or 'archive'.
- ///
- /// Default is to keep all block states if the node is running as a
- /// validator (i.e. 'archive'), otherwise state is only kept for the last
- /// 256 blocks.
- #[structopt(long = "pruning", value_name = "PRUNING_MODE")]
- pub pruning: Option,
-
- /// Force start with unsafe pruning settings.
- ///
- /// When running as a validator it is highly recommended to disable state
- /// pruning (i.e. 'archive') which is the default. The node will refuse to
- /// start as a validator if pruning is enabled unless this option is set.
- #[structopt(long = "unsafe-pruning")]
- pub unsafe_pruning: bool,
-
- /// Method for executing Wasm runtime code.
- #[structopt(
- long = "wasm-execution",
- value_name = "METHOD",
- possible_values = &WasmExecutionMethod::enabled_variants(),
- case_insensitive = true,
- default_value = "Interpreted"
- )]
- pub wasm_method: WasmExecutionMethod,
-
- #[allow(missing_docs)]
- #[structopt(flatten)]
- pub execution_strategies: ExecutionStrategies,
-
- /// Limit the memory the database cache can use.
- #[structopt(long = "db-cache", value_name = "MiB", default_value = "1024")]
- pub database_cache_size: u32,
-
- /// Specify the state cache size.
- #[structopt(long = "state-cache-size", value_name = "Bytes", default_value = "67108864")]
- pub state_cache_size: usize,
-
- /// Comma separated list of targets for tracing
- #[structopt(long = "tracing-targets", value_name = "TARGETS")]
- pub tracing_targets: Option,
-
- /// Receiver to process tracing messages
- #[structopt(
- long = "tracing-receiver",
- value_name = "RECEIVER",
- possible_values = &TracingReceiver::variants(),
- case_insensitive = true,
- default_value = "Log"
- )]
- pub tracing_receiver: TracingReceiver,
-}
-
-/// Parameters used to create the network configuration.
-#[derive(Debug, StructOpt, Clone)]
-pub struct NetworkConfigurationParams {
- /// Specify a list of bootnodes.
- #[structopt(long = "bootnodes", value_name = "URL")]
- pub bootnodes: Vec,
-
- /// Specify a list of reserved node addresses.
- #[structopt(long = "reserved-nodes", value_name = "URL")]
- pub reserved_nodes: Vec,
-
- /// Whether to only allow connections to/from reserved nodes.
- ///
- /// If you are a validator your node might still connect to other validator
- /// nodes regardless of whether they are defined as reserved nodes.
- #[structopt(long = "reserved-only")]
- pub reserved_only: bool,
-
- /// Specify a list of sentry node public addresses.
- #[structopt(
- long = "sentry-nodes",
- value_name = "URL",
- conflicts_with_all = &[ "sentry" ]
- )]
- pub sentry_nodes: Vec,
-
- /// Listen on this multiaddress.
- #[structopt(long = "listen-addr", value_name = "LISTEN_ADDR")]
- pub listen_addr: Vec,
-
- /// Specify p2p protocol TCP port.
- ///
- /// Only used if --listen-addr is not specified.
- #[structopt(long = "port", value_name = "PORT")]
- pub port: Option,
-
- /// Forbid connecting to private IPv4 addresses (as specified in
- /// [RFC1918](https://tools.ietf.org/html/rfc1918)), unless the address was passed with
- /// `--reserved-nodes` or `--bootnodes`.
- #[structopt(long = "no-private-ipv4")]
- pub no_private_ipv4: bool,
-
- /// Specify the number of outgoing connections we're trying to maintain.
- #[structopt(long = "out-peers", value_name = "COUNT", default_value = "25")]
- pub out_peers: u32,
-
- /// Specify the maximum number of incoming connections we're accepting.
- #[structopt(long = "in-peers", value_name = "COUNT", default_value = "25")]
- pub in_peers: u32,
-
- /// Disable mDNS discovery.
- ///
- /// By default, the network will use mDNS to discover other nodes on the
- /// local network. This disables it. Automatically implied when using --dev.
- #[structopt(long = "no-mdns")]
- pub no_mdns: bool,
-
- /// Maximum number of peers to ask the same blocks in parallel.
- ///
- /// This allows downlading announced blocks from multiple peers. Decrease to save
- /// traffic and risk increased latency.
- #[structopt(long = "max-parallel-downloads", value_name = "COUNT", default_value = "5")]
- pub max_parallel_downloads: u32,
-
- #[allow(missing_docs)]
- #[structopt(flatten)]
- pub node_key_params: NodeKeyParams,
-
- /// Experimental feature flag.
- #[structopt(long = "use-yamux-flow-control")]
- pub use_yamux_flow_control: bool,
-}
-
-arg_enum! {
- #[allow(missing_docs)]
- #[derive(Debug, Copy, Clone, PartialEq, Eq)]
- pub enum NodeKeyType {
- Ed25519
- }
-}
-
-/// Parameters used to create the `NodeKeyConfig`, which determines the keypair
-/// used for libp2p networking.
-#[derive(Debug, StructOpt, Clone)]
-pub struct NodeKeyParams {
- /// The secret key to use for libp2p networking.
- ///
- /// The value is a string that is parsed according to the choice of
- /// `--node-key-type` as follows:
- ///
- /// `ed25519`:
- /// The value is parsed as a hex-encoded Ed25519 32 bytes secret key,
- /// i.e. 64 hex characters.
- ///
- /// The value of this option takes precedence over `--node-key-file`.
- ///
- /// WARNING: Secrets provided as command-line arguments are easily exposed.
- /// Use of this option should be limited to development and testing. To use
- /// an externally managed secret key, use `--node-key-file` instead.
- #[structopt(long = "node-key", value_name = "KEY")]
- pub node_key: Option,
-
- /// The type of secret key to use for libp2p networking.
- ///
- /// The secret key of the node is obtained as follows:
- ///
- /// * If the `--node-key` option is given, the value is parsed as a secret key
- /// according to the type. See the documentation for `--node-key`.
- ///
- /// * If the `--node-key-file` option is given, the secret key is read from the
- /// specified file. See the documentation for `--node-key-file`.
- ///
- /// * Otherwise, the secret key is read from a file with a predetermined,
- /// type-specific name from the chain-specific network config directory
- /// inside the base directory specified by `--base-dir`. If this file does
- /// not exist, it is created with a newly generated secret key of the
- /// chosen type.
- ///
- /// The node's secret key determines the corresponding public key and hence the
- /// node's peer ID in the context of libp2p.
- #[structopt(
- long = "node-key-type",
- value_name = "TYPE",
- possible_values = &NodeKeyType::variants(),
- case_insensitive = true,
- default_value = "Ed25519"
- )]
- pub node_key_type: NodeKeyType,
-
- /// The file from which to read the node's secret key to use for libp2p networking.
- ///
- /// The contents of the file are parsed according to the choice of `--node-key-type`
- /// as follows:
- ///
- /// `ed25519`:
- /// The file must contain an unencoded 32 bytes Ed25519 secret key.
- ///
- /// If the file does not exist, it is created with a newly generated secret key of
- /// the chosen type.
- #[structopt(long = "node-key-file", value_name = "FILE")]
- pub node_key_file: Option,
-}
-
-/// Parameters used to create the pool configuration.
-#[derive(Debug, StructOpt, Clone)]
-pub struct TransactionPoolParams {
- /// Maximum number of transactions in the transaction pool.
- #[structopt(long = "pool-limit", value_name = "COUNT", default_value = "8192")]
- pub pool_limit: usize,
- /// Maximum number of kilobytes of all transactions stored in the pool.
- #[structopt(long = "pool-kbytes", value_name = "COUNT", default_value = "20480")]
- pub pool_kbytes: usize,
-}
-
-arg_enum! {
- #[allow(missing_docs)]
- #[derive(Debug, Copy, Clone, PartialEq, Eq)]
- pub enum TracingReceiver {
- Log,
- Telemetry,
- }
-}
-
-impl Into for TracingReceiver {
- fn into(self) -> sc_tracing::TracingReceiver {
- match self {
- TracingReceiver::Log => sc_tracing::TracingReceiver::Log,
- TracingReceiver::Telemetry => sc_tracing::TracingReceiver::Telemetry,
- }
- }
-}
-
-/// Execution strategies parameters.
-#[derive(Debug, StructOpt, Clone)]
-pub struct ExecutionStrategies {
- /// The means of execution used when calling into the runtime while syncing blocks.
- #[structopt(
- long = "execution-syncing",
- value_name = "STRATEGY",
- possible_values = &ExecutionStrategy::variants(),
- case_insensitive = true,
- default_value = DEFAULT_EXECUTION_SYNCING.as_str(),
- )]
- pub execution_syncing: ExecutionStrategy,
-
- /// The means of execution used when calling into the runtime while importing blocks.
- #[structopt(
- long = "execution-import-block",
- value_name = "STRATEGY",
- possible_values = &ExecutionStrategy::variants(),
- case_insensitive = true,
- default_value = DEFAULT_EXECUTION_IMPORT_BLOCK.as_str(),
- )]
- pub execution_import_block: ExecutionStrategy,
-
- /// The means of execution used when calling into the runtime while constructing blocks.
- #[structopt(
- long = "execution-block-construction",
- value_name = "STRATEGY",
- possible_values = &ExecutionStrategy::variants(),
- case_insensitive = true,
- default_value = DEFAULT_EXECUTION_BLOCK_CONSTRUCTION.as_str(),
- )]
- pub execution_block_construction: ExecutionStrategy,
-
- /// The means of execution used when calling into the runtime while using an off-chain worker.
- #[structopt(
- long = "execution-offchain-worker",
- value_name = "STRATEGY",
- possible_values = &ExecutionStrategy::variants(),
- case_insensitive = true,
- default_value = DEFAULT_EXECUTION_OFFCHAIN_WORKER.as_str(),
- )]
- pub execution_offchain_worker: ExecutionStrategy,
-
- /// The means of execution used when calling into the runtime while not syncing, importing or constructing blocks.
- #[structopt(
- long = "execution-other",
- value_name = "STRATEGY",
- possible_values = &ExecutionStrategy::variants(),
- case_insensitive = true,
- default_value = DEFAULT_EXECUTION_OTHER.as_str(),
- )]
- pub execution_other: ExecutionStrategy,
-
- /// The execution strategy that should be used by all execution contexts.
- #[structopt(
- long = "execution",
- value_name = "STRATEGY",
- possible_values = &ExecutionStrategy::variants(),
- case_insensitive = true,
- conflicts_with_all = &[
- "execution-other",
- "execution-offchain-worker",
- "execution-block-construction",
- "execution-import-block",
- "execution-syncing",
- ]
- )]
- pub execution: Option,
-}
-
-/// The `run` command used to run a node.
-#[derive(Debug, StructOpt, Clone)]
-pub struct RunCmd {
- /// Enable validator mode.
- ///
- /// The node will be started with the authority role and actively
- /// participate in any consensus task that it can (e.g. depending on
- /// availability of local keys).
- #[structopt(
- long = "validator",
- conflicts_with_all = &[ "sentry" ]
- )]
- pub validator: bool,
-
- /// Enable sentry mode.
- ///
- /// The node will be started with the authority role and participate in
- /// consensus tasks as an "observer", it will never actively participate
- /// regardless of whether it could (e.g. keys are available locally). This
- /// mode is useful as a secure proxy for validators (which would run
- /// detached from the network), since we want this node to participate in
- /// the full consensus protocols in order to have all needed consensus data
- /// available to relay to private nodes.
- #[structopt(
- long = "sentry",
- conflicts_with_all = &[ "validator", "light" ]
- )]
- pub sentry: bool,
-
- /// Disable GRANDPA voter when running in validator mode, otherwise disables the GRANDPA observer.
- #[structopt(long = "no-grandpa")]
- pub no_grandpa: bool,
-
- /// Experimental: Run in light client mode.
- #[structopt(long = "light", conflicts_with = "sentry")]
- pub light: bool,
-
- /// Listen to all RPC interfaces.
- ///
- /// Default is local. Note: not all RPC methods are safe to be exposed publicly. Use a RPC proxy
- /// server to filter out dangerous methods. More details: https://github.com/paritytech/substrate/wiki/Public-RPC.
- /// Use `--unsafe-rpc-external` to suppress the warning if you understand the risks.
- #[structopt(long = "rpc-external")]
- pub rpc_external: bool,
-
- /// Listen to all RPC interfaces.
- ///
- /// Same as `--rpc-external`.
- #[structopt(long = "unsafe-rpc-external")]
- pub unsafe_rpc_external: bool,
-
- /// Listen to all Websocket interfaces.
- ///
- /// Default is local. Note: not all RPC methods are safe to be exposed publicly. Use a RPC proxy
- /// server to filter out dangerous methods. More details: https://github.com/paritytech/substrate/wiki/Public-RPC.
- /// Use `--unsafe-ws-external` to suppress the warning if you understand the risks.
- #[structopt(long = "ws-external")]
- pub ws_external: bool,
-
- /// Listen to all Websocket interfaces.
- ///
- /// Same as `--ws-external`.
- #[structopt(long = "unsafe-ws-external")]
- pub unsafe_ws_external: bool,
-
- /// Listen to all Prometheus endpoint interfaces.
- ///
- /// Default is local.
- #[structopt(long = "prometheus-external")]
- pub prometheus_external: bool,
-
- /// Specify HTTP RPC server TCP port.
- #[structopt(long = "rpc-port", value_name = "PORT")]
- pub rpc_port: Option,
-
- /// Specify WebSockets RPC server TCP port.
- #[structopt(long = "ws-port", value_name = "PORT")]
- pub ws_port: Option,
-
- /// Maximum number of WS RPC server connections.
- #[structopt(long = "ws-max-connections", value_name = "COUNT")]
- pub ws_max_connections: Option,
-
- /// Specify browser Origins allowed to access the HTTP & WS RPC servers.
- ///
- /// A comma-separated list of origins (protocol://domain or special `null`
- /// value). Value of `all` will disable origin validation. Default is to
- /// allow localhost, https://polkadot.js.org and
- /// https://substrate-ui.parity.io origins. When running in --dev mode the
- /// default is to allow all origins.
- #[structopt(long = "rpc-cors", value_name = "ORIGINS", parse(try_from_str = parse_cors))]
- pub rpc_cors: Option,
-
- /// Specify Prometheus endpoint TCP Port.
- #[structopt(long = "prometheus-port", value_name = "PORT")]
- pub prometheus_port: Option,
-
- /// Do not expose a Prometheus metric endpoint.
- ///
- /// Prometheus metric endpoint is enabled by default.
- #[structopt(long = "no-prometheus")]
- pub no_prometheus: bool,
-
- /// The human-readable name for this node.
- ///
- /// The node name will be reported to the telemetry server, if enabled.
- #[structopt(long = "name", value_name = "NAME")]
- pub name: Option,
-
- /// Disable connecting to the Substrate telemetry server.
- ///
- /// Telemetry is on by default on global chains.
- #[structopt(long = "no-telemetry")]
- pub no_telemetry: bool,
-
- /// The URL of the telemetry server to connect to.
- ///
- /// This flag can be passed multiple times as a mean to specify multiple
- /// telemetry endpoints. Verbosity levels range from 0-9, with 0 denoting
- /// the least verbosity. If no verbosity level is specified the default is
- /// 0.
- #[structopt(long = "telemetry-url", value_name = "URL VERBOSITY", parse(try_from_str = parse_telemetry_endpoints))]
- pub telemetry_endpoints: Vec<(String, u8)>,
-
- /// Should execute offchain workers on every block.
- ///
- /// By default it's only enabled for nodes that are authoring new blocks.
- #[structopt(
- long = "offchain-worker",
- value_name = "ENABLED",
- possible_values = &OffchainWorkerEnabled::variants(),
- case_insensitive = true,
- default_value = "WhenValidating"
- )]
- pub offchain_worker: OffchainWorkerEnabled,
-
- #[allow(missing_docs)]
- #[structopt(flatten)]
- pub shared_params: SharedParams,
-
- #[allow(missing_docs)]
- #[structopt(flatten)]
- pub import_params: ImportParams,
-
- #[allow(missing_docs)]
- #[structopt(flatten)]
- pub network_config: NetworkConfigurationParams,
-
- #[allow(missing_docs)]
- #[structopt(flatten)]
- pub pool_config: TransactionPoolParams,
-
- /// Shortcut for `--name Alice --validator` with session keys for `Alice` added to keystore.
- #[structopt(long, conflicts_with_all = &["bob", "charlie", "dave", "eve", "ferdie", "one", "two"])]
- pub alice: bool,
-
- /// Shortcut for `--name Bob --validator` with session keys for `Bob` added to keystore.
- #[structopt(long, conflicts_with_all = &["alice", "charlie", "dave", "eve", "ferdie", "one", "two"])]
- pub bob: bool,
-
- /// Shortcut for `--name Charlie --validator` with session keys for `Charlie` added to keystore.
- #[structopt(long, conflicts_with_all = &["alice", "bob", "dave", "eve", "ferdie", "one", "two"])]
- pub charlie: bool,
-
- /// Shortcut for `--name Dave --validator` with session keys for `Dave` added to keystore.
- #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "eve", "ferdie", "one", "two"])]
- pub dave: bool,
-
- /// Shortcut for `--name Eve --validator` with session keys for `Eve` added to keystore.
- #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "dave", "ferdie", "one", "two"])]
- pub eve: bool,
-
- /// Shortcut for `--name Ferdie --validator` with session keys for `Ferdie` added to keystore.
- #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "dave", "eve", "one", "two"])]
- pub ferdie: bool,
-
- /// Shortcut for `--name One --validator` with session keys for `One` added to keystore.
- #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "dave", "eve", "ferdie", "two"])]
- pub one: bool,
-
- /// Shortcut for `--name Two --validator` with session keys for `Two` added to keystore.
- #[structopt(long, conflicts_with_all = &["alice", "bob", "charlie", "dave", "eve", "ferdie", "one"])]
- pub two: bool,
-
- /// Enable authoring even when offline.
- #[structopt(long = "force-authoring")]
- pub force_authoring: bool,
-
- /// Specify custom keystore path.
- #[structopt(long = "keystore-path", value_name = "PATH", parse(from_os_str))]
- pub keystore_path: Option