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
48pub 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 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 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}