From 1713d621d4b0dd40c5c92c297b8116c151ab663e Mon Sep 17 00:00:00 2001 From: Alekos Filini Date: Mon, 14 Dec 2020 17:14:24 +0100 Subject: [PATCH 1/2] Rename `ScriptType` to `KeychainKind` This avoids confusion with the "type of script". --- CHANGELOG.md | 1 + examples/address_validator.rs | 6 +- examples/compiler.rs | 4 +- src/blockchain/compact_filters/mod.rs | 22 ++-- src/blockchain/utils.rs | 24 ++--- src/cli.rs | 18 ++-- src/database/any.rs | 71 +++++------- src/database/keyvalue.rs | 56 +++++----- src/database/memory.rs | 64 +++++------ src/database/mod.rs | 69 ++++++------ src/descriptor/template.rs | 102 +++++++++--------- src/error.rs | 4 +- src/types.rs | 16 +-- src/wallet/address_validator.rs | 10 +- src/wallet/coin_selection.rs | 8 +- src/wallet/mod.rs | 150 +++++++++++++------------- src/wallet/signer.rs | 2 +- src/wallet/tx_builder.rs | 24 ++--- testutils-macros/src/lib.rs | 4 +- 19 files changed, 322 insertions(+), 333 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 111ab579..7527af7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### Changed - Rename the library to `bdk` +- Rename `ScriptType` to `KeychainKind` - Prettify README examples on github - Change CI to github actions - Bump rust-bitcoin to 0.25, fix Cargo dependencies diff --git a/examples/address_validator.rs b/examples/address_validator.rs index d37049c6..eccb1ff4 100644 --- a/examples/address_validator.rs +++ b/examples/address_validator.rs @@ -28,7 +28,7 @@ use bdk::bitcoin; use bdk::database::MemoryDatabase; use bdk::descriptor::HDKeyPaths; use bdk::wallet::address_validator::{AddressValidator, AddressValidatorError}; -use bdk::ScriptType; +use bdk::KeychainKind; use bdk::{OfflineWallet, Wallet}; use bitcoin::hashes::hex::FromHex; @@ -39,7 +39,7 @@ struct DummyValidator; impl AddressValidator for DummyValidator { fn validate( &self, - script_type: ScriptType, + keychain: KeychainKind, hd_keypaths: &HDKeyPaths, script: &Script, ) -> Result<(), AddressValidatorError> { @@ -50,7 +50,7 @@ impl AddressValidator for DummyValidator { println!( "Validating `{:?}` {} address, script: {}", - script_type, path, script + keychain, path, script ); Ok(()) diff --git a/examples/compiler.rs b/examples/compiler.rs index 0f412190..73f2bd01 100644 --- a/examples/compiler.rs +++ b/examples/compiler.rs @@ -40,7 +40,7 @@ use miniscript::policy::Concrete; use miniscript::Descriptor; use bdk::database::memory::MemoryDatabase; -use bdk::{OfflineWallet, ScriptType, Wallet}; +use bdk::{KeychainKind, OfflineWallet, Wallet}; fn main() { env_logger::init_from_env( @@ -104,7 +104,7 @@ fn main() { info!("... First address: {}", wallet.get_new_address().unwrap()); if matches.is_present("parsed_policy") { - let spending_policy = wallet.policies(ScriptType::External).unwrap(); + let spending_policy = wallet.policies(KeychainKind::External).unwrap(); info!( "... Spending policy:\n{}", serde_json::to_string_pretty(&spending_policy).unwrap() diff --git a/src/blockchain/compact_filters/mod.rs b/src/blockchain/compact_filters/mod.rs index 89c2f4d9..c925d938 100644 --- a/src/blockchain/compact_filters/mod.rs +++ b/src/blockchain/compact_filters/mod.rs @@ -81,7 +81,7 @@ mod sync; use super::{Blockchain, Capability, ConfigurableBlockchain, Progress}; use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils}; use crate::error::Error; -use crate::types::{ScriptType, TransactionDetails, UTXO}; +use crate::types::{KeychainKind, TransactionDetails, UTXO}; use crate::FeeRate; use peer::*; @@ -188,22 +188,22 @@ impl CompactFiltersBlockchain { outputs_sum += output.value; // this output is ours, we have a path to derive it - if let Some((script_type, child)) = + if let Some((keychain, child)) = database.get_path_from_script_pubkey(&output.script_pubkey)? { debug!("{} output #{} is mine, adding utxo", tx.txid(), i); updates.set_utxo(&UTXO { outpoint: OutPoint::new(tx.txid(), i as u32), txout: output.clone(), - script_type, + keychain, })?; incoming += output.value; - if script_type == ScriptType::Internal + if keychain == KeychainKind::Internal && (internal_max_deriv.is_none() || child > internal_max_deriv.unwrap_or(0)) { *internal_max_deriv = Some(child); - } else if script_type == ScriptType::External + } else if keychain == KeychainKind::External && (external_max_deriv.is_none() || child > external_max_deriv.unwrap_or(0)) { *external_max_deriv = Some(child); @@ -415,18 +415,22 @@ impl Blockchain for CompactFiltersBlockchain { )?; } - let current_ext = database.get_last_index(ScriptType::External)?.unwrap_or(0); + let current_ext = database + .get_last_index(KeychainKind::External)? + .unwrap_or(0); let first_ext_new = external_max_deriv.map(|x| x + 1).unwrap_or(0); if first_ext_new > current_ext { info!("Setting external index to {}", first_ext_new); - database.set_last_index(ScriptType::External, first_ext_new)?; + database.set_last_index(KeychainKind::External, first_ext_new)?; } - let current_int = database.get_last_index(ScriptType::Internal)?.unwrap_or(0); + let current_int = database + .get_last_index(KeychainKind::Internal)? + .unwrap_or(0); let first_int_new = internal_max_deriv.map(|x| x + 1).unwrap_or(0); if first_int_new > current_int { info!("Setting internal index to {}", first_int_new); - database.set_last_index(ScriptType::Internal, first_int_new)?; + database.set_last_index(KeychainKind::Internal, first_int_new)?; } info!("Dropping blocks until {}", buried_height); diff --git a/src/blockchain/utils.rs b/src/blockchain/utils.rs index 06c39b01..977a561d 100644 --- a/src/blockchain/utils.rs +++ b/src/blockchain/utils.rs @@ -34,7 +34,7 @@ use bitcoin::{BlockHeader, OutPoint, Script, Transaction, Txid}; use super::*; use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils}; use crate::error::Error; -use crate::types::{ScriptType, TransactionDetails, UTXO}; +use crate::types::{KeychainKind, TransactionDetails, UTXO}; use crate::wallet::time::Instant; use crate::wallet::utils::ChunksIterator; @@ -81,12 +81,12 @@ pub trait ElectrumLikeSync { let mut txid_height = HashMap::new(); let mut max_indexes = HashMap::new(); - let mut wallet_chains = vec![ScriptType::Internal, ScriptType::External]; + let mut wallet_chains = vec![KeychainKind::Internal, KeychainKind::External]; // shuffling improve privacy, the server doesn't know my first request is from my internal or external addresses wallet_chains.shuffle(&mut thread_rng()); // download history of our internal and external script_pubkeys - for script_type in wallet_chains.iter() { - let script_iter = db.iter_script_pubkeys(Some(*script_type))?.into_iter(); + for keychain in wallet_chains.iter() { + let script_iter = db.iter_script_pubkeys(Some(*keychain))?.into_iter(); for (i, chunk) in ChunksIterator::new(script_iter, stop_gap).enumerate() { // TODO if i == last, should create another chunk of addresses in db @@ -98,10 +98,10 @@ pub trait ElectrumLikeSync { .filter_map(|(i, v)| v.first().map(|_| i as u32)) .max(); if let Some(max) = max_index { - max_indexes.insert(script_type, max + (i * chunk_size) as u32); + max_indexes.insert(keychain, max + (i * chunk_size) as u32); } let flattened: Vec = call_result.into_iter().flatten().collect(); - debug!("#{} of {:?} results:{}", i, script_type, flattened.len()); + debug!("#{} of {:?} results:{}", i, keychain, flattened.len()); if flattened.is_empty() { // Didn't find anything in the last `stop_gap` script_pubkeys, breaking break; @@ -123,9 +123,9 @@ pub trait ElectrumLikeSync { // saving max indexes info!("max indexes are: {:?}", max_indexes); - for script_type in wallet_chains.iter() { - if let Some(index) = max_indexes.get(script_type) { - db.set_last_index(*script_type, *index)?; + for keychain in wallet_chains.iter() { + if let Some(index) = max_indexes.get(keychain) { + db.set_last_index(*keychain, *index)?; } } @@ -351,14 +351,12 @@ fn save_transaction_details_and_utxos( outputs_sum += output.value; // this output is ours, we have a path to derive it - if let Some((script_type, _child)) = - db.get_path_from_script_pubkey(&output.script_pubkey)? - { + if let Some((keychain, _child)) = db.get_path_from_script_pubkey(&output.script_pubkey)? { debug!("{} output #{} is mine, adding utxo", txid, i); updates.set_utxo(&UTXO { outpoint: OutPoint::new(tx.txid(), i as u32), txout: output.clone(), - script_type, + keychain, })?; incoming += output.value; diff --git a/src/cli.rs b/src/cli.rs index b4f0b732..44f11d7c 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -104,7 +104,7 @@ use bitcoin::{Address, OutPoint, Script, Txid}; use crate::blockchain::log_progress; use crate::error::Error; -use crate::types::ScriptType; +use crate::types::KeychainKind; use crate::{FeeRate, TxBuilder, Wallet}; /// Wallet global options and sub-command @@ -479,14 +479,14 @@ where } let policies = vec![ - external_policy.map(|p| (p, ScriptType::External)), - internal_policy.map(|p| (p, ScriptType::Internal)), + external_policy.map(|p| (p, KeychainKind::External)), + internal_policy.map(|p| (p, KeychainKind::Internal)), ]; - for (policy, script_type) in policies.into_iter().filter_map(|x| x) { + for (policy, keychain) in policies.into_iter().filter_map(|x| x) { let policy = serde_json::from_str::>>(&policy) .map_err(|s| Error::Generic(s.to_string()))?; - tx_builder = tx_builder.policy_path(policy, script_type); + tx_builder = tx_builder.policy_path(policy, keychain); } let (psbt, details) = wallet.create_tx(tx_builder)?; @@ -526,12 +526,12 @@ where Ok(json!({"psbt": base64::encode(&serialize(&psbt)),"details": details,})) } WalletSubCommand::Policies => Ok(json!({ - "external": wallet.policies(ScriptType::External)?, - "internal": wallet.policies(ScriptType::Internal)?, + "external": wallet.policies(KeychainKind::External)?, + "internal": wallet.policies(KeychainKind::Internal)?, })), WalletSubCommand::PublicDescriptor => Ok(json!({ - "external": wallet.public_descriptor(ScriptType::External)?.map(|d| d.to_string()), - "internal": wallet.public_descriptor(ScriptType::Internal)?.map(|d| d.to_string()), + "external": wallet.public_descriptor(KeychainKind::External)?.map(|d| d.to_string()), + "internal": wallet.public_descriptor(KeychainKind::Internal)?.map(|d| d.to_string()), })), WalletSubCommand::Sign { psbt, diff --git a/src/database/any.rs b/src/database/any.rs index d77a1f1b..78b01a3b 100644 --- a/src/database/any.rs +++ b/src/database/any.rs @@ -121,7 +121,7 @@ impl BatchOperations for AnyDatabase { fn set_script_pubkey( &mut self, script: &Script, - script_type: ScriptType, + keychain: KeychainKind, child: u32, ) -> Result<(), Error> { impl_inner_method!( @@ -129,7 +129,7 @@ impl BatchOperations for AnyDatabase { self, set_script_pubkey, script, - script_type, + keychain, child ) } @@ -142,27 +142,27 @@ impl BatchOperations for AnyDatabase { fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> { impl_inner_method!(AnyDatabase, self, set_tx, transaction) } - fn set_last_index(&mut self, script_type: ScriptType, value: u32) -> Result<(), Error> { - impl_inner_method!(AnyDatabase, self, set_last_index, script_type, value) + fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> { + impl_inner_method!(AnyDatabase, self, set_last_index, keychain, value) } fn del_script_pubkey_from_path( &mut self, - script_type: ScriptType, + keychain: KeychainKind, child: u32, ) -> Result, Error> { impl_inner_method!( AnyDatabase, self, del_script_pubkey_from_path, - script_type, + keychain, child ) } fn del_path_from_script_pubkey( &mut self, script: &Script, - ) -> Result, Error> { + ) -> Result, Error> { impl_inner_method!(AnyDatabase, self, del_path_from_script_pubkey, script) } fn del_utxo(&mut self, outpoint: &OutPoint) -> Result, Error> { @@ -178,28 +178,28 @@ impl BatchOperations for AnyDatabase { ) -> Result, Error> { impl_inner_method!(AnyDatabase, self, del_tx, txid, include_raw) } - fn del_last_index(&mut self, script_type: ScriptType) -> Result, Error> { - impl_inner_method!(AnyDatabase, self, del_last_index, script_type) + fn del_last_index(&mut self, keychain: KeychainKind) -> Result, Error> { + impl_inner_method!(AnyDatabase, self, del_last_index, keychain) } } impl Database for AnyDatabase { fn check_descriptor_checksum>( &mut self, - script_type: ScriptType, + keychain: KeychainKind, bytes: B, ) -> Result<(), Error> { impl_inner_method!( AnyDatabase, self, check_descriptor_checksum, - script_type, + keychain, bytes ) } - fn iter_script_pubkeys(&self, script_type: Option) -> Result, Error> { - impl_inner_method!(AnyDatabase, self, iter_script_pubkeys, script_type) + fn iter_script_pubkeys(&self, keychain: Option) -> Result, Error> { + impl_inner_method!(AnyDatabase, self, iter_script_pubkeys, keychain) } fn iter_utxos(&self) -> Result, Error> { impl_inner_method!(AnyDatabase, self, iter_utxos) @@ -213,21 +213,21 @@ impl Database for AnyDatabase { fn get_script_pubkey_from_path( &self, - script_type: ScriptType, + keychain: KeychainKind, child: u32, ) -> Result, Error> { impl_inner_method!( AnyDatabase, self, get_script_pubkey_from_path, - script_type, + keychain, child ) } fn get_path_from_script_pubkey( &self, script: &Script, - ) -> Result, Error> { + ) -> Result, Error> { impl_inner_method!(AnyDatabase, self, get_path_from_script_pubkey, script) } fn get_utxo(&self, outpoint: &OutPoint) -> Result, Error> { @@ -239,12 +239,12 @@ impl Database for AnyDatabase { fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result, Error> { impl_inner_method!(AnyDatabase, self, get_tx, txid, include_raw) } - fn get_last_index(&self, script_type: ScriptType) -> Result, Error> { - impl_inner_method!(AnyDatabase, self, get_last_index, script_type) + fn get_last_index(&self, keychain: KeychainKind) -> Result, Error> { + impl_inner_method!(AnyDatabase, self, get_last_index, keychain) } - fn increment_last_index(&mut self, script_type: ScriptType) -> Result { - impl_inner_method!(AnyDatabase, self, increment_last_index, script_type) + fn increment_last_index(&mut self, keychain: KeychainKind) -> Result { + impl_inner_method!(AnyDatabase, self, increment_last_index, keychain) } } @@ -252,17 +252,10 @@ impl BatchOperations for AnyBatch { fn set_script_pubkey( &mut self, script: &Script, - script_type: ScriptType, + keychain: KeychainKind, child: u32, ) -> Result<(), Error> { - impl_inner_method!( - AnyBatch, - self, - set_script_pubkey, - script, - script_type, - child - ) + impl_inner_method!(AnyBatch, self, set_script_pubkey, script, keychain, child) } fn set_utxo(&mut self, utxo: &UTXO) -> Result<(), Error> { impl_inner_method!(AnyBatch, self, set_utxo, utxo) @@ -273,27 +266,21 @@ impl BatchOperations for AnyBatch { fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error> { impl_inner_method!(AnyBatch, self, set_tx, transaction) } - fn set_last_index(&mut self, script_type: ScriptType, value: u32) -> Result<(), Error> { - impl_inner_method!(AnyBatch, self, set_last_index, script_type, value) + fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> { + impl_inner_method!(AnyBatch, self, set_last_index, keychain, value) } fn del_script_pubkey_from_path( &mut self, - script_type: ScriptType, + keychain: KeychainKind, child: u32, ) -> Result, Error> { - impl_inner_method!( - AnyBatch, - self, - del_script_pubkey_from_path, - script_type, - child - ) + impl_inner_method!(AnyBatch, self, del_script_pubkey_from_path, keychain, child) } fn del_path_from_script_pubkey( &mut self, script: &Script, - ) -> Result, Error> { + ) -> Result, Error> { impl_inner_method!(AnyBatch, self, del_path_from_script_pubkey, script) } fn del_utxo(&mut self, outpoint: &OutPoint) -> Result, Error> { @@ -309,8 +296,8 @@ impl BatchOperations for AnyBatch { ) -> Result, Error> { impl_inner_method!(AnyBatch, self, del_tx, txid, include_raw) } - fn del_last_index(&mut self, script_type: ScriptType) -> Result, Error> { - impl_inner_method!(AnyBatch, self, del_last_index, script_type) + fn del_last_index(&mut self, keychain: KeychainKind) -> Result, Error> { + impl_inner_method!(AnyBatch, self, del_last_index, keychain) } } diff --git a/src/database/keyvalue.rs b/src/database/keyvalue.rs index 1b860a70..b8234978 100644 --- a/src/database/keyvalue.rs +++ b/src/database/keyvalue.rs @@ -37,13 +37,13 @@ use crate::types::*; macro_rules! impl_batch_operations { ( { $($after_insert:tt)* }, $process_delete:ident ) => { - fn set_script_pubkey(&mut self, script: &Script, script_type: ScriptType, path: u32) -> Result<(), Error> { - let key = MapKey::Path((Some(script_type), Some(path))).as_map_key(); + fn set_script_pubkey(&mut self, script: &Script, keychain: KeychainKind, path: u32) -> Result<(), Error> { + let key = MapKey::Path((Some(keychain), Some(path))).as_map_key(); self.insert(key, serialize(script))$($after_insert)*; let key = MapKey::Script(Some(script)).as_map_key(); let value = json!({ - "t": script_type, + "t": keychain, "p": path, }); self.insert(key, serde_json::to_vec(&value)?)$($after_insert)*; @@ -55,7 +55,7 @@ macro_rules! impl_batch_operations { let key = MapKey::UTXO(Some(&utxo.outpoint)).as_map_key(); let value = json!({ "t": utxo.txout, - "i": utxo.script_type, + "i": utxo.keychain, }); self.insert(key, serde_json::to_vec(&value)?)$($after_insert)*; @@ -88,22 +88,22 @@ macro_rules! impl_batch_operations { Ok(()) } - fn set_last_index(&mut self, script_type: ScriptType, value: u32) -> Result<(), Error> { - let key = MapKey::LastIndex(script_type).as_map_key(); + fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> { + let key = MapKey::LastIndex(keychain).as_map_key(); self.insert(key, &value.to_be_bytes())$($after_insert)*; Ok(()) } - fn del_script_pubkey_from_path(&mut self, script_type: ScriptType, path: u32) -> Result, Error> { - let key = MapKey::Path((Some(script_type), Some(path))).as_map_key(); + fn del_script_pubkey_from_path(&mut self, keychain: KeychainKind, path: u32) -> Result, Error> { + let key = MapKey::Path((Some(keychain), Some(path))).as_map_key(); let res = self.remove(key); let res = $process_delete!(res); Ok(res.map_or(Ok(None), |x| Some(deserialize(&x)).transpose())?) } - fn del_path_from_script_pubkey(&mut self, script: &Script) -> Result, Error> { + fn del_path_from_script_pubkey(&mut self, script: &Script) -> Result, Error> { let key = MapKey::Script(Some(script)).as_map_key(); let res = self.remove(key); let res = $process_delete!(res); @@ -130,9 +130,9 @@ macro_rules! impl_batch_operations { Some(b) => { let mut val: serde_json::Value = serde_json::from_slice(&b)?; let txout = serde_json::from_value(val["t"].take())?; - let script_type = serde_json::from_value(val["i"].take())?; + let keychain = serde_json::from_value(val["i"].take())?; - Ok(Some(UTXO { outpoint: outpoint.clone(), txout, script_type })) + Ok(Some(UTXO { outpoint: outpoint.clone(), txout, keychain })) } } } @@ -167,8 +167,8 @@ macro_rules! impl_batch_operations { } } - fn del_last_index(&mut self, script_type: ScriptType) -> Result, Error> { - let key = MapKey::LastIndex(script_type).as_map_key(); + fn del_last_index(&mut self, keychain: KeychainKind) -> Result, Error> { + let key = MapKey::LastIndex(keychain).as_map_key(); let res = self.remove(key); let res = $process_delete!(res); @@ -206,10 +206,10 @@ impl BatchOperations for Batch { impl Database for Tree { fn check_descriptor_checksum>( &mut self, - script_type: ScriptType, + keychain: KeychainKind, bytes: B, ) -> Result<(), Error> { - let key = MapKey::DescriptorChecksum(script_type).as_map_key(); + let key = MapKey::DescriptorChecksum(keychain).as_map_key(); let prev = self.get(&key)?.map(|x| x.to_vec()); if let Some(val) = prev { @@ -224,8 +224,8 @@ impl Database for Tree { } } - fn iter_script_pubkeys(&self, script_type: Option) -> Result, Error> { - let key = MapKey::Path((script_type, None)).as_map_key(); + fn iter_script_pubkeys(&self, keychain: Option) -> Result, Error> { + let key = MapKey::Path((keychain, None)).as_map_key(); self.scan_prefix(key) .map(|x| -> Result<_, Error> { let (_, v) = x?; @@ -243,12 +243,12 @@ impl Database for Tree { let mut val: serde_json::Value = serde_json::from_slice(&v)?; let txout = serde_json::from_value(val["t"].take())?; - let script_type = serde_json::from_value(val["i"].take())?; + let keychain = serde_json::from_value(val["i"].take())?; Ok(UTXO { outpoint, txout, - script_type, + keychain, }) }) .collect() @@ -282,17 +282,17 @@ impl Database for Tree { fn get_script_pubkey_from_path( &self, - script_type: ScriptType, + keychain: KeychainKind, path: u32, ) -> Result, Error> { - let key = MapKey::Path((Some(script_type), Some(path))).as_map_key(); + let key = MapKey::Path((Some(keychain), Some(path))).as_map_key(); Ok(self.get(key)?.map(|b| deserialize(&b)).transpose()?) } fn get_path_from_script_pubkey( &self, script: &Script, - ) -> Result, Error> { + ) -> Result, Error> { let key = MapKey::Script(Some(script)).as_map_key(); self.get(key)? .map(|b| -> Result<_, Error> { @@ -311,12 +311,12 @@ impl Database for Tree { .map(|b| -> Result<_, Error> { let mut val: serde_json::Value = serde_json::from_slice(&b)?; let txout = serde_json::from_value(val["t"].take())?; - let script_type = serde_json::from_value(val["i"].take())?; + let keychain = serde_json::from_value(val["i"].take())?; Ok(UTXO { outpoint: *outpoint, txout, - script_type, + keychain, }) }) .transpose() @@ -341,8 +341,8 @@ impl Database for Tree { .transpose() } - fn get_last_index(&self, script_type: ScriptType) -> Result, Error> { - let key = MapKey::LastIndex(script_type).as_map_key(); + fn get_last_index(&self, keychain: KeychainKind) -> Result, Error> { + let key = MapKey::LastIndex(keychain).as_map_key(); self.get(key)? .map(|b| -> Result<_, Error> { let array: [u8; 4] = b @@ -356,8 +356,8 @@ impl Database for Tree { } // inserts 0 if not present - fn increment_last_index(&mut self, script_type: ScriptType) -> Result { - let key = MapKey::LastIndex(script_type).as_map_key(); + fn increment_last_index(&mut self, keychain: KeychainKind) -> Result { + let key = MapKey::LastIndex(keychain).as_map_key(); self.update_and_fetch(key, |prev| { let new = match prev { Some(b) => { diff --git a/src/database/memory.rs b/src/database/memory.rs index 52bef1c2..cda3775e 100644 --- a/src/database/memory.rs +++ b/src/database/memory.rs @@ -47,13 +47,13 @@ use crate::types::*; // descriptor checksum d{i,e} -> vec pub(crate) enum MapKey<'a> { - Path((Option, Option)), + Path((Option, Option)), Script(Option<&'a Script>), UTXO(Option<&'a OutPoint>), RawTx(Option<&'a Txid>), Transaction(Option<&'a Txid>), - LastIndex(ScriptType), - DescriptorChecksum(ScriptType), + LastIndex(KeychainKind), + DescriptorChecksum(KeychainKind), } impl MapKey<'_> { @@ -141,15 +141,15 @@ impl BatchOperations for MemoryDatabase { fn set_script_pubkey( &mut self, script: &Script, - script_type: ScriptType, + keychain: KeychainKind, path: u32, ) -> Result<(), Error> { - let key = MapKey::Path((Some(script_type), Some(path))).as_map_key(); + let key = MapKey::Path((Some(keychain), Some(path))).as_map_key(); self.map.insert(key, Box::new(script.clone())); let key = MapKey::Script(Some(script)).as_map_key(); let value = json!({ - "t": script_type, + "t": keychain, "p": path, }); self.map.insert(key, Box::new(value)); @@ -160,7 +160,7 @@ impl BatchOperations for MemoryDatabase { fn set_utxo(&mut self, utxo: &UTXO) -> Result<(), Error> { let key = MapKey::UTXO(Some(&utxo.outpoint)).as_map_key(); self.map - .insert(key, Box::new((utxo.txout.clone(), utxo.script_type))); + .insert(key, Box::new((utxo.txout.clone(), utxo.keychain))); Ok(()) } @@ -186,8 +186,8 @@ impl BatchOperations for MemoryDatabase { Ok(()) } - fn set_last_index(&mut self, script_type: ScriptType, value: u32) -> Result<(), Error> { - let key = MapKey::LastIndex(script_type).as_map_key(); + fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error> { + let key = MapKey::LastIndex(keychain).as_map_key(); self.map.insert(key, Box::new(value)); Ok(()) @@ -195,10 +195,10 @@ impl BatchOperations for MemoryDatabase { fn del_script_pubkey_from_path( &mut self, - script_type: ScriptType, + keychain: KeychainKind, path: u32, ) -> Result, Error> { - let key = MapKey::Path((Some(script_type), Some(path))).as_map_key(); + let key = MapKey::Path((Some(keychain), Some(path))).as_map_key(); let res = self.map.remove(&key); self.deleted_keys.push(key); @@ -207,7 +207,7 @@ impl BatchOperations for MemoryDatabase { fn del_path_from_script_pubkey( &mut self, script: &Script, - ) -> Result, Error> { + ) -> Result, Error> { let key = MapKey::Script(Some(script)).as_map_key(); let res = self.map.remove(&key); self.deleted_keys.push(key); @@ -231,11 +231,11 @@ impl BatchOperations for MemoryDatabase { match res { None => Ok(None), Some(b) => { - let (txout, script_type) = b.downcast_ref().cloned().unwrap(); + let (txout, keychain) = b.downcast_ref().cloned().unwrap(); Ok(Some(UTXO { outpoint: *outpoint, txout, - script_type, + keychain, })) } } @@ -272,8 +272,8 @@ impl BatchOperations for MemoryDatabase { } } } - fn del_last_index(&mut self, script_type: ScriptType) -> Result, Error> { - let key = MapKey::LastIndex(script_type).as_map_key(); + fn del_last_index(&mut self, keychain: KeychainKind) -> Result, Error> { + let key = MapKey::LastIndex(keychain).as_map_key(); let res = self.map.remove(&key); self.deleted_keys.push(key); @@ -287,10 +287,10 @@ impl BatchOperations for MemoryDatabase { impl Database for MemoryDatabase { fn check_descriptor_checksum>( &mut self, - script_type: ScriptType, + keychain: KeychainKind, bytes: B, ) -> Result<(), Error> { - let key = MapKey::DescriptorChecksum(script_type).as_map_key(); + let key = MapKey::DescriptorChecksum(keychain).as_map_key(); let prev = self .map @@ -308,8 +308,8 @@ impl Database for MemoryDatabase { } } - fn iter_script_pubkeys(&self, script_type: Option) -> Result, Error> { - let key = MapKey::Path((script_type, None)).as_map_key(); + fn iter_script_pubkeys(&self, keychain: Option) -> Result, Error> { + let key = MapKey::Path((keychain, None)).as_map_key(); self.map .range::, _>((Included(&key), Excluded(&after(&key)))) .map(|(_, v)| Ok(v.downcast_ref().cloned().unwrap())) @@ -322,11 +322,11 @@ impl Database for MemoryDatabase { .range::, _>((Included(&key), Excluded(&after(&key)))) .map(|(k, v)| { let outpoint = deserialize(&k[1..]).unwrap(); - let (txout, script_type) = v.downcast_ref().cloned().unwrap(); + let (txout, keychain) = v.downcast_ref().cloned().unwrap(); Ok(UTXO { outpoint, txout, - script_type, + keychain, }) }) .collect() @@ -358,10 +358,10 @@ impl Database for MemoryDatabase { fn get_script_pubkey_from_path( &self, - script_type: ScriptType, + keychain: KeychainKind, path: u32, ) -> Result, Error> { - let key = MapKey::Path((Some(script_type), Some(path))).as_map_key(); + let key = MapKey::Path((Some(keychain), Some(path))).as_map_key(); Ok(self .map .get(&key) @@ -371,7 +371,7 @@ impl Database for MemoryDatabase { fn get_path_from_script_pubkey( &self, script: &Script, - ) -> Result, Error> { + ) -> Result, Error> { let key = MapKey::Script(Some(script)).as_map_key(); Ok(self.map.get(&key).map(|b| { let mut val: serde_json::Value = b.downcast_ref().cloned().unwrap(); @@ -385,11 +385,11 @@ impl Database for MemoryDatabase { fn get_utxo(&self, outpoint: &OutPoint) -> Result, Error> { let key = MapKey::UTXO(Some(outpoint)).as_map_key(); Ok(self.map.get(&key).map(|b| { - let (txout, script_type) = b.downcast_ref().cloned().unwrap(); + let (txout, keychain) = b.downcast_ref().cloned().unwrap(); UTXO { outpoint: *outpoint, txout, - script_type, + keychain, } })) } @@ -414,14 +414,14 @@ impl Database for MemoryDatabase { })) } - fn get_last_index(&self, script_type: ScriptType) -> Result, Error> { - let key = MapKey::LastIndex(script_type).as_map_key(); + fn get_last_index(&self, keychain: KeychainKind) -> Result, Error> { + let key = MapKey::LastIndex(keychain).as_map_key(); Ok(self.map.get(&key).map(|b| *b.downcast_ref().unwrap())) } // inserts 0 if not present - fn increment_last_index(&mut self, script_type: ScriptType) -> Result { - let key = MapKey::LastIndex(script_type).as_map_key(); + fn increment_last_index(&mut self, keychain: KeychainKind) -> Result { + let key = MapKey::LastIndex(keychain).as_map_key(); let value = self .map .entry(key) @@ -507,7 +507,7 @@ impl MemoryDatabase { txid, vout: vout as u32, }, - script_type: ScriptType::External, + keychain: KeychainKind::External, }) .unwrap(); } diff --git a/src/database/mod.rs b/src/database/mod.rs index 3cd8d9a7..7c48783a 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -61,7 +61,7 @@ pub trait BatchOperations { fn set_script_pubkey( &mut self, script: &Script, - script_type: ScriptType, + keychain: KeychainKind, child: u32, ) -> Result<(), Error>; /// Store a [`UTXO`] @@ -71,12 +71,12 @@ pub trait BatchOperations { /// Store the metadata of a transaction fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error>; /// Store the last derivation index for a given script type - fn set_last_index(&mut self, script_type: ScriptType, value: u32) -> Result<(), Error>; + fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error>; /// Delete a script_pubkey given the script type and its child number fn del_script_pubkey_from_path( &mut self, - script_type: ScriptType, + keychain: KeychainKind, child: u32, ) -> Result, Error>; /// Delete the data related to a specific script_pubkey, meaning the script type and the child @@ -84,7 +84,7 @@ pub trait BatchOperations { fn del_path_from_script_pubkey( &mut self, script: &Script, - ) -> Result, Error>; + ) -> Result, Error>; /// Delete a [`UTXO`] given its [`OutPoint`] fn del_utxo(&mut self, outpoint: &OutPoint) -> Result, Error>; /// Delete a raw transaction given its [`Txid`] @@ -96,7 +96,7 @@ pub trait BatchOperations { include_raw: bool, ) -> Result, Error>; /// Delete the last derivation index for a script type - fn del_last_index(&mut self, script_type: ScriptType) -> Result, Error>; + fn del_last_index(&mut self, keychain: KeychainKind) -> Result, Error>; } /// Trait for reading data from a database @@ -110,12 +110,12 @@ pub trait Database: BatchOperations { /// next time. fn check_descriptor_checksum>( &mut self, - script_type: ScriptType, + keychain: KeychainKind, bytes: B, ) -> Result<(), Error>; /// Return the list of script_pubkeys - fn iter_script_pubkeys(&self, script_type: Option) -> Result, Error>; + fn iter_script_pubkeys(&self, keychain: Option) -> Result, Error>; /// Return the list of [`UTXO`]s fn iter_utxos(&self) -> Result, Error>; /// Return the list of raw transactions @@ -126,14 +126,14 @@ pub trait Database: BatchOperations { /// Fetch a script_pubkey given the script type and child number fn get_script_pubkey_from_path( &self, - script_type: ScriptType, + keychain: KeychainKind, child: u32, ) -> Result, Error>; /// Fetch the script type and child number of a given script_pubkey fn get_path_from_script_pubkey( &self, script: &Script, - ) -> Result, Error>; + ) -> Result, Error>; /// Fetch a [`UTXO`] given its [`OutPoint`] fn get_utxo(&self, outpoint: &OutPoint) -> Result, Error>; /// Fetch a raw transaction given its [`Txid`] @@ -141,12 +141,12 @@ pub trait Database: BatchOperations { /// Fetch the transaction metadata and optionally also the raw transaction fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result, Error>; /// Return the last defivation index for a script type - fn get_last_index(&self, script_type: ScriptType) -> Result, Error>; + fn get_last_index(&self, keychain: KeychainKind) -> Result, Error>; /// Increment the last derivation index for a script type and returns it /// /// It should insert and return `0` if not present in the database - fn increment_last_index(&mut self, script_type: ScriptType) -> Result; + fn increment_last_index(&mut self, keychain: KeychainKind) -> Result; } /// Trait for a database that supports batch operations @@ -217,17 +217,17 @@ pub mod test { Vec::::from_hex("76a91402306a7c23f3e8010de41e9e591348bb83f11daa88ac").unwrap(), ); let path = 42; - let script_type = ScriptType::External; + let keychain = KeychainKind::External; - tree.set_script_pubkey(&script, script_type, path).unwrap(); + tree.set_script_pubkey(&script, keychain, path).unwrap(); assert_eq!( - tree.get_script_pubkey_from_path(script_type, path).unwrap(), + tree.get_script_pubkey_from_path(keychain, path).unwrap(), Some(script.clone()) ); assert_eq!( tree.get_path_from_script_pubkey(&script).unwrap(), - Some((script_type, path.clone())) + Some((keychain, path.clone())) ); } @@ -238,12 +238,12 @@ pub mod test { Vec::::from_hex("76a91402306a7c23f3e8010de41e9e591348bb83f11daa88ac").unwrap(), ); let path = 42; - let script_type = ScriptType::External; + let keychain = KeychainKind::External; - batch.set_script_pubkey(&script, script_type, path).unwrap(); + batch.set_script_pubkey(&script, keychain, path).unwrap(); assert_eq!( - tree.get_script_pubkey_from_path(script_type, path).unwrap(), + tree.get_script_pubkey_from_path(keychain, path).unwrap(), None ); assert_eq!(tree.get_path_from_script_pubkey(&script).unwrap(), None); @@ -251,12 +251,12 @@ pub mod test { tree.commit_batch(batch).unwrap(); assert_eq!( - tree.get_script_pubkey_from_path(script_type, path).unwrap(), + tree.get_script_pubkey_from_path(keychain, path).unwrap(), Some(script.clone()) ); assert_eq!( tree.get_path_from_script_pubkey(&script).unwrap(), - Some((script_type, path.clone())) + Some((keychain, path.clone())) ); } @@ -265,9 +265,9 @@ pub mod test { Vec::::from_hex("76a91402306a7c23f3e8010de41e9e591348bb83f11daa88ac").unwrap(), ); let path = 42; - let script_type = ScriptType::External; + let keychain = KeychainKind::External; - tree.set_script_pubkey(&script, script_type, path).unwrap(); + tree.set_script_pubkey(&script, keychain, path).unwrap(); assert_eq!(tree.iter_script_pubkeys(None).unwrap().len(), 1); } @@ -277,12 +277,12 @@ pub mod test { Vec::::from_hex("76a91402306a7c23f3e8010de41e9e591348bb83f11daa88ac").unwrap(), ); let path = 42; - let script_type = ScriptType::External; + let keychain = KeychainKind::External; - tree.set_script_pubkey(&script, script_type, path).unwrap(); + tree.set_script_pubkey(&script, keychain, path).unwrap(); assert_eq!(tree.iter_script_pubkeys(None).unwrap().len(), 1); - tree.del_script_pubkey_from_path(script_type, path).unwrap(); + tree.del_script_pubkey_from_path(keychain, path).unwrap(); assert_eq!(tree.iter_script_pubkeys(None).unwrap().len(), 0); } @@ -301,7 +301,7 @@ pub mod test { let utxo = UTXO { txout, outpoint, - script_type: ScriptType::External, + keychain: KeychainKind::External, }; tree.set_utxo(&utxo).unwrap(); @@ -356,24 +356,27 @@ pub mod test { } pub fn test_last_index(mut tree: D) { - tree.set_last_index(ScriptType::External, 1337).unwrap(); + tree.set_last_index(KeychainKind::External, 1337).unwrap(); assert_eq!( - tree.get_last_index(ScriptType::External).unwrap(), + tree.get_last_index(KeychainKind::External).unwrap(), Some(1337) ); - assert_eq!(tree.get_last_index(ScriptType::Internal).unwrap(), None); + assert_eq!(tree.get_last_index(KeychainKind::Internal).unwrap(), None); - let res = tree.increment_last_index(ScriptType::External).unwrap(); + let res = tree.increment_last_index(KeychainKind::External).unwrap(); assert_eq!(res, 1338); - let res = tree.increment_last_index(ScriptType::Internal).unwrap(); + let res = tree.increment_last_index(KeychainKind::Internal).unwrap(); assert_eq!(res, 0); assert_eq!( - tree.get_last_index(ScriptType::External).unwrap(), + tree.get_last_index(KeychainKind::External).unwrap(), Some(1338) ); - assert_eq!(tree.get_last_index(ScriptType::Internal).unwrap(), Some(0)); + assert_eq!( + tree.get_last_index(KeychainKind::Internal).unwrap(), + Some(0) + ); } // TODO: more tests... diff --git a/src/descriptor/template.rs b/src/descriptor/template.rs index 48609c19..18a8bc3f 100644 --- a/src/descriptor/template.rs +++ b/src/descriptor/template.rs @@ -34,7 +34,7 @@ use miniscript::{Legacy, Segwitv0}; use super::{ExtendedDescriptor, KeyMap, ToWalletDescriptor}; use crate::keys::{DerivableKey, KeyError, ToDescriptorKey, ValidNetworks}; -use crate::{descriptor, ScriptType}; +use crate::{descriptor, KeychainKind}; /// Type alias for the return type of [`DescriptorTemplate`], [`descriptor!`](crate::descriptor!) and others pub type DescriptorTemplateOut = (ExtendedDescriptor, KeyMap, ValidNetworks); @@ -159,23 +159,23 @@ impl> DescriptorTemplate for P2WPKH { /// ``` /// # use std::str::FromStr; /// # use bdk::bitcoin::{PrivateKey, Network}; -/// # use bdk::{Wallet, OfflineWallet, ScriptType}; +/// # use bdk::{Wallet, OfflineWallet, KeychainKind}; /// # use bdk::database::MemoryDatabase; /// use bdk::template::BIP44; /// /// let key = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m")?; /// let wallet: OfflineWallet<_> = Wallet::new_offline( -/// BIP44(key.clone(), ScriptType::External), -/// Some(BIP44(key, ScriptType::Internal)), +/// BIP44(key.clone(), KeychainKind::External), +/// Some(BIP44(key, KeychainKind::Internal)), /// Network::Testnet, /// MemoryDatabase::default() /// )?; /// /// assert_eq!(wallet.get_new_address()?.to_string(), "miNG7dJTzJqNbFS19svRdTCisC65dsubtR"); -/// assert_eq!(wallet.public_descriptor(ScriptType::External)?.unwrap().to_string(), "pkh([c55b303f/44'/0'/0']tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU/0/*)"); +/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "pkh([c55b303f/44'/0'/0']tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU/0/*)"); /// # Ok::<_, Box>(()) /// ``` -pub struct BIP44>(pub K, pub ScriptType); +pub struct BIP44>(pub K, pub KeychainKind); impl> DescriptorTemplate for BIP44 { fn build(self) -> Result { @@ -197,24 +197,24 @@ impl> DescriptorTemplate for BIP44 { /// ``` /// # use std::str::FromStr; /// # use bdk::bitcoin::{PrivateKey, Network}; -/// # use bdk::{Wallet, OfflineWallet, ScriptType}; +/// # use bdk::{Wallet, OfflineWallet, KeychainKind}; /// # use bdk::database::MemoryDatabase; /// use bdk::template::BIP44Public; /// /// let key = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU")?; /// let fingerprint = bitcoin::util::bip32::Fingerprint::from_str("c55b303f")?; /// let wallet: OfflineWallet<_> = Wallet::new_offline( -/// BIP44Public(key.clone(), fingerprint, ScriptType::External), -/// Some(BIP44Public(key, fingerprint, ScriptType::Internal)), +/// BIP44Public(key.clone(), fingerprint, KeychainKind::External), +/// Some(BIP44Public(key, fingerprint, KeychainKind::Internal)), /// Network::Testnet, /// MemoryDatabase::default() /// )?; /// /// assert_eq!(wallet.get_new_address()?.to_string(), "miNG7dJTzJqNbFS19svRdTCisC65dsubtR"); -/// assert_eq!(wallet.public_descriptor(ScriptType::External)?.unwrap().to_string(), "pkh([c55b303f/44'/0'/0']tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU/0/*)"); +/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "pkh([c55b303f/44'/0'/0']tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU/0/*)"); /// # Ok::<_, Box>(()) /// ``` -pub struct BIP44Public>(pub K, pub bip32::Fingerprint, pub ScriptType); +pub struct BIP44Public>(pub K, pub bip32::Fingerprint, pub KeychainKind); impl> DescriptorTemplate for BIP44Public { fn build(self) -> Result { @@ -233,23 +233,23 @@ impl> DescriptorTemplate for BIP44Public { /// ``` /// # use std::str::FromStr; /// # use bdk::bitcoin::{PrivateKey, Network}; -/// # use bdk::{Wallet, OfflineWallet, ScriptType}; +/// # use bdk::{Wallet, OfflineWallet, KeychainKind}; /// # use bdk::database::MemoryDatabase; /// use bdk::template::BIP49; /// /// let key = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m")?; /// let wallet: OfflineWallet<_> = Wallet::new_offline( -/// BIP49(key.clone(), ScriptType::External), -/// Some(BIP49(key, ScriptType::Internal)), +/// BIP49(key.clone(), KeychainKind::External), +/// Some(BIP49(key, KeychainKind::Internal)), /// Network::Testnet, /// MemoryDatabase::default() /// )?; /// /// assert_eq!(wallet.get_new_address()?.to_string(), "2N3K4xbVAHoiTQSwxkZjWDfKoNC27pLkYnt"); -/// assert_eq!(wallet.public_descriptor(ScriptType::External)?.unwrap().to_string(), "sh(wpkh([c55b303f/49\'/0\'/0\']tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L/0/*))"); +/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "sh(wpkh([c55b303f/49\'/0\'/0\']tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L/0/*))"); /// # Ok::<_, Box>(()) /// ``` -pub struct BIP49>(pub K, pub ScriptType); +pub struct BIP49>(pub K, pub KeychainKind); impl> DescriptorTemplate for BIP49 { fn build(self) -> Result { @@ -271,24 +271,24 @@ impl> DescriptorTemplate for BIP49 { /// ``` /// # use std::str::FromStr; /// # use bdk::bitcoin::{PrivateKey, Network}; -/// # use bdk::{Wallet, OfflineWallet, ScriptType}; +/// # use bdk::{Wallet, OfflineWallet, KeychainKind}; /// # use bdk::database::MemoryDatabase; /// use bdk::template::BIP49Public; /// /// let key = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L")?; /// let fingerprint = bitcoin::util::bip32::Fingerprint::from_str("c55b303f")?; /// let wallet: OfflineWallet<_> = Wallet::new_offline( -/// BIP49Public(key.clone(), fingerprint, ScriptType::External), -/// Some(BIP49Public(key, fingerprint, ScriptType::Internal)), +/// BIP49Public(key.clone(), fingerprint, KeychainKind::External), +/// Some(BIP49Public(key, fingerprint, KeychainKind::Internal)), /// Network::Testnet, /// MemoryDatabase::default() /// )?; /// /// assert_eq!(wallet.get_new_address()?.to_string(), "2N3K4xbVAHoiTQSwxkZjWDfKoNC27pLkYnt"); -/// assert_eq!(wallet.public_descriptor(ScriptType::External)?.unwrap().to_string(), "sh(wpkh([c55b303f/49\'/0\'/0\']tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L/0/*))"); +/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "sh(wpkh([c55b303f/49\'/0\'/0\']tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L/0/*))"); /// # Ok::<_, Box>(()) /// ``` -pub struct BIP49Public>(pub K, pub bip32::Fingerprint, pub ScriptType); +pub struct BIP49Public>(pub K, pub bip32::Fingerprint, pub KeychainKind); impl> DescriptorTemplate for BIP49Public { fn build(self) -> Result { @@ -307,23 +307,23 @@ impl> DescriptorTemplate for BIP49Public { /// ``` /// # use std::str::FromStr; /// # use bdk::bitcoin::{PrivateKey, Network}; -/// # use bdk::{Wallet, OfflineWallet, ScriptType}; +/// # use bdk::{Wallet, OfflineWallet, KeychainKind}; /// # use bdk::database::MemoryDatabase; /// use bdk::template::BIP84; /// /// let key = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPeZRHk4rTG6orPS2CRNFX3njhUXx5vj9qGog5ZMH4uGReDWN5kCkY3jmWEtWause41CDvBRXD1shKknAMKxT99o9qUTRVC6m")?; /// let wallet: OfflineWallet<_> = Wallet::new_offline( -/// BIP84(key.clone(), ScriptType::External), -/// Some(BIP84(key, ScriptType::Internal)), +/// BIP84(key.clone(), KeychainKind::External), +/// Some(BIP84(key, KeychainKind::Internal)), /// Network::Testnet, /// MemoryDatabase::default() /// )?; /// /// assert_eq!(wallet.get_new_address()?.to_string(), "tb1qedg9fdlf8cnnqfd5mks6uz5w4kgpk2pr6y4qc7"); -/// assert_eq!(wallet.public_descriptor(ScriptType::External)?.unwrap().to_string(), "wpkh([c55b303f/84\'/0\'/0\']tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q/0/*)"); +/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "wpkh([c55b303f/84\'/0\'/0\']tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q/0/*)"); /// # Ok::<_, Box>(()) /// ``` -pub struct BIP84>(pub K, pub ScriptType); +pub struct BIP84>(pub K, pub KeychainKind); impl> DescriptorTemplate for BIP84 { fn build(self) -> Result { @@ -345,24 +345,24 @@ impl> DescriptorTemplate for BIP84 { /// ``` /// # use std::str::FromStr; /// # use bdk::bitcoin::{PrivateKey, Network}; -/// # use bdk::{Wallet, OfflineWallet, ScriptType}; +/// # use bdk::{Wallet, OfflineWallet, KeychainKind}; /// # use bdk::database::MemoryDatabase; /// use bdk::template::BIP84Public; /// /// let key = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q")?; /// let fingerprint = bitcoin::util::bip32::Fingerprint::from_str("c55b303f")?; /// let wallet: OfflineWallet<_> = Wallet::new_offline( -/// BIP84Public(key.clone(), fingerprint, ScriptType::External), -/// Some(BIP84Public(key, fingerprint, ScriptType::Internal)), +/// BIP84Public(key.clone(), fingerprint, KeychainKind::External), +/// Some(BIP84Public(key, fingerprint, KeychainKind::Internal)), /// Network::Testnet, /// MemoryDatabase::default() /// )?; /// /// assert_eq!(wallet.get_new_address()?.to_string(), "tb1qedg9fdlf8cnnqfd5mks6uz5w4kgpk2pr6y4qc7"); -/// assert_eq!(wallet.public_descriptor(ScriptType::External)?.unwrap().to_string(), "wpkh([c55b303f/84\'/0\'/0\']tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q/0/*)"); +/// assert_eq!(wallet.public_descriptor(KeychainKind::External)?.unwrap().to_string(), "wpkh([c55b303f/84\'/0\'/0\']tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q/0/*)"); /// # Ok::<_, Box>(()) /// ``` -pub struct BIP84Public>(pub K, pub bip32::Fingerprint, pub ScriptType); +pub struct BIP84Public>(pub K, pub bip32::Fingerprint, pub KeychainKind); impl> DescriptorTemplate for BIP84Public { fn build(self) -> Result { @@ -378,18 +378,18 @@ macro_rules! expand_make_bipxx { pub(super) fn make_bipxx_private>( bip: u32, key: K, - script_type: ScriptType, + keychain: KeychainKind, ) -> Result, KeyError> { let mut derivation_path = Vec::with_capacity(4); derivation_path.push(bip32::ChildNumber::from_hardened_idx(bip)?); derivation_path.push(bip32::ChildNumber::from_hardened_idx(0)?); derivation_path.push(bip32::ChildNumber::from_hardened_idx(0)?); - match script_type { - ScriptType::External => { + match keychain { + KeychainKind::External => { derivation_path.push(bip32::ChildNumber::from_normal_idx(0)?) } - ScriptType::Internal => { + KeychainKind::Internal => { derivation_path.push(bip32::ChildNumber::from_normal_idx(1)?) } }; @@ -402,11 +402,11 @@ macro_rules! expand_make_bipxx { bip: u32, key: K, parent_fingerprint: bip32::Fingerprint, - script_type: ScriptType, + keychain: KeychainKind, ) -> Result, KeyError> { - let derivation_path: bip32::DerivationPath = match script_type { - ScriptType::External => vec![bip32::ChildNumber::from_normal_idx(0)?].into(), - ScriptType::Internal => vec![bip32::ChildNumber::from_normal_idx(1)?].into(), + let derivation_path: bip32::DerivationPath = match keychain { + KeychainKind::External => vec![bip32::ChildNumber::from_normal_idx(0)?].into(), + KeychainKind::Internal => vec![bip32::ChildNumber::from_normal_idx(1)?].into(), }; let mut source_path = Vec::with_capacity(3); @@ -544,7 +544,7 @@ mod test { fn test_bip44_template() { let prvkey = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); check( - BIP44(prvkey, ScriptType::External).build(), + BIP44(prvkey, KeychainKind::External).build(), false, false, &[ @@ -554,7 +554,7 @@ mod test { ], ); check( - BIP44(prvkey, ScriptType::Internal).build(), + BIP44(prvkey, KeychainKind::Internal).build(), false, false, &[ @@ -571,7 +571,7 @@ mod test { let pubkey = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDDDzQ31JkZB7VxUr9bjvBivDdqoFLrDPyLWtLapArAi51ftfmCb2DPxwLQzX65iNcXz1DGaVvyvo6JQ6rTU73r2gqdEo8uov9QKRb7nKCSU").unwrap(); let fingerprint = bitcoin::util::bip32::Fingerprint::from_str("c55b303f").unwrap(); check( - BIP44Public(pubkey, fingerprint, ScriptType::External).build(), + BIP44Public(pubkey, fingerprint, KeychainKind::External).build(), false, false, &[ @@ -581,7 +581,7 @@ mod test { ], ); check( - BIP44Public(pubkey, fingerprint, ScriptType::Internal).build(), + BIP44Public(pubkey, fingerprint, KeychainKind::Internal).build(), false, false, &[ @@ -597,7 +597,7 @@ mod test { fn test_bip49_template() { let prvkey = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); check( - BIP49(prvkey, ScriptType::External).build(), + BIP49(prvkey, KeychainKind::External).build(), true, false, &[ @@ -607,7 +607,7 @@ mod test { ], ); check( - BIP49(prvkey, ScriptType::Internal).build(), + BIP49(prvkey, KeychainKind::Internal).build(), true, false, &[ @@ -624,7 +624,7 @@ mod test { let pubkey = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDC49r947KGK52X5rBWS4BLs5m9SRY3pYHnvRrm7HcybZ3BfdEsGFyzCMzayi1u58eT82ZeyFZwH7DD6Q83E3fM9CpfMtmnTygnLfP59jL9L").unwrap(); let fingerprint = bitcoin::util::bip32::Fingerprint::from_str("c55b303f").unwrap(); check( - BIP49Public(pubkey, fingerprint, ScriptType::External).build(), + BIP49Public(pubkey, fingerprint, KeychainKind::External).build(), true, false, &[ @@ -634,7 +634,7 @@ mod test { ], ); check( - BIP49Public(pubkey, fingerprint, ScriptType::Internal).build(), + BIP49Public(pubkey, fingerprint, KeychainKind::Internal).build(), true, false, &[ @@ -650,7 +650,7 @@ mod test { fn test_bip84_template() { let prvkey = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); check( - BIP84(prvkey, ScriptType::External).build(), + BIP84(prvkey, KeychainKind::External).build(), true, false, &[ @@ -660,7 +660,7 @@ mod test { ], ); check( - BIP84(prvkey, ScriptType::Internal).build(), + BIP84(prvkey, KeychainKind::Internal).build(), true, false, &[ @@ -677,7 +677,7 @@ mod test { let pubkey = bitcoin::util::bip32::ExtendedPubKey::from_str("tpubDC2Qwo2TFsaNC4ju8nrUJ9mqVT3eSgdmy1yPqhgkjwmke3PRXutNGRYAUo6RCHTcVQaDR3ohNU9we59brGHuEKPvH1ags2nevW5opEE9Z5Q").unwrap(); let fingerprint = bitcoin::util::bip32::Fingerprint::from_str("c55b303f").unwrap(); check( - BIP84Public(pubkey, fingerprint, ScriptType::External).build(), + BIP84Public(pubkey, fingerprint, KeychainKind::External).build(), true, false, &[ @@ -687,7 +687,7 @@ mod test { ], ); check( - BIP84Public(pubkey, fingerprint, ScriptType::Internal).build(), + BIP84Public(pubkey, fingerprint, KeychainKind::Internal).build(), true, false, &[ diff --git a/src/error.rs b/src/error.rs index 8273e0e7..825ece71 100644 --- a/src/error.rs +++ b/src/error.rs @@ -82,8 +82,8 @@ pub enum Error { Key(crate::keys::KeyError), /// Descriptor checksum mismatch ChecksumMismatch, - /// Spending policy is not compatible with this [`ScriptType`](crate::types::ScriptType) - SpendingPolicyRequired(crate::types::ScriptType), + /// Spending policy is not compatible with this [`KeychainKind`](crate::types::KeychainKind) + SpendingPolicyRequired(crate::types::KeychainKind), #[allow(missing_docs)] InvalidPolicyPathError(crate::descriptor::policy::PolicyError), #[allow(missing_docs)] diff --git a/src/types.rs b/src/types.rs index 61146cf1..07d344c5 100644 --- a/src/types.rs +++ b/src/types.rs @@ -31,27 +31,27 @@ use serde::{Deserialize, Serialize}; /// Types of script #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum ScriptType { +pub enum KeychainKind { /// External External = 0, /// Internal, usually used for change outputs Internal = 1, } -impl ScriptType { +impl KeychainKind { pub fn as_byte(&self) -> u8 { match self { - ScriptType::External => b'e', - ScriptType::Internal => b'i', + KeychainKind::External => b'e', + KeychainKind::Internal => b'i', } } } -impl AsRef<[u8]> for ScriptType { +impl AsRef<[u8]> for KeychainKind { fn as_ref(&self) -> &[u8] { match self { - ScriptType::External => b"e", - ScriptType::Internal => b"i", + KeychainKind::External => b"e", + KeychainKind::Internal => b"i", } } } @@ -94,7 +94,7 @@ impl std::default::Default for FeeRate { pub struct UTXO { pub outpoint: OutPoint, pub txout: TxOut, - pub script_type: ScriptType, + pub keychain: KeychainKind, } /// A wallet transaction diff --git a/src/wallet/address_validator.rs b/src/wallet/address_validator.rs index cb4087aa..391e2ad9 100644 --- a/src/wallet/address_validator.rs +++ b/src/wallet/address_validator.rs @@ -50,7 +50,7 @@ //! impl AddressValidator for PrintAddressAndContinue { //! fn validate( //! &self, -//! script_type: ScriptType, +//! keychain: KeychainKind, //! hd_keypaths: &HDKeyPaths, //! script: &Script //! ) -> Result<(), AddressValidatorError> { @@ -58,7 +58,7 @@ //! .as_ref() //! .map(Address::to_string) //! .unwrap_or(script.to_string()); -//! println!("New address of type {:?}: {}", script_type, address); +//! println!("New address of type {:?}: {}", keychain, address); //! println!("HD keypaths: {:#?}", hd_keypaths); //! //! Ok(()) @@ -79,7 +79,7 @@ use std::fmt; use bitcoin::Script; use crate::descriptor::HDKeyPaths; -use crate::types::ScriptType; +use crate::types::KeychainKind; /// Errors that can be returned to fail the validation of an address #[derive(Debug, Clone, PartialEq, Eq)] @@ -110,7 +110,7 @@ pub trait AddressValidator: Send + Sync { /// Validate or inspect an address fn validate( &self, - script_type: ScriptType, + keychain: KeychainKind, hd_keypaths: &HDKeyPaths, script: &Script, ) -> Result<(), AddressValidatorError>; @@ -128,7 +128,7 @@ mod test { impl AddressValidator for TestValidator { fn validate( &self, - _script_type: ScriptType, + _keychain: KeychainKind, _hd_keypaths: &HDKeyPaths, _script: &bitcoin::Script, ) -> Result<(), AddressValidatorError> { diff --git a/src/wallet/coin_selection.rs b/src/wallet/coin_selection.rs index 7f6656b0..c706ec9f 100644 --- a/src/wallet/coin_selection.rs +++ b/src/wallet/coin_selection.rs @@ -539,7 +539,7 @@ mod test { value: 100_000, script_pubkey: Script::new(), }, - script_type: ScriptType::External, + keychain: KeychainKind::External, }, P2WPKH_WITNESS_SIZE, ), @@ -553,7 +553,7 @@ mod test { value: 200_000, script_pubkey: Script::new(), }, - script_type: ScriptType::Internal, + keychain: KeychainKind::Internal, }, P2WPKH_WITNESS_SIZE, ), @@ -573,7 +573,7 @@ mod test { value: rng.gen_range(0, 200000000), script_pubkey: Script::new(), }, - script_type: ScriptType::External, + keychain: KeychainKind::External, }, P2WPKH_WITNESS_SIZE, )); @@ -592,7 +592,7 @@ mod test { value: utxos_value, script_pubkey: Script::new(), }, - script_type: ScriptType::External, + keychain: KeychainKind::External, }, P2WPKH_WITNESS_SIZE, ); diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index 8621d192..caaef8ff 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -124,7 +124,7 @@ where ) -> Result { let (descriptor, keymap) = descriptor.to_wallet_descriptor(network)?; database.check_descriptor_checksum( - ScriptType::External, + KeychainKind::External, get_checksum(&descriptor.to_string())?.as_bytes(), )?; let signers = Arc::new(SignersContainer::from(keymap)); @@ -132,7 +132,7 @@ where Some(desc) => { let (change_descriptor, change_keymap) = desc.to_wallet_descriptor(network)?; database.check_descriptor_checksum( - ScriptType::Internal, + KeychainKind::Internal, get_checksum(&change_descriptor.to_string())?.as_bytes(), )?; @@ -166,7 +166,7 @@ where /// Return a newly generated address using the external descriptor pub fn get_new_address(&self) -> Result { - let index = self.fetch_and_increment_index(ScriptType::External)?; + let index = self.fetch_and_increment_index(KeychainKind::External)?; let deriv_ctx = descriptor_to_pk_ctx(&self.secp); self.descriptor @@ -215,14 +215,14 @@ where /// See [the `signer` module](signer) for an example. pub fn add_signer( &mut self, - script_type: ScriptType, + keychain: KeychainKind, id: SignerId, ordering: SignerOrdering, signer: Arc, ) { - let signers = match script_type { - ScriptType::External => Arc::make_mut(&mut self.signers), - ScriptType::Internal => Arc::make_mut(&mut self.change_signers), + let signers = match keychain { + KeychainKind::External => Arc::make_mut(&mut self.signers), + KeychainKind::Internal => Arc::make_mut(&mut self.change_signers), }; signers.add_external(id, ordering, signer); @@ -278,7 +278,7 @@ where && external_policy.requires_path() && builder.external_policy_path.is_none() { - return Err(Error::SpendingPolicyRequired(ScriptType::External)); + return Err(Error::SpendingPolicyRequired(KeychainKind::External)); }; // Same for the internal_policy path, if present if let Some(internal_policy) = &internal_policy { @@ -286,7 +286,7 @@ where && internal_policy.requires_path() && builder.internal_policy_path.is_none() { - return Err(Error::SpendingPolicyRequired(ScriptType::Internal)); + return Err(Error::SpendingPolicyRequired(KeychainKind::Internal)); }; } @@ -571,18 +571,17 @@ where None => { let mut change_output = None; for (index, txout) in tx.output.iter().enumerate() { - // look for an output that we know and that has the right ScriptType. We use - // `get_descriptor_for` to find what's the ScriptType for `Internal` + // look for an output that we know and that has the right KeychainKind. We use + // `get_descriptor_for` to find what's the KeychainKind for `Internal` // addresses really is, because if there's no change_descriptor it's actually equal // to "External" - let (_, change_type) = - self.get_descriptor_for_script_type(ScriptType::Internal); + let (_, change_type) = self.get_descriptor_for_keychain(KeychainKind::Internal); match self .database .borrow() .get_path_from_script_pubkey(&txout.script_pubkey)? { - Some((script_type, _)) if script_type == change_type => { + Some((keychain, _)) if keychain == change_type => { change_output = Some(index); break; } @@ -628,31 +627,31 @@ where .get_previous_output(&txin.previous_output)? .ok_or(Error::UnknownUTXO)?; - let (weight, script_type) = match self + let (weight, keychain) = match self .database .borrow() .get_path_from_script_pubkey(&txout.script_pubkey)? { - Some((script_type, _)) => ( - self.get_descriptor_for_script_type(script_type) + Some((keychain, _)) => ( + self.get_descriptor_for_keychain(keychain) .0 .max_satisfaction_weight(deriv_ctx) .unwrap(), - script_type, + keychain, ), None => { // estimate the weight based on the scriptsig/witness size present in the // original transaction let weight = serialize(&txin.script_sig).len() * 4 + serialize(&txin.witness).len(); - (weight, ScriptType::External) + (weight, KeychainKind::External) } }; let utxo = UTXO { outpoint: txin.previous_output, txout, - script_type, + keychain, }; Ok((utxo, weight)) @@ -824,13 +823,13 @@ where } /// Return the spending policies for the wallet's descriptor - pub fn policies(&self, script_type: ScriptType) -> Result, Error> { - match (script_type, self.change_descriptor.as_ref()) { - (ScriptType::External, _) => { + pub fn policies(&self, keychain: KeychainKind) -> Result, Error> { + match (keychain, self.change_descriptor.as_ref()) { + (KeychainKind::External, _) => { Ok(self.descriptor.extract_policy(&self.signers, &self.secp)?) } - (ScriptType::Internal, None) => Ok(None), - (ScriptType::Internal, Some(desc)) => { + (KeychainKind::Internal, None) => Ok(None), + (KeychainKind::Internal, Some(desc)) => { Ok(desc.extract_policy(&self.change_signers, &self.secp)?) } } @@ -842,12 +841,12 @@ where /// This can be used to build a watch-only version of a wallet pub fn public_descriptor( &self, - script_type: ScriptType, + keychain: KeychainKind, ) -> Result, Error> { - match (script_type, self.change_descriptor.as_ref()) { - (ScriptType::External, _) => Ok(Some(self.descriptor.clone())), - (ScriptType::Internal, None) => Ok(None), - (ScriptType::Internal, Some(desc)) => Ok(Some(desc.clone())), + match (keychain, self.change_descriptor.as_ref()) { + (KeychainKind::External, _) => Ok(Some(self.descriptor.clone())), + (KeychainKind::Internal, None) => Ok(None), + (KeychainKind::Internal, Some(desc)) => Ok(Some(desc.clone())), } } @@ -880,7 +879,7 @@ where ); // - Try to derive the descriptor by looking at the txout. If it's in our database, we - // know exactly which `script_type` to use, and which derivation index it is + // know exactly which `keychain` to use, and which derivation index it is // - If that fails, try to derive it by looking at the psbt input: the complete logic // is in `src/descriptor/mod.rs`, but it will basically look at `hd_keypaths`, // `redeem_script` and `witness_script` to determine the right derivation @@ -941,16 +940,16 @@ where // Internals - fn get_descriptor_for_script_type( + fn get_descriptor_for_keychain( &self, - script_type: ScriptType, - ) -> (&ExtendedDescriptor, ScriptType) { - match script_type { - ScriptType::Internal if self.change_descriptor.is_some() => ( + keychain: KeychainKind, + ) -> (&ExtendedDescriptor, KeychainKind) { + match keychain { + KeychainKind::Internal if self.change_descriptor.is_some() => ( self.change_descriptor.as_ref().unwrap(), - ScriptType::Internal, + KeychainKind::Internal, ), - _ => (&self.descriptor, ScriptType::External), + _ => (&self.descriptor, KeychainKind::External), } } @@ -959,38 +958,35 @@ where .database .borrow() .get_path_from_script_pubkey(&txout.script_pubkey)? - .map(|(script_type, child)| (self.get_descriptor_for_script_type(script_type).0, child)) + .map(|(keychain, child)| (self.get_descriptor_for_keychain(keychain).0, child)) .map(|(desc, child)| desc.derive(ChildNumber::from_normal_idx(child).unwrap()))) } fn get_change_address(&self) -> Result { let deriv_ctx = descriptor_to_pk_ctx(&self.secp); - let (desc, script_type) = self.get_descriptor_for_script_type(ScriptType::Internal); - let index = self.fetch_and_increment_index(script_type)?; + let (desc, keychain) = self.get_descriptor_for_keychain(KeychainKind::Internal); + let index = self.fetch_and_increment_index(keychain)?; Ok(desc .derive(ChildNumber::from_normal_idx(index)?) .script_pubkey(deriv_ctx)) } - fn fetch_and_increment_index(&self, script_type: ScriptType) -> Result { - let (descriptor, script_type) = self.get_descriptor_for_script_type(script_type); + fn fetch_and_increment_index(&self, keychain: KeychainKind) -> Result { + let (descriptor, keychain) = self.get_descriptor_for_keychain(keychain); let index = match descriptor.is_fixed() { true => 0, - false => self - .database - .borrow_mut() - .increment_last_index(script_type)?, + false => self.database.borrow_mut().increment_last_index(keychain)?, }; if self .database .borrow() - .get_script_pubkey_from_path(script_type, index)? + .get_script_pubkey_from_path(keychain, index)? .is_none() { - self.cache_addresses(script_type, index, CACHE_ADDR_BATCH_SIZE)?; + self.cache_addresses(keychain, index, CACHE_ADDR_BATCH_SIZE)?; } let deriv_ctx = descriptor_to_pk_ctx(&self.secp); @@ -1000,7 +996,7 @@ where .derive(ChildNumber::from_normal_idx(index)?) .script_pubkey(deriv_ctx); for validator in &self.address_validators { - validator.validate(script_type, &hd_keypaths, &script)?; + validator.validate(keychain, &hd_keypaths, &script)?; } Ok(index) @@ -1008,11 +1004,11 @@ where fn cache_addresses( &self, - script_type: ScriptType, + keychain: KeychainKind, from: u32, mut count: u32, ) -> Result<(), Error> { - let (descriptor, script_type) = self.get_descriptor_for_script_type(script_type); + let (descriptor, keychain) = self.get_descriptor_for_keychain(keychain); if descriptor.is_fixed() { if from > 0 { return Ok(()); @@ -1031,7 +1027,7 @@ where &descriptor .derive(ChildNumber::from_normal_idx(i)?) .script_pubkey(deriv_ctx), - script_type, + keychain, i, )?; } @@ -1054,10 +1050,10 @@ where .list_unspent()? .into_iter() .map(|utxo| { - let script_type = utxo.script_type; + let keychain = utxo.keychain; ( utxo, - self.get_descriptor_for_script_type(script_type) + self.get_descriptor_for_keychain(keychain) .0 .max_satisfaction_weight(deriv_ctx) .unwrap(), @@ -1201,7 +1197,7 @@ where // Try to find the prev_script in our db to figure out if this is internal or external, // and the derivation index - let (script_type, child) = match self + let (keychain, child) = match self .database .borrow() .get_path_from_script_pubkey(&utxo.txout.script_pubkey)? @@ -1210,7 +1206,7 @@ where None => continue, }; - let (desc, _) = self.get_descriptor_for_script_type(script_type); + let (desc, _) = self.get_descriptor_for_keychain(keychain); psbt_input.hd_keypaths = desc.get_hd_keypaths(child, &self.secp)?; let derived_descriptor = desc.derive(ChildNumber::from_normal_idx(child)?); @@ -1238,12 +1234,12 @@ where .iter_mut() .zip(psbt.global.unsigned_tx.output.iter()) { - if let Some((script_type, child)) = self + if let Some((keychain, child)) = self .database .borrow() .get_path_from_script_pubkey(&tx_output.script_pubkey)? { - let (desc, _) = self.get_descriptor_for_script_type(script_type); + let (desc, _) = self.get_descriptor_for_keychain(keychain); psbt_output.hd_keypaths = desc.get_hd_keypaths(child, &self.secp)?; if builder.include_output_redeem_witness_script { let derived_descriptor = desc.derive(ChildNumber::from_normal_idx(child)?); @@ -1265,15 +1261,15 @@ where // try to add hd_keypaths if we've already seen the output for (psbt_input, out) in psbt.inputs.iter_mut().zip(input_utxos.iter()) { if let Some(out) = out { - if let Some((script_type, child)) = self + if let Some((keychain, child)) = self .database .borrow() .get_path_from_script_pubkey(&out.script_pubkey)? { - debug!("Found descriptor {:?}/{}", script_type, child); + debug!("Found descriptor {:?}/{}", keychain, child); // merge hd_keypaths - let (desc, _) = self.get_descriptor_for_script_type(script_type); + let (desc, _) = self.get_descriptor_for_keychain(keychain); let mut hd_keypaths = desc.get_hd_keypaths(child, &self.secp)?; psbt_input.hd_keypaths.append(&mut hd_keypaths); } @@ -1324,11 +1320,11 @@ where if self .database .borrow() - .get_script_pubkey_from_path(ScriptType::External, max_address.saturating_sub(1))? + .get_script_pubkey_from_path(KeychainKind::External, max_address.saturating_sub(1))? .is_none() { run_setup = true; - self.cache_addresses(ScriptType::External, 0, max_address)?; + self.cache_addresses(KeychainKind::External, 0, max_address)?; } if let Some(change_descriptor) = &self.change_descriptor { @@ -1340,11 +1336,11 @@ where if self .database .borrow() - .get_script_pubkey_from_path(ScriptType::Internal, max_address.saturating_sub(1))? + .get_script_pubkey_from_path(KeychainKind::Internal, max_address.saturating_sub(1))? .is_none() { run_setup = true; - self.cache_addresses(ScriptType::Internal, 0, max_address)?; + self.cache_addresses(KeychainKind::Internal, 0, max_address)?; } } @@ -1396,7 +1392,7 @@ mod test { use crate::database::memory::MemoryDatabase; use crate::database::Database; - use crate::types::ScriptType; + use crate::types::KeychainKind; use super::*; @@ -1423,13 +1419,13 @@ mod test { assert!(wallet .database .borrow_mut() - .get_script_pubkey_from_path(ScriptType::External, 0) + .get_script_pubkey_from_path(KeychainKind::External, 0) .unwrap() .is_some()); assert!(wallet .database .borrow_mut() - .get_script_pubkey_from_path(ScriptType::Internal, 0) + .get_script_pubkey_from_path(KeychainKind::Internal, 0) .unwrap() .is_none()); } @@ -1451,13 +1447,13 @@ mod test { assert!(wallet .database .borrow_mut() - .get_script_pubkey_from_path(ScriptType::External, CACHE_ADDR_BATCH_SIZE - 1) + .get_script_pubkey_from_path(KeychainKind::External, CACHE_ADDR_BATCH_SIZE - 1) .unwrap() .is_some()); assert!(wallet .database .borrow_mut() - .get_script_pubkey_from_path(ScriptType::External, CACHE_ADDR_BATCH_SIZE) + .get_script_pubkey_from_path(KeychainKind::External, CACHE_ADDR_BATCH_SIZE) .unwrap() .is_none()); } @@ -1474,7 +1470,7 @@ mod test { assert!(wallet .database .borrow_mut() - .get_script_pubkey_from_path(ScriptType::External, CACHE_ADDR_BATCH_SIZE - 1) + .get_script_pubkey_from_path(KeychainKind::External, CACHE_ADDR_BATCH_SIZE - 1) .unwrap() .is_some()); @@ -1485,7 +1481,7 @@ mod test { assert!(wallet .database .borrow_mut() - .get_script_pubkey_from_path(ScriptType::External, CACHE_ADDR_BATCH_SIZE * 2 - 1) + .get_script_pubkey_from_path(KeychainKind::External, CACHE_ADDR_BATCH_SIZE * 2 - 1) .unwrap() .is_some()); } @@ -2280,7 +2276,7 @@ mod test { fn test_create_tx_policy_path_no_csv() { let (wallet, _, _) = get_funded_wallet(get_test_a_or_b_plus_csv()); - let external_policy = wallet.policies(ScriptType::External).unwrap().unwrap(); + let external_policy = wallet.policies(KeychainKind::External).unwrap().unwrap(); let root_id = external_policy.id; // child #0 is just the key "A" let path = vec![(root_id, vec![0])].into_iter().collect(); @@ -2289,7 +2285,7 @@ mod test { let (psbt, _) = wallet .create_tx( TxBuilder::with_recipients(vec![(addr.script_pubkey(), 30_000)]) - .policy_path(path, ScriptType::External), + .policy_path(path, KeychainKind::External), ) .unwrap(); @@ -2300,7 +2296,7 @@ mod test { fn test_create_tx_policy_path_use_csv() { let (wallet, _, _) = get_funded_wallet(get_test_a_or_b_plus_csv()); - let external_policy = wallet.policies(ScriptType::External).unwrap().unwrap(); + let external_policy = wallet.policies(KeychainKind::External).unwrap().unwrap(); let root_id = external_policy.id; // child #1 is or(pk(B),older(144)) let path = vec![(root_id, vec![1])].into_iter().collect(); @@ -2309,7 +2305,7 @@ mod test { let (psbt, _) = wallet .create_tx( TxBuilder::with_recipients(vec![(addr.script_pubkey(), 30_000)]) - .policy_path(path, ScriptType::External), + .policy_path(path, KeychainKind::External), ) .unwrap(); diff --git a/src/wallet/signer.rs b/src/wallet/signer.rs index c2cbef02..43cff45a 100644 --- a/src/wallet/signer.rs +++ b/src/wallet/signer.rs @@ -81,7 +81,7 @@ //! let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)"; //! let mut wallet: OfflineWallet<_> = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?; //! wallet.add_signer( -//! ScriptType::External, +//! KeychainKind::External, //! Fingerprint::from_str("e30f11b8").unwrap().into(), //! SignerOrdering(200), //! Arc::new(custom_signer) diff --git a/src/wallet/tx_builder.rs b/src/wallet/tx_builder.rs index aad24899..d2e67421 100644 --- a/src/wallet/tx_builder.rs +++ b/src/wallet/tx_builder.rs @@ -51,7 +51,7 @@ use bitcoin::{OutPoint, Script, SigHashType, Transaction}; use super::coin_selection::{CoinSelectionAlgorithm, DefaultCoinSelectionAlgorithm}; use crate::database::Database; -use crate::types::{FeeRate, ScriptType, UTXO}; +use crate::types::{FeeRate, KeychainKind, UTXO}; /// Context in which the [`TxBuilder`] is valid pub trait TxBuilderContext: std::fmt::Debug + Default + Clone {} @@ -215,17 +215,17 @@ impl, Ctx: TxBuilderContext> TxBuilde /// path.insert("aabbccdd".to_string(), vec![0, 1]); /// /// let builder = TxBuilder::with_recipients(vec![(to_address.script_pubkey(), 50_000)]) - /// .policy_path(path, ScriptType::External); + /// .policy_path(path, KeychainKind::External); /// # let builder: TxBuilder = builder; /// ``` pub fn policy_path( mut self, policy_path: BTreeMap>, - script_type: ScriptType, + keychain: KeychainKind, ) -> Self { - let to_update = match script_type { - ScriptType::Internal => &mut self.internal_policy_path, - ScriptType::External => &mut self.external_policy_path, + let to_update = match keychain { + KeychainKind::Internal => &mut self.internal_policy_path, + KeychainKind::External => &mut self.external_policy_path, }; *to_update = Some(policy_path); @@ -566,8 +566,8 @@ impl ChangeSpendPolicy { pub(crate) fn is_satisfied_by(&self, utxo: &UTXO) -> bool { match self { ChangeSpendPolicy::ChangeAllowed => true, - ChangeSpendPolicy::OnlyChange => utxo.script_type == ScriptType::Internal, - ChangeSpendPolicy::ChangeForbidden => utxo.script_type == ScriptType::External, + ChangeSpendPolicy::OnlyChange => utxo.keychain == KeychainKind::Internal, + ChangeSpendPolicy::ChangeForbidden => utxo.keychain == KeychainKind::External, } } } @@ -662,7 +662,7 @@ mod test { vout: 0, }, txout: Default::default(), - script_type: ScriptType::External, + keychain: KeychainKind::External, }, UTXO { outpoint: OutPoint { @@ -670,7 +670,7 @@ mod test { vout: 1, }, txout: Default::default(), - script_type: ScriptType::Internal, + keychain: KeychainKind::Internal, }, ] } @@ -695,7 +695,7 @@ mod test { .collect::>(); assert_eq!(filtered.len(), 1); - assert_eq!(filtered[0].script_type, ScriptType::External); + assert_eq!(filtered[0].keychain, KeychainKind::External); } #[test] @@ -707,7 +707,7 @@ mod test { .collect::>(); assert_eq!(filtered.len(), 1); - assert_eq!(filtered[0].script_type, ScriptType::Internal); + assert_eq!(filtered[0].keychain, KeychainKind::Internal); } #[test] diff --git a/testutils-macros/src/lib.rs b/testutils-macros/src/lib.rs index 87b586cc..fcc6d480 100644 --- a/testutils-macros/src/lib.rs +++ b/testutils-macros/src/lib.rs @@ -82,7 +82,7 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream use #root_ident::blockchain::{Blockchain, noop_progress}; use #root_ident::descriptor::ExtendedDescriptor; use #root_ident::database::MemoryDatabase; - use #root_ident::types::ScriptType; + use #root_ident::types::KeychainKind; use #root_ident::{Wallet, TxBuilder, FeeRate}; use super::*; @@ -120,7 +120,7 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream wallet.sync(noop_progress(), None).unwrap(); assert_eq!(wallet.get_balance().unwrap(), 50_000); - assert_eq!(wallet.list_unspent().unwrap()[0].script_type, ScriptType::External); + assert_eq!(wallet.list_unspent().unwrap()[0].keychain, KeychainKind::External); let list_tx_item = &wallet.list_transactions(false).unwrap()[0]; assert_eq!(list_tx_item.txid, txid); From 9b31ae9153e590d06835f5e49ffb643116334c26 Mon Sep 17 00:00:00 2001 From: LLFourn Date: Tue, 15 Dec 2020 08:39:19 +1100 Subject: [PATCH 2/2] Fix doc comment fallout from s/script type/keychain --- src/database/mod.rs | 22 +++++++++++----------- src/wallet/tx_builder.rs | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/database/mod.rs b/src/database/mod.rs index 7c48783a..33ec7ccf 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -57,7 +57,7 @@ pub use memory::MemoryDatabase; /// This trait defines the list of operations that must be implemented on the [`Database`] type and /// the [`BatchDatabase::Batch`] type. pub trait BatchOperations { - /// Store a script_pubkey along with its script type and child number + /// Store a script_pubkey along with its keychain and child number. fn set_script_pubkey( &mut self, script: &Script, @@ -70,17 +70,17 @@ pub trait BatchOperations { fn set_raw_tx(&mut self, transaction: &Transaction) -> Result<(), Error>; /// Store the metadata of a transaction fn set_tx(&mut self, transaction: &TransactionDetails) -> Result<(), Error>; - /// Store the last derivation index for a given script type + /// Store the last derivation index for a given keychain. fn set_last_index(&mut self, keychain: KeychainKind, value: u32) -> Result<(), Error>; - /// Delete a script_pubkey given the script type and its child number + /// Delete a script_pubkey given the keychain and its child number. fn del_script_pubkey_from_path( &mut self, keychain: KeychainKind, child: u32, ) -> Result, Error>; - /// Delete the data related to a specific script_pubkey, meaning the script type and the child - /// number + /// Delete the data related to a specific script_pubkey, meaning the keychain and the child + /// number. fn del_path_from_script_pubkey( &mut self, script: &Script, @@ -95,7 +95,7 @@ pub trait BatchOperations { txid: &Txid, include_raw: bool, ) -> Result, Error>; - /// Delete the last derivation index for a script type + /// Delete the last derivation index for a keychain. fn del_last_index(&mut self, keychain: KeychainKind) -> Result, Error>; } @@ -103,7 +103,7 @@ pub trait BatchOperations { /// /// This traits defines the operations that can be used to read data out of a database pub trait Database: BatchOperations { - /// Read and checks the descriptor checksum for a given script type + /// Read and checks the descriptor checksum for a given keychain. /// /// Should return [`Error::ChecksumMismatch`](crate::error::Error::ChecksumMismatch) if the /// checksum doesn't match. If there's no checksum in the database, simply store it for the @@ -123,13 +123,13 @@ pub trait Database: BatchOperations { /// Return the list of transactions metadata fn iter_txs(&self, include_raw: bool) -> Result, Error>; - /// Fetch a script_pubkey given the script type and child number + /// Fetch a script_pubkey given the child number of a keychain. fn get_script_pubkey_from_path( &self, keychain: KeychainKind, child: u32, ) -> Result, Error>; - /// Fetch the script type and child number of a given script_pubkey + /// Fetch the keychain and child number of a given script_pubkey fn get_path_from_script_pubkey( &self, script: &Script, @@ -140,10 +140,10 @@ pub trait Database: BatchOperations { fn get_raw_tx(&self, txid: &Txid) -> Result, Error>; /// Fetch the transaction metadata and optionally also the raw transaction fn get_tx(&self, txid: &Txid, include_raw: bool) -> Result, Error>; - /// Return the last defivation index for a script type + /// Return the last defivation index for a keychain. fn get_last_index(&self, keychain: KeychainKind) -> Result, Error>; - /// Increment the last derivation index for a script type and returns it + /// Increment the last derivation index for a keychain and return it /// /// It should insert and return `0` if not present in the database fn increment_last_index(&mut self, keychain: KeychainKind) -> Result; diff --git a/src/wallet/tx_builder.rs b/src/wallet/tx_builder.rs index d2e67421..2ad9b761 100644 --- a/src/wallet/tx_builder.rs +++ b/src/wallet/tx_builder.rs @@ -163,7 +163,7 @@ impl, Ctx: TxBuilderContext> TxBuilde self } - /// Set the policy path to use while creating the transaction for a given script type + /// Set the policy path to use while creating the transaction for a given keychain. /// /// This method accepts a map where the key is the policy node id (see /// [`Policy::id`](crate::descriptor::Policy::id)) and the value is the list of the indexes of