diff --git a/account_manager/Cargo.toml b/account_manager/Cargo.toml index fc3df1e8da..2838b242de 100644 --- a/account_manager/Cargo.toml +++ b/account_manager/Cargo.toml @@ -13,3 +13,4 @@ slog-async = "2.3.0" validator_client = { path = "../validator_client" } types = { path = "../eth2/types" } dirs = "2.0.2" +environment = { path = "../lighthouse/environment" } diff --git a/account_manager/src/cli.rs b/account_manager/src/cli.rs new file mode 100644 index 0000000000..9eded83cc5 --- /dev/null +++ b/account_manager/src/cli.rs @@ -0,0 +1,54 @@ +use clap::{App, Arg, SubCommand}; + +pub fn cli_app<'a, 'b>() -> App<'a, 'b> { + App::new("Account Manager") + .visible_aliases(&["am", "accounts", "accounts_manager"]) + .version("0.0.1") + .author("Sigma Prime ") + .about("Eth 2.0 Accounts Manager") + .arg( + Arg::with_name("logfile") + .long("logfile") + .value_name("logfile") + .help("File path where output will be written.") + .takes_value(true), + ) + .arg( + Arg::with_name("datadir") + .long("datadir") + .short("d") + .value_name("DIR") + .help("Data directory for keys and databases.") + .takes_value(true), + ) + .subcommand( + SubCommand::with_name("generate") + .about("Generates a new validator private key") + .version("0.0.1") + .author("Sigma Prime "), + ) + .subcommand( + SubCommand::with_name("generate_deterministic") + .about("Generates a deterministic validator private key FOR TESTING") + .version("0.0.1") + .author("Sigma Prime ") + .arg( + Arg::with_name("validator index") + .long("index") + .short("i") + .value_name("index") + .help("The index of the validator, for which the test key is generated") + .takes_value(true) + .required(true), + ) + .arg( + Arg::with_name("validator count") + .long("validator_count") + .short("n") + .value_name("validator_count") + .help("If supplied along with `index`, generates keys `i..i + n`.") + .takes_value(true) + .default_value("1"), + ), + ) +} diff --git a/account_manager/src/main.rs b/account_manager/src/lib.rs similarity index 58% rename from account_manager/src/main.rs rename to account_manager/src/lib.rs index 095f65cbc5..90a80e6dd7 100644 --- a/account_manager/src/main.rs +++ b/account_manager/src/lib.rs @@ -1,72 +1,21 @@ +mod cli; + use bls::Keypair; -use clap::{App, Arg, SubCommand}; -use slog::{crit, debug, info, o, Drain}; +use clap::ArgMatches; +use environment::RuntimeContext; +use slog::{crit, debug, info}; use std::fs; use std::path::PathBuf; -use types::test_utils::generate_deterministic_keypair; +use types::{test_utils::generate_deterministic_keypair, EthSpec}; use validator_client::Config as ValidatorClientConfig; +pub use cli::cli_app; + pub const DEFAULT_DATA_DIR: &str = ".lighthouse-validator"; pub const CLIENT_CONFIG_FILENAME: &str = "account-manager.toml"; -fn main() { - // Logging - let decorator = slog_term::TermDecorator::new().build(); - let drain = slog_term::CompactFormat::new(decorator).build().fuse(); - let drain = slog_async::Async::new(drain).build().fuse(); - let mut log = slog::Logger::root(drain, o!()); - - // CLI - let matches = App::new("Lighthouse Accounts Manager") - .version("0.0.1") - .author("Sigma Prime ") - .about("Eth 2.0 Accounts Manager") - .arg( - Arg::with_name("logfile") - .long("logfile") - .value_name("logfile") - .help("File path where output will be written.") - .takes_value(true), - ) - .arg( - Arg::with_name("datadir") - .long("datadir") - .short("d") - .value_name("DIR") - .help("Data directory for keys and databases.") - .takes_value(true), - ) - .subcommand( - SubCommand::with_name("generate") - .about("Generates a new validator private key") - .version("0.0.1") - .author("Sigma Prime "), - ) - .subcommand( - SubCommand::with_name("generate_deterministic") - .about("Generates a deterministic validator private key FOR TESTING") - .version("0.0.1") - .author("Sigma Prime ") - .arg( - Arg::with_name("validator index") - .long("index") - .short("i") - .value_name("index") - .help("The index of the validator, for which the test key is generated") - .takes_value(true) - .required(true), - ) - .arg( - Arg::with_name("validator count") - .long("validator_count") - .short("n") - .value_name("validator_count") - .help("If supplied along with `index`, generates keys `i..i + n`.") - .takes_value(true) - .default_value("1"), - ), - ) - .get_matches(); +pub fn run(matches: &ArgMatches, context: RuntimeContext) { + let mut log = context.log; let data_dir = match matches .value_of("datadir") diff --git a/lighthouse/Cargo.toml b/lighthouse/Cargo.toml index 25a41ea6a9..ff6cc054bd 100644 --- a/lighthouse/Cargo.toml +++ b/lighthouse/Cargo.toml @@ -18,3 +18,4 @@ slog-async = "^2.3.0" environment = { path = "./environment" } futures = "0.1.25" validator_client = { "path" = "../validator_client" } +account_manager = { "path" = "../account_manager" } diff --git a/lighthouse/src/main.rs b/lighthouse/src/main.rs index 9125e9802a..7da8f991b4 100644 --- a/lighthouse/src/main.rs +++ b/lighthouse/src/main.rs @@ -53,6 +53,7 @@ fn main() { ) .subcommand(beacon_node::cli_app()) .subcommand(validator_client::cli_app()) + .subcommand(account_manager::cli_app()) .get_matches(); macro_rules! run_with_spec { @@ -115,6 +116,16 @@ fn run( // // Creating a command which can run both might be useful future works. + if let Some(sub_matches) = matches.subcommand_matches("Account Manager") { + let runtime_context = environment.core_context(); + + account_manager::run(sub_matches, runtime_context); + + // Exit early if the account manager was run. It does not used the tokio executor, so no + // need to wait for it to shutdown. + return Ok(()); + } + let beacon_node = if let Some(sub_matches) = matches.subcommand_matches("Beacon Node") { let runtime_context = environment.core_context();