From 2fc81141806ace8f12e5a019c0866f16fa8a02dc Mon Sep 17 00:00:00 2001 From: Richard Ulrich Date: Wed, 17 Nov 2021 16:26:43 +0100 Subject: [PATCH] moving the function wallet_name_from_descriptor from blockchain/rpc.rs to wallet/mod.rs as it can be useful not only for rpc --- src/blockchain/compact_filters/mod.rs | 2 +- src/blockchain/rpc.rs | 33 +-------------------------- src/wallet/mod.rs | 29 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/blockchain/compact_filters/mod.rs b/src/blockchain/compact_filters/mod.rs index c2e2b8ea..93b5316c 100644 --- a/src/blockchain/compact_filters/mod.rs +++ b/src/blockchain/compact_filters/mod.rs @@ -472,7 +472,7 @@ pub struct CompactFiltersBlockchainConfig { pub peers: Vec, /// Network used pub network: Network, - /// Storage dir to save partially downloaded headers and full blocks + /// Storage dir to save partially downloaded headers and full blocks. Should be a separate directory per descriptor. Consider using [crate::wallet::wallet_name_from_descriptor] for this. pub storage_dir: String, /// Optionally skip initial `skip_blocks` blocks (default: 0) pub skip_blocks: Option, diff --git a/src/blockchain/rpc.rs b/src/blockchain/rpc.rs index 4cd22943..5c9ee2dd 100644 --- a/src/blockchain/rpc.rs +++ b/src/blockchain/rpc.rs @@ -35,8 +35,6 @@ use crate::bitcoin::consensus::deserialize; use crate::bitcoin::{Address, Network, OutPoint, Transaction, TxOut, Txid}; use crate::blockchain::{Blockchain, Capability, ConfigurableBlockchain, Progress}; use crate::database::{BatchDatabase, DatabaseUtils}; -use crate::descriptor::{get_checksum, IntoWalletDescriptor}; -use crate::wallet::utils::SecpCtx; use crate::{BlockTime, Error, FeeRate, KeychainKind, LocalUtxo, TransactionDetails}; use bitcoincore_rpc::json::{ GetAddressInfoResultLabel, ImportMultiOptions, ImportMultiRequest, @@ -76,7 +74,7 @@ pub struct RpcConfig { pub auth: Auth, /// The network we are using (it will be checked the bitcoin node network matches this) pub network: Network, - /// The wallet name in the bitcoin node, consider using [wallet_name_from_descriptor] for this + /// The wallet name in the bitcoin node, consider using [crate::wallet::wallet_name_from_descriptor] for this pub wallet_name: String, /// Skip this many blocks of the blockchain at the first rescan, if None the rescan is done from the genesis block pub skip_blocks: Option, @@ -415,35 +413,6 @@ impl ConfigurableBlockchain for RpcBlockchain { } } -/// Deterministically generate a unique name given the descriptors defining the wallet -pub fn wallet_name_from_descriptor( - descriptor: T, - change_descriptor: Option, - network: Network, - secp: &SecpCtx, -) -> Result -where - T: IntoWalletDescriptor, -{ - //TODO check descriptors contains only public keys - let descriptor = descriptor - .into_wallet_descriptor(secp, network)? - .0 - .to_string(); - let mut wallet_name = get_checksum(&descriptor[..descriptor.find('#').unwrap()])?; - if let Some(change_descriptor) = change_descriptor { - let change_descriptor = change_descriptor - .into_wallet_descriptor(secp, network)? - .0 - .to_string(); - wallet_name.push_str( - get_checksum(&change_descriptor[..change_descriptor.find('#').unwrap()])?.as_str(), - ); - } - - Ok(wallet_name) -} - /// return the wallets available in default wallet directory //TODO use bitcoincore_rpc method when PR #179 lands fn list_wallet_dir(client: &Client) -> Result, Error> { diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index d5a6cb30..a89f53f7 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -3995,3 +3995,32 @@ pub(crate) mod test { ); } } + +/// Deterministically generate a unique name given the descriptors defining the wallet +pub fn wallet_name_from_descriptor( + descriptor: T, + change_descriptor: Option, + network: Network, + secp: &SecpCtx, +) -> Result +where + T: IntoWalletDescriptor, +{ + //TODO check descriptors contains only public keys + let descriptor = descriptor + .into_wallet_descriptor(secp, network)? + .0 + .to_string(); + let mut wallet_name = get_checksum(&descriptor[..descriptor.find('#').unwrap()])?; + if let Some(change_descriptor) = change_descriptor { + let change_descriptor = change_descriptor + .into_wallet_descriptor(secp, network)? + .0 + .to_string(); + wallet_name.push_str( + get_checksum(&change_descriptor[..change_descriptor.find('#').unwrap()])?.as_str(), + ); + } + + Ok(wallet_name) +}