Skip to content

Commit 7d11d44

Browse files
committed
chore: make 'DirectSecp256k1HdWallet' only derive its keys once on construction
Previously all the keys and account information was being derived for every transaction signed
1 parent 96e3ff2 commit 7d11d44

File tree

28 files changed

+234
-177
lines changed

28 files changed

+234
-177
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/client-libs/validator-client/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ workspace = true
7575
features = ["json", "rustls-tls"]
7676

7777
[dev-dependencies]
78+
anyhow = { workspace = true }
7879
bip39 = { workspace = true }
7980
cosmrs = { workspace = true, features = ["bip32"] }
8081
ts-rs = { workspace = true }

common/client-libs/validator-client/examples/offline_signing.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use cosmrs::{tx, AccountId, Coin, Denom};
77
use nym_validator_client::http_client;
88
use nym_validator_client::nyxd::CosmWasmClient;
99
use nym_validator_client::signing::direct_wallet::DirectSecp256k1HdWallet;
10+
use nym_validator_client::signing::signer::OfflineSigner;
1011
use nym_validator_client::signing::tx_signer::TxSigner;
1112
use nym_validator_client::signing::SignerData;
1213

@@ -19,8 +20,8 @@ async fn main() {
1920
let validator = "https://rpc.sandbox.nymtech.net";
2021
let to_address: AccountId = "n1pefc2utwpy5w78p2kqdsfmpjxfwmn9d39k5mqa".parse().unwrap();
2122

22-
let signer = DirectSecp256k1HdWallet::from_mnemonic(prefix, signer_mnemonic);
23-
let signer_address = signer.try_derive_accounts().unwrap()[0].address().clone();
23+
let signer = DirectSecp256k1HdWallet::checked_from_mnemonic(prefix, signer_mnemonic).unwrap();
24+
let signer_address = signer.signer_addresses()[0].clone();
2425

2526
// local 'client' ONLY signing messages
2627
let tx_signer = signer;
@@ -57,9 +58,15 @@ async fn main() {
5758
100000u32,
5859
);
5960

60-
let tx_raw = tx_signer
61-
.sign_direct(&signer_address, vec![send_msg], fee, memo, signer_data)
62-
.unwrap();
61+
let tx_raw = TxSigner::sign_direct(
62+
&tx_signer,
63+
&signer_address,
64+
vec![send_msg],
65+
fee,
66+
memo,
67+
signer_data,
68+
)
69+
.unwrap();
6370
let tx_bytes = tx_raw.to_bytes().unwrap();
6471

6572
// compare balances from before and after the tx

common/client-libs/validator-client/src/client.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ use crate::nyxd::{self, NyxdClient};
55
use crate::signing::direct_wallet::DirectSecp256k1HdWallet;
66
use crate::signing::signer::{NoSigner, OfflineSigner};
77
use crate::{
8-
DirectSigningReqwestRpcValidatorClient, QueryReqwestRpcValidatorClient, ReqwestRpcClient,
9-
ValidatorClientError,
8+
DirectSigningReqwestRpcValidatorClient, QueryReqwestRpcValidatorClient, ValidatorClientError,
109
};
1110
use nym_api_requests::ecash::models::{
1211
AggregatedCoinIndicesSignatureResponse, AggregatedExpirationDateSignatureResponse,
@@ -164,7 +163,7 @@ impl Client<HttpRpcClient, DirectSecp256k1HdWallet> {
164163
) -> Result<DirectSigningHttpRpcValidatorClient, ValidatorClientError> {
165164
let rpc_client = http_client(config.nyxd_url.as_str())?;
166165
let prefix = &config.nyxd_config.chain_details.bech32_account_prefix;
167-
let wallet = DirectSecp256k1HdWallet::from_mnemonic(prefix, mnemonic);
166+
let wallet = DirectSecp256k1HdWallet::checked_from_mnemonic(prefix, mnemonic)?;
168167

169168
Ok(Self::new_signing_with_rpc_client(
170169
config, rpc_client, wallet,
@@ -177,12 +176,13 @@ impl Client<HttpRpcClient, DirectSecp256k1HdWallet> {
177176
}
178177
}
179178

180-
impl Client<ReqwestRpcClient, DirectSecp256k1HdWallet> {
179+
#[allow(deprecated)]
180+
impl Client<crate::ReqwestRpcClient, DirectSecp256k1HdWallet> {
181181
pub fn new_reqwest_signing(
182182
config: Config,
183183
mnemonic: bip39::Mnemonic,
184184
) -> DirectSigningReqwestRpcValidatorClient {
185-
let rpc_client = ReqwestRpcClient::new(config.nyxd_url.clone());
185+
let rpc_client = crate::ReqwestRpcClient::new(config.nyxd_url.clone());
186186
let prefix = &config.nyxd_config.chain_details.bech32_account_prefix;
187187
let wallet = DirectSecp256k1HdWallet::from_mnemonic(prefix, mnemonic);
188188

@@ -203,9 +203,10 @@ impl Client<HttpRpcClient> {
203203
}
204204
}
205205

206-
impl Client<ReqwestRpcClient> {
206+
#[allow(deprecated)]
207+
impl Client<crate::ReqwestRpcClient> {
207208
pub fn new_reqwest_query(config: Config) -> QueryReqwestRpcValidatorClient {
208-
let rpc_client = ReqwestRpcClient::new(config.nyxd_url.clone());
209+
let rpc_client = crate::ReqwestRpcClient::new(config.nyxd_url.clone());
209210
Self::new_with_rpc_client(config, rpc_client)
210211
}
211212
}

common/client-libs/validator-client/src/error.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
use crate::nym_api;
5+
use crate::signing::direct_wallet::DirectSecp256k1HdWalletError;
56
pub use tendermint_rpc::error::Error as TendermintRpcError;
67
use thiserror::Error;
78

@@ -26,6 +27,12 @@ pub enum ValidatorClientError {
2627

2728
#[error("No validator API url has been provided")]
2829
NoAPIUrlAvailable,
30+
31+
#[error("failed to derive signing accounts: {source}")]
32+
AccountDerivationFailure {
33+
#[from]
34+
source: DirectSecp256k1HdWalletError,
35+
},
2936
}
3037

3138
impl From<nym_api::error::NymAPIError> for ValidatorClientError {

common/client-libs/validator-client/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub mod rpc;
1212
pub mod signing;
1313

1414
pub use crate::error::ValidatorClientError;
15+
#[allow(deprecated)]
1516
pub use crate::rpc::reqwest::ReqwestRpcClient;
1617
pub use crate::signing::direct_wallet::DirectSecp256k1HdWallet;
1718
pub use client::{Client, Config, EcashApiClient};
@@ -38,9 +39,13 @@ pub type DirectSigningHttpRpcValidatorClient = Client<HttpRpcClient, DirectSecp2
3839
#[cfg(feature = "http-client")]
3940
pub type DirectSigningHttpRpcNyxdClient = nyxd::NyxdClient<HttpRpcClient, DirectSecp256k1HdWallet>;
4041

42+
#[allow(deprecated)]
4143
pub type QueryReqwestRpcValidatorClient = Client<ReqwestRpcClient>;
44+
#[allow(deprecated)]
4245
pub type QueryReqwestRpcNyxdClient = nyxd::NyxdClient<ReqwestRpcClient>;
4346

47+
#[allow(deprecated)]
4448
pub type DirectSigningReqwestRpcValidatorClient = Client<ReqwestRpcClient, DirectSecp256k1HdWallet>;
49+
#[allow(deprecated)]
4550
pub type DirectSigningReqwestRpcNyxdClient =
4651
nyxd::NyxdClient<ReqwestRpcClient, DirectSecp256k1HdWallet>;

common/client-libs/validator-client/src/nyxd/contract_traits/dkg_signing_client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ where
178178
.ok_or_else(|| NyxdError::unavailable_contract_address("dkg contract"))?;
179179

180180
let fee = fee.unwrap_or(Fee::Auto(Some(self.simulated_gas_multiplier())));
181-
let signer_address = &self.signer_addresses()?[0];
181+
let signer_address = &self.signer_addresses()[0];
182182

183183
self.execute(signer_address, dkg_contract_address, &msg, fee, memo, funds)
184184
.await

common/client-libs/validator-client/src/nyxd/contract_traits/ecash_signing_client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ where
9999
.ok_or_else(|| NyxdError::unavailable_contract_address("coconut bandwidth contract"))?;
100100

101101
let fee = fee.unwrap_or(Fee::Auto(Some(self.simulated_gas_multiplier())));
102-
let signer_address = &self.signer_addresses()?[0];
102+
let signer_address = &self.signer_addresses()[0];
103103

104104
self.execute(
105105
signer_address,

common/client-libs/validator-client/src/nyxd/contract_traits/group_signing_client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ where
9595

9696
let fee = fee.unwrap_or(Fee::Auto(Some(self.simulated_gas_multiplier())));
9797

98-
let signer_address = &self.signer_addresses()?[0];
98+
let signer_address = &self.signer_addresses()[0];
9999
self.execute(
100100
signer_address,
101101
group_contract_address,

common/client-libs/validator-client/src/nyxd/contract_traits/mixnet_signing_client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ where
667667
let fee = fee.unwrap_or(Fee::Auto(Some(self.simulated_gas_multiplier())));
668668
let memo = msg.default_memo();
669669

670-
let signer_address = &self.signer_addresses()?[0];
670+
let signer_address = &self.signer_addresses()[0];
671671
self.execute(
672672
signer_address,
673673
mixnet_contract_address,

0 commit comments

Comments
 (0)