referrerpolicy=no-referrer-when-downgrade

solochain_template_node/
command.rs

1use crate::{
2	benchmarking::{inherent_benchmark_data, RemarkBuilder, TransferKeepAliveBuilder},
3	chain_spec,
4	cli::{Cli, Subcommand},
5	service,
6};
7use frame_benchmarking_cli::{BenchmarkCmd, ExtrinsicFactory, SUBSTRATE_REFERENCE_HARDWARE};
8use sc_cli::SubstrateCli;
9use sc_service::PartialComponents;
10use solochain_template_runtime::{Block, EXISTENTIAL_DEPOSIT};
11use sp_keyring::Sr25519Keyring;
12
13impl SubstrateCli for Cli {
14	fn impl_name() -> String {
15		"Substrate Node".into()
16	}
17
18	fn impl_version() -> String {
19		env!("SUBSTRATE_CLI_IMPL_VERSION").into()
20	}
21
22	fn description() -> String {
23		env!("CARGO_PKG_DESCRIPTION").into()
24	}
25
26	fn author() -> String {
27		env!("CARGO_PKG_AUTHORS").into()
28	}
29
30	fn support_url() -> String {
31		"support.anonymous.an".into()
32	}
33
34	fn copyright_start_year() -> i32 {
35		2017
36	}
37
38	fn load_spec(&self, id: &str) -> Result<Box<dyn sc_service::ChainSpec>, String> {
39		Ok(match id {
40			"dev" => Box::new(chain_spec::development_chain_spec()?),
41			"" | "local" => Box::new(chain_spec::local_chain_spec()?),
42			path =>
43				Box::new(chain_spec::ChainSpec::from_json_file(std::path::PathBuf::from(path))?),
44		})
45	}
46}
47
48/// Parse and run command line arguments
49pub fn run() -> sc_cli::Result<()> {
50	let cli = Cli::from_args();
51
52	match &cli.subcommand {
53		Some(Subcommand::Key(cmd)) => cmd.run(&cli),
54		#[allow(deprecated)]
55		Some(Subcommand::BuildSpec(cmd)) => {
56			let runner = cli.create_runner(cmd)?;
57			runner.sync_run(|config| cmd.run(config.chain_spec, config.network))
58		},
59		Some(Subcommand::CheckBlock(cmd)) => {
60			let runner = cli.create_runner(cmd)?;
61			runner.async_run(|config| {
62				let PartialComponents { client, task_manager, import_queue, .. } =
63					service::new_partial(&config)?;
64				Ok((cmd.run(client, import_queue), task_manager))
65			})
66		},
67		Some(Subcommand::ExportChainSpec(cmd)) => {
68			let chain_spec = cli.load_spec(&cmd.chain)?;
69			cmd.run(chain_spec)
70		},
71		Some(Subcommand::ExportBlocks(cmd)) => {
72			let runner = cli.create_runner(cmd)?;
73			runner.async_run(|config| {
74				let PartialComponents { client, task_manager, .. } = service::new_partial(&config)?;
75				Ok((cmd.run(client, config.database), task_manager))
76			})
77		},
78		Some(Subcommand::ExportState(cmd)) => {
79			let runner = cli.create_runner(cmd)?;
80			runner.async_run(|config| {
81				let PartialComponents { client, task_manager, .. } = service::new_partial(&config)?;
82				Ok((cmd.run(client, config.chain_spec), task_manager))
83			})
84		},
85		Some(Subcommand::ImportBlocks(cmd)) => {
86			let runner = cli.create_runner(cmd)?;
87			runner.async_run(|config| {
88				let PartialComponents { client, task_manager, import_queue, .. } =
89					service::new_partial(&config)?;
90				Ok((cmd.run(client, import_queue), task_manager))
91			})
92		},
93		Some(Subcommand::PurgeChain(cmd)) => {
94			let runner = cli.create_runner(cmd)?;
95			runner.sync_run(|config| cmd.run(config.database))
96		},
97		Some(Subcommand::Revert(cmd)) => {
98			let runner = cli.create_runner(cmd)?;
99			runner.async_run(|config| {
100				let PartialComponents { client, task_manager, backend, .. } =
101					service::new_partial(&config)?;
102				let aux_revert = Box::new(|client, _, blocks| {
103					sc_consensus_grandpa::revert(client, blocks)?;
104					Ok(())
105				});
106				Ok((cmd.run(client, backend, Some(aux_revert)), task_manager))
107			})
108		},
109		Some(Subcommand::Benchmark(cmd)) => {
110			let runner = cli.create_runner(cmd)?;
111
112			runner.sync_run(|config| {
113				// This switch needs to be in the client, since the client decides
114				// which sub-commands it wants to support.
115				match cmd {
116					BenchmarkCmd::Pallet(cmd) => {
117						if !cfg!(feature = "runtime-benchmarks") {
118							return Err(
119								"Runtime benchmarking wasn't enabled when building the node. \
120							You can enable it with `--features runtime-benchmarks`."
121									.into(),
122							);
123						}
124
125						cmd.run_with_spec::<sp_runtime::traits::HashingFor<Block>, ()>(Some(
126							config.chain_spec,
127						))
128					},
129					BenchmarkCmd::Block(cmd) => {
130						let PartialComponents { client, .. } = service::new_partial(&config)?;
131						cmd.run(client)
132					},
133					#[cfg(not(feature = "runtime-benchmarks"))]
134					BenchmarkCmd::Storage(_) => Err(
135						"Storage benchmarking can be enabled with `--features runtime-benchmarks`."
136							.into(),
137					),
138					#[cfg(feature = "runtime-benchmarks")]
139					BenchmarkCmd::Storage(cmd) => {
140						let PartialComponents { client, backend, .. } =
141							service::new_partial(&config)?;
142						let db = backend.expose_db();
143						let storage = backend.expose_storage();
144						let shared_cache = backend.expose_shared_trie_cache();
145
146						cmd.run(config, client, db, storage, shared_cache)
147					},
148					BenchmarkCmd::Overhead(cmd) => {
149						let PartialComponents { client, .. } = service::new_partial(&config)?;
150						let ext_builder = RemarkBuilder::new(client.clone());
151
152						cmd.run(
153							config.chain_spec.name().into(),
154							client,
155							inherent_benchmark_data()?,
156							Vec::new(),
157							&ext_builder,
158							false,
159						)
160					},
161					BenchmarkCmd::Extrinsic(cmd) => {
162						let PartialComponents { client, .. } = service::new_partial(&config)?;
163						// Register the *Remark* and *TKA* builders.
164						let ext_factory = ExtrinsicFactory(vec![
165							Box::new(RemarkBuilder::new(client.clone())),
166							Box::new(TransferKeepAliveBuilder::new(
167								client.clone(),
168								Sr25519Keyring::Alice.to_account_id(),
169								EXISTENTIAL_DEPOSIT,
170							)),
171						]);
172
173						cmd.run(client, inherent_benchmark_data()?, Vec::new(), &ext_factory)
174					},
175					BenchmarkCmd::Machine(cmd) =>
176						cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone()),
177				}
178			})
179		},
180		Some(Subcommand::ChainInfo(cmd)) => {
181			let runner = cli.create_runner(cmd)?;
182			runner.sync_run(|config| cmd.run::<Block>(&config))
183		},
184		None => {
185			let runner = cli.create_runner(&cli.run)?;
186			runner.run_node_until_exit(|config| async move {
187				match config.network.network_backend {
188					sc_network::config::NetworkBackendType::Libp2p => service::new_full::<
189						sc_network::NetworkWorker<
190							solochain_template_runtime::opaque::Block,
191							<solochain_template_runtime::opaque::Block as sp_runtime::traits::Block>::Hash,
192						>,
193					>(config)
194					.map_err(sc_cli::Error::Service),
195					sc_network::config::NetworkBackendType::Litep2p =>
196						service::new_full::<sc_network::Litep2pNetworkBackend>(config)
197							.map_err(sc_cli::Error::Service),
198				}
199			})
200		},
201	}
202}