Skip to content

Commit 2995613

Browse files
committed
Move things around in subspace-node to not expose unnecessary things via library API
1 parent c450f47 commit 2995613

6 files changed

Lines changed: 294 additions & 338 deletions

File tree

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

Lines changed: 192 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,198 @@
1616

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

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

crates/subspace-node/src/cli.rs

Lines changed: 0 additions & 72 deletions
This file was deleted.

0 commit comments

Comments
 (0)