Skip to content
This repository has been archived by the owner on Feb 21, 2024. It is now read-only.

Commit

Permalink
Merge pull request paritytech#277 from subspace/subspace-node-refacto…
Browse files Browse the repository at this point in the history
…ring

Subspace node refactoring
  • Loading branch information
nazar-pc authored Mar 8, 2022
2 parents c450f47 + 563cef3 commit 729d274
Show file tree
Hide file tree
Showing 8 changed files with 299 additions and 354 deletions.
175 changes: 172 additions & 3 deletions crates/subspace-node/src/bin/subspace-node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,178 @@

//! Subspace node implementation.
#![warn(missing_docs)]
use futures::future::TryFutureExt;
use sc_cli::{ChainSpec, SubstrateCli};
use sp_core::crypto::Ss58AddressFormat;
use subspace_node::{Cli, ExecutorDispatch, Subcommand};
use subspace_runtime::RuntimeApi;

/// Subspace node error.
#[derive(thiserror::Error, Debug)]
pub enum Error {
/// Subspace service error.
#[error(transparent)]
SubspaceService(#[from] subspace_service::Error),

/// CLI error.
#[error(transparent)]
SubstrateCli(#[from] sc_cli::Error),

/// Substrate service error.
#[error(transparent)]
SubstrateService(#[from] sc_service::Error),

/// Other kind of error.
#[error("Other: {0}")]
Other(String),
}

impl From<String> for Error {
fn from(s: String) -> Self {
Self::Other(s)
}
}

fn set_default_ss58_version<C: AsRef<dyn ChainSpec>>(chain_spec: C) {
let maybe_ss58_address_format = chain_spec
.as_ref()
.properties()
.get("ss58Format")
.map(|v| {
v.as_u64()
.expect("ss58Format must always be an unsigned number; qed")
})
.map(|v| {
v.try_into()
.expect("ss58Format must always be within u16 range; qed")
})
.map(Ss58AddressFormat::custom);

if let Some(ss58_address_format) = maybe_ss58_address_format {
sp_core::crypto::set_default_ss58_version(ss58_address_format);
}
}

fn main() -> std::result::Result<(), Error> {
let cli = Cli::from_args();

match &cli.subcommand {
Some(Subcommand::Key(cmd)) => cmd.run(&cli)?,
Some(Subcommand::BuildSpec(cmd)) => {
let runner = cli.create_runner(cmd)?;
runner.sync_run(|config| cmd.run(config.chain_spec, config.network))?
}
Some(Subcommand::CheckBlock(cmd)) => {
let runner = cli.create_runner(cmd)?;
set_default_ss58_version(&runner.config().chain_spec);
runner.async_run(|config| {
let sc_service::PartialComponents {
client,
import_queue,
task_manager,
..
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
Ok((
cmd.run(client, import_queue).map_err(Error::SubstrateCli),
task_manager,
))
})?;
}
Some(Subcommand::ExportBlocks(cmd)) => {
let runner = cli.create_runner(cmd)?;
set_default_ss58_version(&runner.config().chain_spec);
runner.async_run(|config| {
let sc_service::PartialComponents {
client,
task_manager,
..
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
Ok((
cmd.run(client, config.database)
.map_err(Error::SubstrateCli),
task_manager,
))
})?;
}
Some(Subcommand::ExportState(cmd)) => {
let runner = cli.create_runner(cmd)?;
set_default_ss58_version(&runner.config().chain_spec);
runner.async_run(|config| {
let sc_service::PartialComponents {
client,
task_manager,
..
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
Ok((
cmd.run(client, config.chain_spec)
.map_err(Error::SubstrateCli),
task_manager,
))
})?;
}
Some(Subcommand::ImportBlocks(cmd)) => {
let runner = cli.create_runner(cmd)?;
set_default_ss58_version(&runner.config().chain_spec);
runner.async_run(|config| {
let sc_service::PartialComponents {
client,
import_queue,
task_manager,
..
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
Ok((
cmd.run(client, import_queue).map_err(Error::SubstrateCli),
task_manager,
))
})?;
}
Some(Subcommand::PurgeChain(cmd)) => {
let runner = cli.create_runner(cmd)?;
runner.sync_run(|config| cmd.run(config.database))?
}
Some(Subcommand::Revert(cmd)) => {
let runner = cli.create_runner(cmd)?;
set_default_ss58_version(&runner.config().chain_spec);
runner.async_run(|config| {
let sc_service::PartialComponents {
client,
backend,
task_manager,
..
} = subspace_service::new_partial::<RuntimeApi, ExecutorDispatch>(&config)?;
Ok((
cmd.run(client, backend).map_err(Error::SubstrateCli),
task_manager,
))
})?;
}
Some(Subcommand::Benchmark(cmd)) => {
if cfg!(feature = "runtime-benchmarks") {
let runner = cli.create_runner(cmd)?;
set_default_ss58_version(&runner.config().chain_spec);
runner.sync_run(|config| {
cmd.run::<subspace_runtime::Block, ExecutorDispatch>(config)
})?;
} else {
return Err(Error::Other(
"Benchmarking wasn't enabled when building the node. You can enable it with \
`--features runtime-benchmarks`."
.into(),
));
}
}
None => {
let runner = cli.create_runner(&cli.run.base)?;
set_default_ss58_version(&runner.config().chain_spec);
runner.run_node_until_exit(|config| async move {
subspace_service::new_full::<subspace_runtime::RuntimeApi, ExecutorDispatch>(
config, true,
)
.await
.map(|full| full.task_manager)
})?;
}
}

fn main() -> std::result::Result<(), subspace_node::Error> {
subspace_node::run()?;
Ok(())
}
72 changes: 0 additions & 72 deletions crates/subspace-node/src/cli.rs

This file was deleted.

Loading

0 comments on commit 729d274

Please sign in to comment.