Skip to content

Commit 729d274

Browse files
authored
Merge pull request #277 from subspace/subspace-node-refactoring
Subspace node refactoring
2 parents c450f47 + 563cef3 commit 729d274

File tree

8 files changed

+299
-354
lines changed

8 files changed

+299
-354
lines changed

crates/subspace-node/src/bin/subspace-node.rs

+172-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,178 @@
1616

1717
//! Subspace node implementation.
1818
19-
#![warn(missing_docs)]
19+
use futures::future::TryFutureExt;
20+
use sc_cli::{ChainSpec, SubstrateCli};
21+
use sp_core::crypto::Ss58AddressFormat;
22+
use subspace_node::{Cli, ExecutorDispatch, Subcommand};
23+
use subspace_runtime::RuntimeApi;
24+
25+
/// Subspace node error.
26+
#[derive(thiserror::Error, Debug)]
27+
pub enum Error {
28+
/// Subspace service error.
29+
#[error(transparent)]
30+
SubspaceService(#[from] subspace_service::Error),
31+
32+
/// CLI error.
33+
#[error(transparent)]
34+
SubstrateCli(#[from] sc_cli::Error),
35+
36+
/// Substrate service error.
37+
#[error(transparent)]
38+
SubstrateService(#[from] sc_service::Error),
39+
40+
/// Other kind of error.
41+
#[error("Other: {0}")]
42+
Other(String),
43+
}
44+
45+
impl From<String> for Error {
46+
fn from(s: String) -> Self {
47+
Self::Other(s)
48+
}
49+
}
50+
51+
fn set_default_ss58_version<C: AsRef<dyn ChainSpec>>(chain_spec: C) {
52+
let maybe_ss58_address_format = chain_spec
53+
.as_ref()
54+
.properties()
55+
.get("ss58Format")
56+
.map(|v| {
57+
v.as_u64()
58+
.expect("ss58Format must always be an unsigned number; qed")
59+
})
60+
.map(|v| {
61+
v.try_into()
62+
.expect("ss58Format must always be within u16 range; qed")
63+
})
64+
.map(Ss58AddressFormat::custom);
65+
66+
if let Some(ss58_address_format) = maybe_ss58_address_format {
67+
sp_core::crypto::set_default_ss58_version(ss58_address_format);
68+
}
69+
}
70+
71+
fn main() -> std::result::Result<(), Error> {
72+
let cli = Cli::from_args();
73+
74+
match &cli.subcommand {
75+
Some(Subcommand::Key(cmd)) => cmd.run(&cli)?,
76+
Some(Subcommand::BuildSpec(cmd)) => {
77+
let runner = cli.create_runner(cmd)?;
78+
runner.sync_run(|config| cmd.run(config.chain_spec, config.network))?
79+
}
80+
Some(Subcommand::CheckBlock(cmd)) => {
81+
let runner = cli.create_runner(cmd)?;
82+
set_default_ss58_version(&runner.config().chain_spec);
83+
runner.async_run(|config| {
84+
let sc_service::PartialComponents {
85+
client,
86+
import_queue,
87+
task_manager,
88+
..
89+
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
90+
Ok((
91+
cmd.run(client, import_queue).map_err(Error::SubstrateCli),
92+
task_manager,
93+
))
94+
})?;
95+
}
96+
Some(Subcommand::ExportBlocks(cmd)) => {
97+
let runner = cli.create_runner(cmd)?;
98+
set_default_ss58_version(&runner.config().chain_spec);
99+
runner.async_run(|config| {
100+
let sc_service::PartialComponents {
101+
client,
102+
task_manager,
103+
..
104+
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
105+
Ok((
106+
cmd.run(client, config.database)
107+
.map_err(Error::SubstrateCli),
108+
task_manager,
109+
))
110+
})?;
111+
}
112+
Some(Subcommand::ExportState(cmd)) => {
113+
let runner = cli.create_runner(cmd)?;
114+
set_default_ss58_version(&runner.config().chain_spec);
115+
runner.async_run(|config| {
116+
let sc_service::PartialComponents {
117+
client,
118+
task_manager,
119+
..
120+
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
121+
Ok((
122+
cmd.run(client, config.chain_spec)
123+
.map_err(Error::SubstrateCli),
124+
task_manager,
125+
))
126+
})?;
127+
}
128+
Some(Subcommand::ImportBlocks(cmd)) => {
129+
let runner = cli.create_runner(cmd)?;
130+
set_default_ss58_version(&runner.config().chain_spec);
131+
runner.async_run(|config| {
132+
let sc_service::PartialComponents {
133+
client,
134+
import_queue,
135+
task_manager,
136+
..
137+
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
138+
Ok((
139+
cmd.run(client, import_queue).map_err(Error::SubstrateCli),
140+
task_manager,
141+
))
142+
})?;
143+
}
144+
Some(Subcommand::PurgeChain(cmd)) => {
145+
let runner = cli.create_runner(cmd)?;
146+
runner.sync_run(|config| cmd.run(config.database))?
147+
}
148+
Some(Subcommand::Revert(cmd)) => {
149+
let runner = cli.create_runner(cmd)?;
150+
set_default_ss58_version(&runner.config().chain_spec);
151+
runner.async_run(|config| {
152+
let sc_service::PartialComponents {
153+
client,
154+
backend,
155+
task_manager,
156+
..
157+
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
158+
Ok((
159+
cmd.run(client, backend).map_err(Error::SubstrateCli),
160+
task_manager,
161+
))
162+
})?;
163+
}
164+
Some(Subcommand::Benchmark(cmd)) => {
165+
if cfg!(feature = "runtime-benchmarks") {
166+
let runner = cli.create_runner(cmd)?;
167+
set_default_ss58_version(&runner.config().chain_spec);
168+
runner.sync_run(|config| {
169+
cmd.run::<subspace_runtime::Block, ExecutorDispatch>(config)
170+
})?;
171+
} else {
172+
return Err(Error::Other(
173+
"Benchmarking wasn't enabled when building the node. You can enable it with \
174+
`--features runtime-benchmarks`."
175+
.into(),
176+
));
177+
}
178+
}
179+
None => {
180+
let runner = cli.create_runner(&cli.run.base)?;
181+
set_default_ss58_version(&runner.config().chain_spec);
182+
runner.run_node_until_exit(|config| async move {
183+
subspace_service::new_full::<subspace_runtime::RuntimeApi, ExecutorDispatch>(
184+
config, true,
185+
)
186+
.await
187+
.map(|full| full.task_manager)
188+
})?;
189+
}
190+
}
20191

21-
fn main() -> std::result::Result<(), subspace_node::Error> {
22-
subspace_node::run()?;
23192
Ok(())
24193
}

crates/subspace-node/src/cli.rs

-72
This file was deleted.

0 commit comments

Comments
 (0)