1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
// 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 <http://www.gnu.org/licenses/>. //! Service configuration. pub use sc_client::ExecutionStrategies; pub use sc_client_db::{kvdb::KeyValueDB, PruningMode}; pub use sc_network::Multiaddr; pub use sc_network::config::{ExtTransport, MultiaddrWithPeerId, NetworkConfiguration, Role, NodeKeyConfig}; pub use sc_executor::WasmExecutionMethod; use std::{future::Future, path::{PathBuf, Path}, pin::Pin, net::SocketAddr, sync::Arc}; pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions; use sc_chain_spec::ChainSpec; use sp_core::crypto::Protected; pub use sc_telemetry::TelemetryEndpoints; use prometheus_endpoint::Registry; /// Service configuration. pub struct Configuration { /// Implementation name pub impl_name: &'static str, /// Implementation version (see sc-cli to see an example of format) pub impl_version: &'static str, /// Node role. pub role: Role, /// How to spawn background tasks. Mandatory, otherwise creating a `Service` will error. pub task_executor: Arc<dyn Fn(Pin<Box<dyn Future<Output = ()> + Send>>) + Send + Sync>, /// Extrinsic pool configuration. pub transaction_pool: TransactionPoolOptions, /// Network configuration. pub network: NetworkConfiguration, /// Configuration for the keystore. pub keystore: KeystoreConfig, /// Configuration for the database. pub database: DatabaseConfig, /// Size of internal state cache in Bytes pub state_cache_size: usize, /// Size in percent of cache size dedicated to child tries pub state_cache_child_ratio: Option<usize>, /// Pruning settings. pub pruning: PruningMode, /// Chain configuration. pub chain_spec: Box<dyn ChainSpec>, /// Wasm execution method. pub wasm_method: WasmExecutionMethod, /// Execution strategies. pub execution_strategies: ExecutionStrategies, /// RPC over HTTP binding address. `None` if disabled. pub rpc_http: Option<SocketAddr>, /// RPC over Websockets binding address. `None` if disabled. pub rpc_ws: Option<SocketAddr>, /// Maximum number of connections for WebSockets RPC server. `None` if default. pub rpc_ws_max_connections: Option<usize>, /// CORS settings for HTTP & WS servers. `None` if all origins are allowed. pub rpc_cors: Option<Vec<String>>, /// Prometheus endpoint configuration. `None` if disabled. pub prometheus_config: Option<PrometheusConfig>, /// Telemetry service URL. `None` if disabled. pub telemetry_endpoints: Option<TelemetryEndpoints>, /// External WASM transport for the telemetry. If `Some`, when connection to a telemetry /// endpoint, this transport will be tried in priority before all others. pub telemetry_external_transport: Option<ExtTransport>, /// The default number of 64KB pages to allocate for Wasm execution pub default_heap_pages: Option<u64>, /// Should offchain workers be executed. pub offchain_worker: bool, /// Enable authoring even when offline. pub force_authoring: bool, /// Disable GRANDPA when running in validator mode pub disable_grandpa: bool, /// Development key seed. /// /// When running in development mode, the seed will be used to generate authority keys by the keystore. /// /// Should only be set when `node` is running development mode. pub dev_key_seed: Option<String>, /// Tracing targets pub tracing_targets: Option<String>, /// Tracing receiver pub tracing_receiver: sc_tracing::TracingReceiver, /// The size of the instances cache. /// /// The default value is 8. pub max_runtime_instances: usize, /// Announce block automatically after they have been imported pub announce_block: bool, } /// Configuration of the client keystore. #[derive(Clone)] pub enum KeystoreConfig { /// Keystore at a path on-disk. Recommended for native nodes. Path { /// The path of the keystore. path: PathBuf, /// Node keystore's password. password: Option<Protected<String>> }, /// In-memory keystore. Recommended for in-browser nodes. InMemory, } impl KeystoreConfig { /// Returns the path for the keystore. pub fn path(&self) -> Option<&Path> { match self { Self::Path { path, .. } => Some(path), Self::InMemory => None, } } } /// Configuration of the database of the client. #[derive(Clone)] pub enum DatabaseConfig { /// Database file at a specific path. Recommended for most uses. Path { /// Path to the database. path: PathBuf, /// Cache Size for internal database in MiB cache_size: usize, }, /// A custom implementation of an already-open database. Custom(Arc<dyn KeyValueDB>), } /// Configuration of the Prometheus endpoint. #[derive(Clone)] pub struct PrometheusConfig { /// Port to use. pub port: SocketAddr, /// A metrics registry to use. Useful for setting the metric prefix. pub registry: Registry, } impl PrometheusConfig { /// Create a new config using the default registry. /// /// The default registry prefixes metrics with `substrate`. pub fn new_with_default_registry(port: SocketAddr) -> Self { Self { port, registry: Registry::new_custom(Some("substrate".into()), None) .expect("this can only fail if the prefix is empty") } } } impl Configuration { /// Returns a string displaying the node role. pub fn display_role(&self) -> String { self.role.to_string() } }