moving the function wallet_name_from_descriptor from blockchain/rpc.rs to wallet/mod.rs as it can be useful not only for rpc

This commit is contained in:
Richard Ulrich 2021-11-17 16:26:43 +01:00
parent 5830226216
commit 2fc8114180
No known key found for this signature in database
GPG Key ID: B37F658367A845DC
3 changed files with 31 additions and 33 deletions

View File

@ -472,7 +472,7 @@ pub struct CompactFiltersBlockchainConfig {
pub peers: Vec<BitcoinPeerConfig>, pub peers: Vec<BitcoinPeerConfig>,
/// Network used /// Network used
pub network: Network, 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, pub storage_dir: String,
/// Optionally skip initial `skip_blocks` blocks (default: 0) /// Optionally skip initial `skip_blocks` blocks (default: 0)
pub skip_blocks: Option<usize>, pub skip_blocks: Option<usize>,

View File

@ -35,8 +35,6 @@ use crate::bitcoin::consensus::deserialize;
use crate::bitcoin::{Address, Network, OutPoint, Transaction, TxOut, Txid}; use crate::bitcoin::{Address, Network, OutPoint, Transaction, TxOut, Txid};
use crate::blockchain::{Blockchain, Capability, ConfigurableBlockchain, Progress}; use crate::blockchain::{Blockchain, Capability, ConfigurableBlockchain, Progress};
use crate::database::{BatchDatabase, DatabaseUtils}; 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 crate::{BlockTime, Error, FeeRate, KeychainKind, LocalUtxo, TransactionDetails};
use bitcoincore_rpc::json::{ use bitcoincore_rpc::json::{
GetAddressInfoResultLabel, ImportMultiOptions, ImportMultiRequest, GetAddressInfoResultLabel, ImportMultiOptions, ImportMultiRequest,
@ -76,7 +74,7 @@ pub struct RpcConfig {
pub auth: Auth, pub auth: Auth,
/// The network we are using (it will be checked the bitcoin node network matches this) /// The network we are using (it will be checked the bitcoin node network matches this)
pub network: Network, 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, 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 /// 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<u32>, pub skip_blocks: Option<u32>,
@ -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<T>(
descriptor: T,
change_descriptor: Option<T>,
network: Network,
secp: &SecpCtx,
) -> Result<String, Error>
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 /// return the wallets available in default wallet directory
//TODO use bitcoincore_rpc method when PR #179 lands //TODO use bitcoincore_rpc method when PR #179 lands
fn list_wallet_dir(client: &Client) -> Result<Vec<String>, Error> { fn list_wallet_dir(client: &Client) -> Result<Vec<String>, Error> {

View File

@ -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<T>(
descriptor: T,
change_descriptor: Option<T>,
network: Network,
secp: &SecpCtx,
) -> Result<String, Error>
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)
}