Feature/fix gateway sign (#1004)

* Include version check in sign command

* Ask for wallet address the same way as mixnode

The reason for this is that the cosmos mnemonic that is asked at
init is for the address that gets rewarded for gateway usage.
Since that address is not necessarly set now and it can take a
default value, we won't be using that to derive the address in the
signing process.
This commit is contained in:
Bogdan-Ștefan Neacşu
2022-01-04 13:49:24 +01:00
committed by GitHub
parent d95df4b286
commit 0b6adf59ce
6 changed files with 56 additions and 113 deletions
+19
View File
@@ -148,3 +148,22 @@ pub(crate) fn validate_bech32_address_or_exit(address: &str) {
process::exit(1);
}
}
// this only checks compatibility between config the binary. It does not take into consideration
// network version. It might do so in the future.
pub(crate) fn version_check(cfg: &Config) -> bool {
let binary_version = env!("CARGO_PKG_VERSION");
let config_version = cfg.get_version();
if binary_version != config_version {
log::warn!("The gateway binary has different version than what is specified in config file! {} and {}", binary_version, config_version);
if version_checker::is_minor_version_compatible(binary_version, config_version) {
log::info!("but they are still semver compatible. However, consider running the `upgrade` command");
true
} else {
log::error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again");
false
}
} else {
true
}
}
-20
View File
@@ -7,7 +7,6 @@ use crate::node::Gateway;
use clap::{App, Arg, ArgMatches};
use config::NymConfig;
use log::*;
use version_checker::is_minor_version_compatible;
pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> {
let app = App::new("run")
@@ -95,25 +94,6 @@ fn special_addresses() -> Vec<&'static str> {
vec!["localhost", "127.0.0.1", "0.0.0.0", "::1", "[::1]"]
}
// this only checks compatibility between config the binary. It does not take into consideration
// network version. It might do so in the future.
fn version_check(cfg: &Config) -> bool {
let binary_version = env!("CARGO_PKG_VERSION");
let config_version = cfg.get_version();
if binary_version != config_version {
warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version);
if is_minor_version_compatible(binary_version, config_version) {
info!("but they are still semver compatible. However, consider running the `upgrade` command");
true
} else {
error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again");
false
}
} else {
true
}
}
pub async fn execute(matches: ArgMatches<'static>) {
let id = matches.value_of(ID_ARG_NAME).unwrap();
+12 -72
View File
@@ -8,8 +8,6 @@ use colored::Colorize;
use config::NymConfig;
use crypto::asymmetric::identity;
use log::error;
#[cfg(not(feature = "coconut"))]
use validator_client::nymd::AccountId;
const SIGN_TEXT_ARG_NAME: &str = "text";
const SIGN_ADDRESS_ARG_NAME: &str = "address";
@@ -55,58 +53,7 @@ pub fn load_identity_keys(pathfinder: &GatewayPathfinder) -> identity::KeyPair {
identity_keypair
}
#[cfg(not(feature = "coconut"))]
fn derive_address(raw_mnemonic: &str) -> AccountId {
let mnemonic = match raw_mnemonic.parse() {
Ok(mnemonic) => mnemonic,
Err(err) => {
let error_message = format!("failed to parse the provided mnemonic - {}", err).red();
println!("{}", error_message);
process::exit(1);
}
};
let wallet =
match validator_client::nymd::wallet::DirectSecp256k1HdWallet::from_mnemonic(mnemonic) {
Ok(wallet) => wallet,
Err(err) => {
let error_message = format!(
"failed to derive your account with the provided mnemonic - {}",
err
)
.red();
println!("{}", error_message);
process::exit(1);
}
};
let account_data = match wallet.try_derive_accounts() {
Ok(data) => data,
Err(err) => {
let error_message = format!(
"failed to derive your account with the provided mnemonic - {}",
err
)
.red();
println!("{}", error_message);
process::exit(1);
}
};
account_data[0].address().clone()
}
#[cfg(not(feature = "coconut"))]
fn sign_derived_address(private_key: &identity::PrivateKey, address: &AccountId) {
let signature_bytes = private_key.sign(&address.to_bytes()).to_bytes();
let signature = bs58::encode(signature_bytes).into_string();
println!(
"The base58-encoded signature on '{}' is: {}",
address, signature
)
}
// we do tiny bit of sanity check validation
#[cfg(feature = "coconut")]
fn sign_provided_address(private_key: &identity::PrivateKey, raw_address: &str) {
fn print_signed_address(private_key: &identity::PrivateKey, raw_address: &str) -> String {
let trimmed = raw_address.trim();
validate_bech32_address_or_exit(trimmed);
let signature = private_key.sign_text(trimmed);
@@ -114,7 +61,8 @@ fn sign_provided_address(private_key: &identity::PrivateKey, raw_address: &str)
println!(
"The base58-encoded signature on '{}' is: {}",
trimmed, signature
)
);
signature
}
fn print_signed_text(private_key: &identity::PrivateKey, text: &str) {
@@ -141,28 +89,20 @@ pub fn execute(matches: &ArgMatches) {
return;
}
};
if !version_check(&config) {
error!("failed the local version check");
return;
}
let pathfinder = GatewayPathfinder::new_from_config(&config);
let identity_keypair = load_identity_keys(&pathfinder);
if let Some(text) = matches.value_of(SIGN_TEXT_ARG_NAME) {
print_signed_text(identity_keypair.private_key(), text)
}
#[cfg(not(feature = "coconut"))]
{
if matches.is_present(SIGN_ADDRESS_ARG_NAME) {
let address = derive_address(&config.get_cosmos_mnemonic());
sign_derived_address(identity_keypair.private_key(), &address);
}
}
#[cfg(feature = "coconut")]
{
if let Some(address) = matches.value_of(SIGN_ADDRESS_ARG_NAME) {
sign_provided_address(identity_keypair.private_key(), address)
}
}
if !matches.is_present(SIGN_TEXT_ARG_NAME) && !matches.is_present(SIGN_ADDRESS_ARG_NAME) {
} else if let Some(address) = matches.value_of(SIGN_ADDRESS_ARG_NAME) {
print_signed_address(identity_keypair.private_key(), address);
} else {
let error_message = format!(
"You must specify either '--{}' or '--{}' argument!",
SIGN_TEXT_ARG_NAME, SIGN_ADDRESS_ARG_NAME
+19
View File
@@ -116,3 +116,22 @@ pub(crate) fn validate_bech32_address_or_exit(address: &str) {
process::exit(1);
}
}
// this only checks compatibility between config the binary. It does not take into consideration
// network version. It might do so in the future.
pub(crate) fn version_check(cfg: &Config) -> bool {
let binary_version = env!("CARGO_PKG_VERSION");
let config_version = cfg.get_version();
if binary_version != config_version {
warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version);
if version_checker::is_minor_version_compatible(binary_version, config_version) {
info!("but they are still semver compatible. However, consider running the `upgrade` command");
true
} else {
error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again");
false
}
} else {
true
}
}
-21
View File
@@ -6,8 +6,6 @@ use crate::config::Config;
use crate::node::MixNode;
use clap::{App, Arg, ArgMatches};
use config::NymConfig;
use log::warn;
use version_checker::is_minor_version_compatible;
pub fn command_args<'a, 'b>() -> App<'a, 'b> {
App::new("run")
@@ -73,25 +71,6 @@ fn special_addresses() -> Vec<&'static str> {
vec!["localhost", "127.0.0.1", "0.0.0.0", "::1", "[::1]"]
}
// this only checks compatibility between config the binary. It does not take into consideration
// network version. It might do so in the future.
fn version_check(cfg: &Config) -> bool {
let binary_version = env!("CARGO_PKG_VERSION");
let config_version = cfg.get_version();
if binary_version != config_version {
warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version);
if is_minor_version_compatible(binary_version, config_version) {
info!("but they are still semver compatible. However, consider running the `upgrade` command");
true
} else {
error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again");
false
}
} else {
true
}
}
pub async fn execute(matches: ArgMatches<'static>) {
let id = matches.value_of(ID_ARG_NAME).unwrap();
+6
View File
@@ -83,6 +83,12 @@ pub fn execute(matches: &ArgMatches) {
return;
}
};
if !version_check(&config) {
error!("failed the local version check");
return;
}
let pathfinder = MixNodePathfinder::new_from_config(&config);
let identity_keypair = load_identity_keys(&pathfinder);