]> Untitled Git - bdk/commitdiff
Replace BTreeMap with a HashMap
authorEvgenii P <eupn@protonmail.com>
Sun, 13 Dec 2020 11:37:27 +0000 (18:37 +0700)
committerEvgenii P <eupn@protonmail.com>
Sun, 13 Dec 2020 11:37:27 +0000 (18:37 +0700)
src/wallet/signer.rs

index ec08e3265760843c9c55088016e79defd1dc6c7c..1b3904428c6f69bbf5775511a42be42f07bf2b09 100644 (file)
@@ -91,9 +91,8 @@
 //! ```
 
 use std::cmp::Ordering;
-use std::collections::BTreeMap;
+use std::collections::HashMap;
 use std::fmt;
-use std::ops::Bound::Included;
 use std::sync::Arc;
 
 use bitcoin::blockdata::opcodes;
@@ -249,6 +248,8 @@ impl Signer for PrivateKey {
             return Err(SignerError::InputIndexOutOfRange);
         }
 
+        println!("Partial sigs: {:?}", psbt.inputs[input_index].partial_sigs);
+
         let pubkey = self.public_key(&secp);
         if psbt.inputs[input_index].partial_sigs.contains_key(&pubkey) {
             return Ok(());
@@ -296,7 +297,7 @@ impl Signer for PrivateKey {
 /// The default value is `100`. Signers with an ordering above that will be called later,
 /// and they will thus see the partial signatures added to the transaction once they get to sign
 /// themselves.
-#[derive(Debug, Clone, PartialOrd, PartialEq, Ord, Eq)]
+#[derive(Debug, Clone, Hash, PartialOrd, PartialEq, Ord, Eq)]
 pub struct SignerOrdering(pub usize);
 
 impl std::default::Default for SignerOrdering {
@@ -305,7 +306,7 @@ impl std::default::Default for SignerOrdering {
     }
 }
 
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, Hash, Eq, PartialEq)]
 struct SignersContainerKey {
     id: SignerId,
     ordering: SignerOrdering,
@@ -322,7 +323,7 @@ impl From<(SignerId, SignerOrdering)> for SignersContainerKey {
 
 /// Container for multiple signers
 #[derive(Debug, Default, Clone)]
-pub struct SignersContainer(BTreeMap<SignersContainerKey, Arc<dyn Signer>>);
+pub struct SignersContainer(HashMap<SignersContainerKey, Arc<dyn Signer>>);
 
 impl SignersContainer {
     pub fn as_key_map(&self, secp: &SecpCtx) -> KeyMap {
@@ -340,7 +341,7 @@ impl From<KeyMap> for SignersContainer {
         let mut container = SignersContainer::new();
 
         for (_, secret) in keymap {
-            match secret {
+            let previous = match secret {
                 DescriptorSecretKey::SinglePriv(private_key) => container.add_external(
                     SignerId::from(
                         private_key
@@ -357,6 +358,10 @@ impl From<KeyMap> for SignersContainer {
                     Arc::new(xprv),
                 ),
             };
+
+            if let Some(previous) = previous {
+                println!("This signer was replaced: {:?}", previous)
+            }
         }
 
         container
@@ -377,7 +382,13 @@ impl SignersContainer {
         ordering: SignerOrdering,
         signer: Arc<dyn Signer>,
     ) -> Option<Arc<dyn Signer>> {
-        self.0.insert((id, ordering).into(), signer)
+
+        println!("Adding external signer ID = {:?}", id);
+        let key = (id, ordering).into();
+        println!("With a key: {:?}", key);
+        let res = self.0.insert(key, signer);
+        println!("After insertion, len = {}", self.0.values().len());
+        res
     }
 
     /// Removes a signer from the container and returns it
@@ -395,18 +406,20 @@ impl SignersContainer {
 
     /// Returns the list of signers in the container, sorted by lowest to highest `ordering`
     pub fn signers(&self) -> Vec<&Arc<dyn Signer>> {
-        self.0.values().collect()
+        let mut items = self.0.iter().collect::<Vec<_>>();
+        items.sort_by(|(a, _), (b, _)| (*a).cmp(*b));
+
+        items.into_iter().map(|(_, v)| v).collect()
     }
 
     /// Finds the signer with lowest ordering for a given id in the container.
     pub fn find(&self, id: SignerId) -> Option<&Arc<dyn Signer>> {
-        self.0
-            .range((
-                Included(&(id.clone(), SignerOrdering(0)).into()),
-                Included(&(id, SignerOrdering(usize::MAX)).into()),
-            ))
+        self.0.iter()
+            .filter(|(key, _)| key.id == id)
+            .min_by(|(k_a, _), (k_b, _)| {
+                k_a.cmp(k_b)
+            })
             .map(|(_, v)| v)
-            .next()
     }
 }
 
@@ -525,11 +538,3 @@ impl Ord for SignersContainerKey {
         self.ordering.cmp(&other.ordering)
     }
 }
-
-impl PartialEq for SignersContainerKey {
-    fn eq(&self, other: &Self) -> bool {
-        self.ordering == other.ordering
-    }
-}
-
-impl Eq for SignersContainerKey {}