@@ -207,14 +207,16 @@ const DEFAULT_LOOKAHEAD: u32 = 25;
207207#[ derive( Clone ,  Debug ) ]  
208208pub  struct  KeychainTxOutIndex < K >  { 
209209    inner :  SpkTxOutIndex < ( DescriptorId ,  u32 ) > , 
210-     // keychain -> (descriptor, descriptor id) map 
211-     keychains_to_descriptors :  BTreeMap < K ,  ( DescriptorId ,  Descriptor < DescriptorPublicKey > ) > , 
212-     // descriptor id -> keychain set 
213-     // Because different keychains can have the same descriptor, we rank keychains by `Ord` so that 
214-     // that the first keychain variant (according to `Ord`) has the highest rank. When associated 
215-     // data (such as spks, outpoints) are returned with a keychain, we return the highest-ranked 
216-     // keychain with it. 
217-     descriptor_ids_to_keychain_set :  HashMap < DescriptorId ,  BTreeSet < K > > , 
210+     // keychain -> descriptor_id map 
211+     keychains_to_descriptor_ids :  BTreeMap < K ,  DescriptorId > , 
212+     // descriptor_id -> keychain set 
213+     // This is a reverse map of `keychains_to_descriptors`. Although there is only one descriptor 
214+     // per keychain, different keychains can refer to the same descriptor, therefore we have a set 
215+     // of keychains per descriptor. When associated data (such as spks, outpoints) are returned with 
216+     // a keychain, we return it with the highest-ranked keychain with it. We rank keychains by 
217+     // `Ord`, therefore the keychain set is a `BTreeSet`. The earliest keychain variant (according 
218+     // to `Ord`) has precedence. 
219+     descriptor_ids_to_keychains :  HashMap < DescriptorId ,  BTreeSet < K > > , 
218220    // descriptor_id -> descriptor map 
219221    // This is a "monotone" map, meaning that its size keeps growing, i.e., we never delete 
220222    // descriptors from it. This is useful for revealing spks for descriptors that don't have 
@@ -289,8 +291,8 @@ impl<K> KeychainTxOutIndex<K> {
289291     pub  fn  new ( lookahead :  u32 )  -> Self  { 
290292        Self  { 
291293            inner :  SpkTxOutIndex :: default ( ) , 
292-             keychains_to_descriptors :  BTreeMap :: new ( ) , 
293-             descriptor_ids_to_keychain_set :  HashMap :: new ( ) , 
294+             keychains_to_descriptor_ids :  BTreeMap :: new ( ) , 
295+             descriptor_ids_to_keychains :  HashMap :: new ( ) , 
294296            descriptor_ids_to_descriptors :  BTreeMap :: new ( ) , 
295297            last_revealed :  BTreeMap :: new ( ) , 
296298            lookahead, 
@@ -302,7 +304,7 @@ impl<K> KeychainTxOutIndex<K> {
302304impl < K :  Clone  + Ord  + Debug >  KeychainTxOutIndex < K >  { 
303305    /// Get the highest-ranked keychain that is currently associated with the given `desc_id`. 
304306     fn  keychain_of_desc_id ( & self ,  desc_id :  & DescriptorId )  -> Option < & K >  { 
305-         let  keychains = self . descriptor_ids_to_keychain_set . get ( desc_id) ?; 
307+         let  keychains = self . descriptor_ids_to_keychains . get ( desc_id) ?; 
306308        keychains. iter ( ) . next ( ) 
307309    } 
308310
@@ -362,7 +364,7 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
362364     /// 
363365     /// This calls [`SpkTxOutIndex::spk_at_index`] internally. 
364366     pub  fn  spk_at_index ( & self ,  keychain :  K ,  index :  u32 )  -> Option < & Script >  { 
365-         let  descriptor_id = self . keychains_to_descriptors . get ( & keychain) ?. 0 ; 
367+         let  descriptor_id = * self . keychains_to_descriptor_ids . get ( & keychain) ?; 
366368        self . inner . spk_at_index ( & ( descriptor_id,  index) ) 
367369    } 
368370
@@ -382,7 +384,7 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
382384     /// 
383385     /// This calls [`SpkTxOutIndex::is_used`] internally. 
384386     pub  fn  is_used ( & self ,  keychain :  K ,  index :  u32 )  -> bool  { 
385-         let  descriptor_id = self . keychains_to_descriptors . get ( & keychain) . map ( |k| k . 0 ) ; 
387+         let  descriptor_id = self . keychains_to_descriptor_ids . get ( & keychain) . copied ( ) ; 
386388        match  descriptor_id { 
387389            Some ( descriptor_id)  => self . inner . is_used ( & ( descriptor_id,  index) ) , 
388390            None  => false , 
@@ -406,7 +408,7 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
406408     /// 
407409     /// [`unmark_used`]: Self::unmark_used 
408410     pub  fn  mark_used ( & mut  self ,  keychain :  K ,  index :  u32 )  -> bool  { 
409-         let  descriptor_id = self . keychains_to_descriptors . get ( & keychain) . map ( |k| k . 0 ) ; 
411+         let  descriptor_id = self . keychains_to_descriptor_ids . get ( & keychain) . copied ( ) ; 
410412        match  descriptor_id { 
411413            Some ( descriptor_id)  => self . inner . mark_used ( & ( descriptor_id,  index) ) , 
412414            None  => false , 
@@ -423,7 +425,7 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
423425     /// 
424426     /// [`mark_used`]: Self::mark_used 
425427     pub  fn  unmark_used ( & mut  self ,  keychain :  K ,  index :  u32 )  -> bool  { 
426-         let  descriptor_id = self . keychains_to_descriptors . get ( & keychain) . map ( |k| k . 0 ) ; 
428+         let  descriptor_id = self . keychains_to_descriptor_ids . get ( & keychain) . copied ( ) ; 
427429        match  descriptor_id { 
428430            Some ( descriptor_id)  => self . inner . unmark_used ( & ( descriptor_id,  index) ) , 
429431            None  => false , 
@@ -462,9 +464,13 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
462464        & self , 
463465    )  -> impl  DoubleEndedIterator < Item  = ( & K ,  & Descriptor < DescriptorPublicKey > ) >  + ExactSizeIterator  + ' _ 
464466    { 
465-         self . keychains_to_descriptors 
466-             . iter ( ) 
467-             . map ( |( k,  ( _,  d) ) | ( k,  d) ) 
467+         self . keychains_to_descriptor_ids . iter ( ) . map ( |( k,  desc_id) | { 
468+             let  descriptor = self 
469+                 . descriptor_ids_to_descriptors 
470+                 . get ( desc_id) 
471+                 . expect ( "descriptor id cannot be associated with keychain without descriptor" ) ; 
472+             ( k,  descriptor) 
473+         } ) 
468474    } 
469475
470476    /// Insert a descriptor with a keychain associated to it. 
@@ -483,11 +489,11 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
483489        let  mut  changeset = super :: ChangeSet :: < K > :: default ( ) ; 
484490        let  desc_id = descriptor. descriptor_id ( ) ; 
485491
486-         let  old_desc  = self 
487-             . keychains_to_descriptors 
488-             . insert ( keychain. clone ( ) ,  ( desc_id,  descriptor . clone ( ) ) ) ; 
492+         let  old_desc_id  = self 
493+             . keychains_to_descriptor_ids 
494+             . insert ( keychain. clone ( ) ,  desc_id) ; 
489495
490-         if  let  Some ( ( old_desc_id,  _ ) )  = old_desc  { 
496+         if  let  Some ( old_desc_id)  = old_desc_id  { 
491497            // nothing needs to be done if caller reinsterted the same descriptor under the same 
492498            // keychain 
493499            if  old_desc_id == desc_id { 
@@ -497,14 +503,14 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
497503            // is designed to track one descriptor per keychain (however different keychains can 
498504            // share the same descriptor) 
499505            let  _is_keychain_removed = self 
500-                 . descriptor_ids_to_keychain_set 
506+                 . descriptor_ids_to_keychains 
501507                . get_mut ( & old_desc_id) 
502508                . expect ( "we must have already inserted this descriptor" ) 
503509                . remove ( & keychain) ; 
504510            debug_assert ! ( _is_keychain_removed) ; 
505511        } 
506512
507-         self . descriptor_ids_to_keychain_set 
513+         self . descriptor_ids_to_keychains 
508514            . entry ( desc_id) 
509515            . or_default ( ) 
510516            . insert ( keychain. clone ( ) ) ; 
@@ -521,7 +527,13 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
521527    /// Gets the descriptor associated with the keychain. Returns `None` if the keychain doesn't 
522528     /// have a descriptor associated with it. 
523529     pub  fn  get_descriptor ( & self ,  keychain :  & K )  -> Option < & Descriptor < DescriptorPublicKey > >  { 
524-         self . keychains_to_descriptors . get ( keychain) . map ( |( _,  d) | d) 
530+         self . keychains_to_descriptor_ids 
531+             . get ( keychain) 
532+             . map ( |desc_id| { 
533+                 self . descriptor_ids_to_descriptors 
534+                     . get ( desc_id) 
535+                     . expect ( "descriptor id cannot be associated with keychain without descriptor" ) 
536+             } ) 
525537    } 
526538
527539    /// Get the lookahead setting. 
@@ -549,8 +561,13 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
549561    } 
550562
551563    fn  replenish_lookahead ( & mut  self ,  keychain :  & K ,  lookahead :  u32 )  { 
552-         let  descriptor_opt = self . keychains_to_descriptors . get ( keychain) . cloned ( ) ; 
553-         if  let  Some ( ( descriptor_id,  descriptor) )  = descriptor_opt { 
564+         let  descriptor_id = self . keychains_to_descriptor_ids . get ( keychain) . copied ( ) ; 
565+         if  let  Some ( descriptor_id)  = descriptor_id { 
566+             let  descriptor = self 
567+                 . descriptor_ids_to_descriptors 
568+                 . get ( & descriptor_id) 
569+                 . expect ( "descriptor id cannot be associated with keychain without descriptor" ) ; 
570+ 
554571            let  next_store_index = self . next_store_index ( descriptor_id) ; 
555572            let  next_reveal_index = self . last_revealed . get ( & descriptor_id) . map_or ( 0 ,  |v| * v + 1 ) ; 
556573
@@ -580,17 +597,29 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
580597        & self , 
581598        keychain :  & K , 
582599    )  -> Option < SpkIterator < Descriptor < DescriptorPublicKey > > >  { 
583-         let  descriptor = self . keychains_to_descriptors . get ( keychain) ?. 1 . clone ( ) ; 
584-         Some ( SpkIterator :: new ( descriptor) ) 
600+         let  desc_id = self . keychains_to_descriptor_ids . get ( keychain) ?; 
601+         let  desc = self 
602+             . descriptor_ids_to_descriptors 
603+             . get ( desc_id) 
604+             . cloned ( ) 
605+             . expect ( "descriptor id cannot be associated with keychain without descriptor" ) ; 
606+         Some ( SpkIterator :: new ( desc) ) 
585607    } 
586608
587609    /// Get unbounded spk iterators for all keychains. 
588610     pub  fn  all_unbounded_spk_iters ( 
589611        & self , 
590612    )  -> BTreeMap < K ,  SpkIterator < Descriptor < DescriptorPublicKey > > >  { 
591-         self . keychains_to_descriptors 
613+         self . keychains_to_descriptor_ids 
592614            . iter ( ) 
593-             . map ( |( k,  ( _,  descriptor) ) | ( k. clone ( ) ,  SpkIterator :: new ( descriptor. clone ( ) ) ) ) 
615+             . map ( |( k,  desc_id) | { 
616+                 let  desc = self 
617+                     . descriptor_ids_to_descriptors 
618+                     . get ( desc_id) 
619+                     . cloned ( ) 
620+                     . expect ( "descriptor id cannot be associated with keychain without descriptor" ) ; 
621+                 ( k. clone ( ) ,  SpkIterator :: new ( desc) ) 
622+             } ) 
594623            . collect ( ) 
595624    } 
596625
@@ -599,9 +628,9 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
599628        & self , 
600629        range :  impl  RangeBounds < K > , 
601630    )  -> impl  DoubleEndedIterator < Item  = ( & K ,  u32 ,  & Script ) >  + Clone  { 
602-         self . keychains_to_descriptors 
631+         self . keychains_to_descriptor_ids 
603632            . range ( range) 
604-             . flat_map ( |( _,  ( descriptor_id,  _ ) ) | { 
633+             . flat_map ( |( _,  descriptor_id) | { 
605634                let  start = Bound :: Included ( ( * descriptor_id,  u32:: MIN ) ) ; 
606635                let  end = match  self . last_revealed . get ( descriptor_id)  { 
607636                    Some ( last_revealed)  => Bound :: Included ( ( * descriptor_id,  * last_revealed) ) , 
@@ -633,10 +662,12 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
633662
634663    /// Iterate over revealed, but unused, spks of all keychains. 
635664     pub  fn  unused_spks ( & self )  -> impl  DoubleEndedIterator < Item  = ( K ,  u32 ,  & Script ) >  + Clone  { 
636-         self . keychains_to_descriptors . keys ( ) . flat_map ( |keychain| { 
637-             self . unused_keychain_spks ( keychain) 
638-                 . map ( |( i,  spk) | ( keychain. clone ( ) ,  i,  spk) ) 
639-         } ) 
665+         self . keychains_to_descriptor_ids 
666+             . keys ( ) 
667+             . flat_map ( |keychain| { 
668+                 self . unused_keychain_spks ( keychain) 
669+                     . map ( |( i,  spk) | ( keychain. clone ( ) ,  i,  spk) ) 
670+             } ) 
640671    } 
641672
642673    /// Iterate over revealed, but unused, spks of the given `keychain`. 
@@ -646,9 +677,9 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
646677        keychain :  & K , 
647678    )  -> impl  DoubleEndedIterator < Item  = ( u32 ,  & Script ) >  + Clone  { 
648679        let  desc_id = self 
649-             . keychains_to_descriptors 
680+             . keychains_to_descriptor_ids 
650681            . get ( keychain) 
651-             . map ( | ( desc_id ,  _ ) |  * desc_id ) 
682+             . cloned ( ) 
652683            // We use a dummy desc id if we can't find the real one in our map. In this way, 
653684            // if this method was to be called with a non-existent keychain, we would return an 
654685            // empty iterator 
@@ -672,7 +703,11 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
672703     /// 
673704     /// Returns None if the provided `keychain` doesn't exist. 
674705     pub  fn  next_index ( & self ,  keychain :  & K )  -> Option < ( u32 ,  bool ) >  { 
675-         let  ( descriptor_id,  descriptor)  = self . keychains_to_descriptors . get ( keychain) ?; 
706+         let  descriptor_id = self . keychains_to_descriptor_ids . get ( keychain) ?; 
707+         let  descriptor = self 
708+             . descriptor_ids_to_descriptors 
709+             . get ( descriptor_id) 
710+             . expect ( "descriptor id cannot be associated with keychain without descriptor" ) ; 
676711        let  last_index = self . last_revealed . get ( descriptor_id) . cloned ( ) ; 
677712
678713        // we can only get the next index if the wildcard exists. 
@@ -709,8 +744,8 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
709744    /// Get the last derivation index revealed for `keychain`. Returns None if the keychain doesn't 
710745     /// exist, or if the keychain doesn't have any revealed scripts. 
711746     pub  fn  last_revealed_index ( & self ,  keychain :  & K )  -> Option < u32 >  { 
712-         let  descriptor_id = self . keychains_to_descriptors . get ( keychain) ?. 0 ; 
713-         self . last_revealed . get ( & descriptor_id) . cloned ( ) 
747+         let  descriptor_id = self . keychains_to_descriptor_ids . get ( keychain) ?; 
748+         self . last_revealed . get ( descriptor_id) . cloned ( ) 
714749    } 
715750
716751    /// Convenience method to call [`Self::reveal_to_target`] on multiple keychains. 
@@ -816,8 +851,8 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
816851        SpkIterator < Descriptor < DescriptorPublicKey > > , 
817852        super :: ChangeSet < K > , 
818853    ) >  { 
819-         let  descriptor_id = self . keychains_to_descriptors . get ( keychain) ?. 0 ; 
820-         self . reveal_to_target_with_id ( descriptor_id,  target_index) 
854+         let  descriptor_id = self . keychains_to_descriptor_ids . get ( keychain) ?; 
855+         self . reveal_to_target_with_id ( * descriptor_id,  target_index) 
821856    } 
822857
823858    /// Attempts to reveal the next script pubkey for `keychain`. 
@@ -836,7 +871,7 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
836871        & mut  self , 
837872        keychain :  & K , 
838873    )  -> Option < ( ( u32 ,  & Script ) ,  super :: ChangeSet < K > ) >  { 
839-         let  descriptor_id = self . keychains_to_descriptors . get ( keychain) ? . 0 ; 
874+         let  descriptor_id = self . keychains_to_descriptor_ids . get ( keychain) . cloned ( ) ? ; 
840875        let  ( next_index,  _)  = self . next_index ( keychain) . expect ( "We know keychain exists" ) ; 
841876        let  changeset = self 
842877            . reveal_to_target ( keychain,  next_index) 
@@ -908,9 +943,9 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
908943        bound :  impl  RangeBounds < K > , 
909944    )  -> impl  RangeBounds < ( DescriptorId ,  u32 ) >  { 
910945        let  get_desc_id = |keychain| { 
911-             self . keychains_to_descriptors 
946+             self . keychains_to_descriptor_ids 
912947                . get ( keychain) 
913-                 . map ( | ( desc_id ,  _ ) |  * desc_id ) 
948+                 . copied ( ) 
914949                . unwrap_or_else ( || DescriptorId :: from_byte_array ( [ 0 ;  32 ] ) ) 
915950        } ; 
916951        let  start = match  bound. start_bound ( )  { 
@@ -936,7 +971,7 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
936971    /// Returns the highest derivation index of each keychain that [`KeychainTxOutIndex`] has found 
937972     /// a [`TxOut`] with it's script pubkey. 
938973     pub  fn  last_used_indices ( & self )  -> BTreeMap < K ,  u32 >  { 
939-         self . keychains_to_descriptors 
974+         self . keychains_to_descriptor_ids 
940975            . iter ( ) 
941976            . filter_map ( |( keychain,  _) | { 
942977                self . last_used_index ( keychain) 
0 commit comments