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
170 lines
5.9 KiB
Rust
170 lines
5.9 KiB
Rust
// Copyright 2020 - Nym Technologies SA <contact@nymtech.net>
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
use crate::commands::*;
|
|
use crate::config::persistence::pathfinder::GatewayPathfinder;
|
|
use crate::config::Config;
|
|
use clap::{App, Arg, ArgMatches};
|
|
use config::NymConfig;
|
|
use crypto::asymmetric::{encryption, identity};
|
|
|
|
pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> {
|
|
App::new("init")
|
|
.about("Initialise the gateway")
|
|
.arg(
|
|
Arg::with_name(ID_ARG_NAME)
|
|
.long(ID_ARG_NAME)
|
|
.help("Id of the gateway we want to create config for.")
|
|
.takes_value(true)
|
|
.required(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(HOST_ARG_NAME)
|
|
.long(HOST_ARG_NAME)
|
|
.help("The custom host on which the gateway will be running for receiving sphinx packets")
|
|
.takes_value(true)
|
|
.required(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(MIX_PORT_ARG_NAME)
|
|
.long(MIX_PORT_ARG_NAME)
|
|
.help("The port on which the gateway will be listening for sphinx packets")
|
|
.takes_value(true)
|
|
)
|
|
.arg(
|
|
Arg::with_name(CLIENTS_PORT_ARG_NAME)
|
|
.long(CLIENTS_PORT_ARG_NAME)
|
|
.help("The port on which the gateway will be listening for clients gateway-requests")
|
|
.takes_value(true)
|
|
)
|
|
.arg(
|
|
Arg::with_name(ANNOUNCE_HOST_ARG_NAME)
|
|
.long(ANNOUNCE_HOST_ARG_NAME)
|
|
.help("The host that will be reported to the directory server")
|
|
.takes_value(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name(INBOXES_ARG_NAME)
|
|
.long(INBOXES_ARG_NAME)
|
|
.help("Directory with inboxes where all packets for the clients are stored")
|
|
.takes_value(true)
|
|
)
|
|
.arg(
|
|
Arg::with_name(CLIENTS_LEDGER_ARG_NAME)
|
|
.long(CLIENTS_LEDGER_ARG_NAME)
|
|
.help("Ledger file containing registered clients")
|
|
.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_sphinx_keys(pathfinder: &GatewayPathfinder) -> 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");
|
|
println!(
|
|
"Public sphinx key: {}\n",
|
|
sphinx_keypair.public_key().to_base58_string()
|
|
);
|
|
sphinx_keypair
|
|
}
|
|
|
|
fn load_identity_keys(pathfinder: &GatewayPathfinder) -> 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");
|
|
println!(
|
|
"Public identity key: {}\n",
|
|
identity_keypair.public_key().to_base58_string()
|
|
);
|
|
identity_keypair
|
|
}
|
|
|
|
let pathfinder = GatewayPathfinder::new_from_config(config);
|
|
let identity_keypair = load_identity_keys(&pathfinder);
|
|
let sphinx_keypair = load_sphinx_keys(&pathfinder);
|
|
|
|
println!(
|
|
"\nTo bond your gateway you will [most likely] need to provide the following:
|
|
Identity key: {}
|
|
Sphinx key: {}
|
|
Host: {}
|
|
Mix Port: {}
|
|
Clients Port: {}
|
|
Location: [physical location of your node's server]
|
|
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_clients_port(),
|
|
config.get_version(),
|
|
);
|
|
}
|
|
|
|
pub fn execute(matches: &ArgMatches) {
|
|
let id = matches.value_of(ID_ARG_NAME).unwrap();
|
|
println!("Initialising gateway {}...", id);
|
|
|
|
let already_init = if Config::default_config_file_path(Some(id)).exists() {
|
|
println!("Gateway \"{}\" 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 gateway 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 = GatewayPathfinder::new_from_config(&config);
|
|
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");
|
|
|
|
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");
|
|
|
|
println!("Saved identity and mixnet 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!("Gateway configuration completed.\n\n\n");
|
|
show_bonding_info(&config);
|
|
}
|