From 331287c9fe404cc33ac1110c093e6a5ec0cfbbe7 Mon Sep 17 00:00:00 2001 From: Temple3x Date: Fri, 10 Jun 2022 08:15:34 +0800 Subject: [PATCH] cmd/starcoin/account: bail when pass multsig account as arg for rotate_auth_key_cmd Close #3452 --- .../src/account/rotate_auth_key_cmd.rs | 16 +++++++++++-- .../src/account/sign_multisig_txn_cmd.rs | 23 +++++++++++-------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/cmd/starcoin/src/account/rotate_auth_key_cmd.rs b/cmd/starcoin/src/account/rotate_auth_key_cmd.rs index e7eb159d4e..d046e37a0b 100644 --- a/cmd/starcoin/src/account/rotate_auth_key_cmd.rs +++ b/cmd/starcoin/src/account/rotate_auth_key_cmd.rs @@ -14,7 +14,7 @@ use starcoin_types::identifier::Identifier; use starcoin_types::language_storage::ModuleId; use starcoin_vm_types::account_address::AccountAddress; use starcoin_vm_types::account_config::core_code_address; -use starcoin_vm_types::transaction::authenticator::AccountPrivateKey; +use starcoin_vm_types::transaction::authenticator::{AccountPrivateKey, AccountPublicKey}; use starcoin_vm_types::transaction::{ScriptFunction, TransactionArgument, TransactionPayload}; use starcoin_vm_types::value::MoveValue; @@ -67,6 +67,7 @@ impl CommandAction for RotateAuthenticationKeyCommand { ) -> Result { let client = ctx.state().account_client(); let opt: &RotateAuthKeyOpt = ctx.opt(); + let private_key = match (opt.from_input.as_ref(), opt.from_file.as_ref()) { (Some(p), _) => AccountPrivateKey::from_encoded_string(p)?, (None, Some(p)) => { @@ -77,7 +78,18 @@ impl CommandAction for RotateAuthenticationKeyCommand { bail!("private key should be specified, use , ") } }; - let auth_key = private_key.public_key().authentication_key(); + + let account_public_key = match &private_key.public_key() { + AccountPublicKey::Multi(_) => { + bail!( + "{} is multisig address, you could use execute-function to rotate it step by step", + opt.account_address + ); + } + m => m.clone(), + }; + + let auth_key = account_public_key.authentication_key(); let mut txn_opt = opt.transaction_opts.clone(); txn_opt.blocking = true; txn_opt.sender = Option::from(opt.account_address); diff --git a/cmd/starcoin/src/account/sign_multisig_txn_cmd.rs b/cmd/starcoin/src/account/sign_multisig_txn_cmd.rs index bc7667d59b..c184037399 100644 --- a/cmd/starcoin/src/account/sign_multisig_txn_cmd.rs +++ b/cmd/starcoin/src/account/sign_multisig_txn_cmd.rs @@ -1,14 +1,18 @@ // Copyright (c) The Starcoin Core Contributors // SPDX-License-Identifier: Apache-2.0 -use crate::cli_state::CliState; -use crate::StarcoinOpt; +use std::convert::TryInto; +use std::env::current_dir; +use std::fs::File; +use std::path::PathBuf; + use anyhow::{bail, Result}; use clap::Parser; -use scmd::{CommandAction, ExecContext}; -use starcoin_account_api::AccountPublicKey; use starcoin_crypto::hash::PlainCryptoHash; use starcoin_crypto::multi_ed25519::multi_shard::MultiEd25519SignatureShard; + +use scmd::{CommandAction, ExecContext}; +use starcoin_account_api::AccountPublicKey; use starcoin_rpc_api::types::{FunctionIdView, RawUserTransactionView, TransactionStatusView}; use starcoin_rpc_client::StateRootOption; use starcoin_state_api::StateReaderExt; @@ -22,10 +26,9 @@ use starcoin_vm_types::token::stc::STC_TOKEN_CODE_STR; use starcoin_vm_types::transaction::{ScriptFunction, TransactionPayload}; use starcoin_vm_types::transaction_argument::convert_txn_args; use starcoin_vm_types::{language_storage::TypeTag, parser::parse_type_tag}; -use std::convert::TryInto; -use std::env::current_dir; -use std::fs::File; -use std::path::PathBuf; + +use crate::cli_state::CliState; +use crate::StarcoinOpt; #[derive(Debug, Parser)] #[clap(name = "sign-multisig-txn")] @@ -56,7 +59,7 @@ pub struct GenerateMultisigTxnOpt { )] type_tags: Option>, - #[clap(long = "arg", name = "transaction-arg", parse(try_from_str = parse_transaction_argument))] + #[clap(long = "arg", name = "transaction-arg", parse(try_from_str = parse_transaction_argument))] /// transaction arguments args: Option>, @@ -111,7 +114,7 @@ impl CommandAction for GenerateMultisigTxnCommand { // gen multisig txn or read from file sent by other participants. let (raw_txn, existing_signatures) = if let Some(function_id) = opt.script_function.clone().map(|t| t.0) { - let sender = ctx.opt().sender.expect("sender adress should be provided"); + let sender = ctx.opt().sender.expect("sender address should be provided"); let script_function = ScriptFunction::new( function_id.module, function_id.function,