a274edffba
* Calculating gas fees * Ability to set custom fees * Added extra test * Removed commented code * Moved all msg types to common contract crate * Temporarily disabling get_tx method * Finishing up nymd client API * Comment fix * Remaining fee values * Some cleanup * Removed needless borrow * Fixed imports in contract tests * Moved error types around * New ValidatorClient * Experiment with new type of defaults * Removed dead module * Dealt with unwrap * Migrated mixnode to use new validator client * Migrated gateway to use new validator client * Mixnode and gateway adjustments * More exported defaults * Clients using new validator client * Fixed mixnode upgrade * Moved default values to a new crate * Changed behaviour of validator client features * Migrated basic functions of validator api * Updated config + fixed startup * Fixed wasm client build * Integration with the explorer api * Removed tokio dev dependency * Needless borrow * Fixex wasm client build * Fixed tauri client build * Needless borrows * Fixed client upgrade print * Removed redundant comments * Made note on aggregated verification key into a doc comment * Removed mixnet contract references from verloc * Modified default validators structure * Reformatted validator-api Cargo.toml file * Removed commented code * Made the doc comment example a no-run * Fixed a upgrade print... again * Adjusted the doc example * Removed unused import
158 lines
5.7 KiB
Rust
158 lines
5.7 KiB
Rust
// Copyright 2020 - Nym Technologies SA <contact@nymtech.net>
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
use crate::commands::*;
|
|
use crate::config::persistence::pathfinder::MixNodePathfinder;
|
|
use crate::config::Config;
|
|
use clap::{App, Arg, ArgMatches};
|
|
use config::NymConfig;
|
|
use crypto::asymmetric::{encryption, identity};
|
|
use tokio::runtime::Runtime;
|
|
|
|
pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> {
|
|
App::new("init")
|
|
.about("Initialise the mixnode")
|
|
.arg(
|
|
Arg::with_name(ID_ARG_NAME)
|
|
.long(ID_ARG_NAME)
|
|
.help("Id of the nym-mixnode we want to create config for.")
|
|
.takes_value(true)
|
|
.required(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(HOST_ARG_NAME)
|
|
.long(HOST_ARG_NAME)
|
|
.help("The host on which the mixnode will be running")
|
|
.takes_value(true)
|
|
.required(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(MIX_PORT_ARG_NAME)
|
|
.long(MIX_PORT_ARG_NAME)
|
|
.help("The port on which the mixnode will be listening for mix packets")
|
|
.takes_value(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(VERLOC_PORT_ARG_NAME)
|
|
.long(VERLOC_PORT_ARG_NAME)
|
|
.help("The port on which the mixnode will be listening for verloc packets")
|
|
.takes_value(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(HTTP_API_PORT_ARG_NAME)
|
|
.long(HTTP_API_PORT_ARG_NAME)
|
|
.help("The port on which the mixnode will be listening for http requests")
|
|
.takes_value(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(ANNOUNCE_HOST_ARG_NAME)
|
|
.long(ANNOUNCE_HOST_ARG_NAME)
|
|
.help("The custom host that will be reported to the directory server")
|
|
.takes_value(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(VALIDATORS_ARG_NAME)
|
|
.long(VALIDATORS_ARG_NAME)
|
|
.help("Comma separated list of rest endpoints of the validators")
|
|
.takes_value(true),
|
|
)
|
|
}
|
|
|
|
fn show_bonding_info(config: &Config) {
|
|
fn load_identity_keys(pathfinder: &MixNodePathfinder) -> identity::KeyPair {
|
|
let identity_keypair: identity::KeyPair =
|
|
pemstore::load_keypair(&pemstore::KeyPairPath::new(
|
|
pathfinder.private_identity_key().to_owned(),
|
|
pathfinder.public_identity_key().to_owned(),
|
|
))
|
|
.expect("Failed to read stored identity key files");
|
|
identity_keypair
|
|
}
|
|
|
|
fn load_sphinx_keys(pathfinder: &MixNodePathfinder) -> encryption::KeyPair {
|
|
let sphinx_keypair: encryption::KeyPair =
|
|
pemstore::load_keypair(&pemstore::KeyPairPath::new(
|
|
pathfinder.private_encryption_key().to_owned(),
|
|
pathfinder.public_encryption_key().to_owned(),
|
|
))
|
|
.expect("Failed to read stored sphinx key files");
|
|
sphinx_keypair
|
|
}
|
|
|
|
let pathfinder = MixNodePathfinder::new_from_config(config);
|
|
let identity_keypair = load_identity_keys(&pathfinder);
|
|
let sphinx_keypair = load_sphinx_keys(&pathfinder);
|
|
|
|
println!(
|
|
"\nTo bond your mixnode you will need to provide the following:
|
|
Identity key: {}
|
|
Sphinx key: {}
|
|
Address: {}
|
|
Mix port: {}
|
|
Version: {}
|
|
",
|
|
identity_keypair.public_key().to_base58_string(),
|
|
sphinx_keypair.public_key().to_base58_string(),
|
|
config.get_announce_address(),
|
|
config.get_mix_port(),
|
|
config.get_version(),
|
|
);
|
|
}
|
|
|
|
pub fn execute(matches: &ArgMatches) {
|
|
// TODO: this should probably be made implicit by slapping `#[tokio::main]` on our main method
|
|
// and then removing runtime from mixnode itself in `run`
|
|
let rt = Runtime::new().unwrap();
|
|
rt.block_on(async {
|
|
let id = matches.value_of(ID_ARG_NAME).unwrap();
|
|
println!("Initialising mixnode {}...", id);
|
|
|
|
let already_init = if Config::default_config_file_path(Some(id)).exists() {
|
|
println!("Mixnode \"{}\" was already initialised before! Config information will be overwritten (but keys will be kept)!", id);
|
|
true
|
|
} else {
|
|
false
|
|
};
|
|
|
|
let mut config = Config::new(id);
|
|
config = override_config(config, matches);
|
|
|
|
// if node was already initialised, don't generate new keys
|
|
if !already_init {
|
|
let mut rng = rand::rngs::OsRng;
|
|
|
|
let identity_keys = identity::KeyPair::new(&mut rng);
|
|
let sphinx_keys = encryption::KeyPair::new(&mut rng);
|
|
let pathfinder = MixNodePathfinder::new_from_config(&config);
|
|
pemstore::store_keypair(
|
|
&identity_keys,
|
|
&pemstore::KeyPairPath::new(
|
|
pathfinder.private_identity_key().to_owned(),
|
|
pathfinder.public_identity_key().to_owned(),
|
|
),
|
|
)
|
|
.expect("Failed to save identity keys");
|
|
|
|
pemstore::store_keypair(
|
|
&sphinx_keys,
|
|
&pemstore::KeyPairPath::new(
|
|
pathfinder.private_encryption_key().to_owned(),
|
|
pathfinder.public_encryption_key().to_owned(),
|
|
),
|
|
)
|
|
.expect("Failed to save sphinx keys");
|
|
|
|
println!("Saved mixnet identity and sphinx keypairs");
|
|
}
|
|
|
|
let config_save_location = config.get_config_file_save_location();
|
|
config
|
|
.save_to_file(None)
|
|
.expect("Failed to save the config file");
|
|
println!("Saved configuration file to {:?}", config_save_location);
|
|
println!("Mixnode configuration completed.\n\n\n");
|
|
|
|
show_bonding_info(&config)
|
|
})
|
|
}
|