]> Untitled Git - bdk/commitdiff
[signer] Add `Signer::id()`
authorAlekos Filini <alekos.filini@gmail.com>
Mon, 25 Jan 2021 20:04:56 +0000 (15:04 -0500)
committerAlekos Filini <alekos.filini@gmail.com>
Wed, 27 Jan 2021 16:43:28 +0000 (11:43 -0500)
Closes #261

CHANGELOG.md
src/wallet/mod.rs
src/wallet/signer.rs

index be5968221d508ce8f2f0b9a695e6438b716cf1e8..6a52513881c090ad69525a7ea27a9487d38576d6 100644 (file)
@@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 #### Added
 - Added a function to get the version of BDK at runtime
 
+### Wallet
+#### Changed
+- Removed the explicit `id` argument from `Wallet::add_signer()` since that's now part of `Signer` itself
+
 ## [v0.3.0] - [v0.2.0]
 
 ### Descriptor
index 1a82f16f18393d57665c7bb8bf684ed1c2d1caf4..cabb9b422ac40c94fcdcc3cf2add42403dcfd657 100644 (file)
@@ -57,7 +57,7 @@ pub(crate) mod utils;
 pub use utils::IsDust;
 
 use address_validator::AddressValidator;
-use signer::{Signer, SignerId, SignerOrdering, SignersContainer};
+use signer::{Signer, SignerOrdering, SignersContainer};
 use tx_builder::{BumpFee, CreateTx, FeePolicy, TxBuilder, TxBuilderContext};
 use utils::{
     check_nlocktime, check_nsequence_rbf, descriptor_to_pk_ctx, After, Older, SecpCtx,
@@ -228,7 +228,6 @@ where
     pub fn add_signer(
         &mut self,
         keychain: KeychainKind,
-        id: SignerId,
         ordering: SignerOrdering,
         signer: Arc<dyn Signer>,
     ) {
@@ -237,7 +236,7 @@ where
             KeychainKind::Internal => Arc::make_mut(&mut self.change_signers),
         };
 
-        signers.add_external(id, ordering, signer);
+        signers.add_external(signer.id(&self.secp), ordering, signer);
     }
 
     /// Add an address validator
index 650bdf2662e2d8547b6a5357ec6a10e9f0c81f0d..8d0a70d8266271047ee9bd8f1ba4e07cd05ae03d 100644 (file)
@@ -33,7 +33,6 @@
 //! # use bitcoin::secp256k1::{Secp256k1, All};
 //! # use bitcoin::*;
 //! # use bitcoin::util::psbt;
-//! # use bitcoin::util::bip32::Fingerprint;
 //! # use bdk::signer::*;
 //! # use bdk::database::*;
 //! # use bdk::*;
@@ -46,6 +45,9 @@
 //! #     fn connect() -> Self {
 //! #         CustomHSM
 //! #     }
+//! #     fn get_id(&self) -> SignerId {
+//! #         SignerId::Dummy(0)
+//! #     }
 //! # }
 //! #[derive(Debug)]
 //! struct CustomSigner {
 //!         Ok(())
 //!     }
 //!
+//!     fn id(&self, _secp: &Secp256k1<All>) -> SignerId {
+//!         self.device.get_id()
+//!     }
+//!
 //!     fn sign_whole_tx(&self) -> bool {
 //!         false
 //!     }
@@ -82,7 +88,6 @@
 //! let mut wallet = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;
 //! wallet.add_signer(
 //!     KeychainKind::External,
-//!     Fingerprint::from_str("e30f11b8").unwrap().into(),
 //!     SignerOrdering(200),
 //!     Arc::new(custom_signer)
 //! );
@@ -118,6 +123,8 @@ pub enum SignerId {
     PkHash(hash160::Hash),
     /// The fingerprint of a BIP32 extended key
     Fingerprint(Fingerprint),
+    /// Dummy identifier
+    Dummy(u64),
 }
 
 impl From<hash160::Hash> for SignerId {
@@ -184,6 +191,12 @@ pub trait Signer: fmt::Debug + Send + Sync {
     /// input individually
     fn sign_whole_tx(&self) -> bool;
 
+    /// Return the [`SignerId`] for this signer
+    ///
+    /// The [`SignerId`] can be used to lookup a signer in the [`Wallet`](crate::Wallet)'s signers map or to
+    /// compare two signers.
+    fn id(&self, secp: &SecpCtx) -> SignerId;
+
     /// Return the secret key for the signer
     ///
     /// This is used internally to reconstruct the original descriptor that may contain secrets.
@@ -234,6 +247,10 @@ impl Signer for DescriptorXKey<ExtendedPrivKey> {
         false
     }
 
+    fn id(&self, secp: &SecpCtx) -> SignerId {
+        SignerId::from(self.root_fingerprint(&secp))
+    }
+
     fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
         Some(DescriptorSecretKey::XPrv(self.clone()))
     }
@@ -285,6 +302,10 @@ impl Signer for PrivateKey {
         false
     }
 
+    fn id(&self, secp: &SecpCtx) -> SignerId {
+        SignerId::from(self.public_key(secp).to_pubkeyhash())
+    }
+
     fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
         Some(DescriptorSecretKey::SinglePriv(DescriptorSinglePriv {
             key: *self,
@@ -345,12 +366,7 @@ impl From<KeyMap> for SignersContainer {
         for (_, secret) in keymap {
             match secret {
                 DescriptorSecretKey::SinglePriv(private_key) => container.add_external(
-                    SignerId::from(
-                        private_key
-                            .key
-                            .public_key(&Secp256k1::signing_only())
-                            .to_pubkeyhash(),
-                    ),
+                    SignerId::from(private_key.key.public_key(&secp).to_pubkeyhash()),
                     SignerOrdering::default(),
                     Arc::new(private_key.key),
                 ),
@@ -650,6 +666,10 @@ mod signers_container_tests {
             Ok(())
         }
 
+        fn id(&self, _secp: &SecpCtx) -> SignerId {
+            SignerId::Dummy(42)
+        }
+
         fn sign_whole_tx(&self) -> bool {
             true
         }