@@ -95,7 +95,8 @@ impl<K> Default for ChangeSet<K> {
95
95
}
96
96
}
97
97
98
- const DEFAULT_LOOKAHEAD : u32 = 25 ;
98
+ /// The default lookahead for a [`KeychainTxOutIndex`]
99
+ pub const DEFAULT_LOOKAHEAD : u32 = 25 ;
99
100
100
101
/// [`KeychainTxOutIndex`] controls how script pubkeys are revealed for multiple keychains, and
101
102
/// indexes [`TxOut`]s with them.
@@ -121,15 +122,17 @@ const DEFAULT_LOOKAHEAD: u32 = 25;
121
122
/// above the last revealed index. These additionally-derived script pubkeys are called the
122
123
/// lookahead.
123
124
///
124
- /// The [`KeychainTxOutIndex`] is constructed with the `lookahead` and cannot be altered. The
125
- /// default `lookahead` count is 1000. Use [`new`] to set a custom `lookahead`.
125
+ /// The [`KeychainTxOutIndex`] is constructed with the `lookahead` and cannot be altered. See
126
+ /// [`DEFAULT_LOOKAHEAD`] for the value used in the `Default` implementation. Use [`new`] to set a
127
+ /// custom `lookahead`.
126
128
///
127
129
/// # Unbounded script pubkey iterator
128
130
///
129
131
/// For script-pubkey-based chain sources (such as Electrum/Esplora), an initial scan is best done
130
132
/// by iterating though derived script pubkeys one by one and requesting transaction histories for
131
133
/// each script pubkey. We will stop after x-number of script pubkeys have empty histories. An
132
- /// unbounded script pubkey iterator is useful to pass to such a chain source.
134
+ /// unbounded script pubkey iterator is useful to pass to such a chain source because it doesn't
135
+ /// require holding a reference to the index.
133
136
///
134
137
/// Call [`unbounded_spk_iter`] to get an unbounded script pubkey iterator for a given keychain.
135
138
/// Call [`all_unbounded_spk_iters`] to get unbounded script pubkey iterators for all keychains.
@@ -162,42 +165,14 @@ const DEFAULT_LOOKAHEAD: u32 = 25;
162
165
/// # let (external_descriptor,_) = Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, "tr([73c5da0a/86'/0'/0']xprv9xgqHN7yz9MwCkxsBPN5qetuNdQSUttZNKw1dcYTV4mkaAFiBVGQziHs3NRSWMkCzvgjEe3n9xV8oYywvM8at9yRqyaZVz6TYYhX98VjsUk/0/*)").unwrap();
163
166
/// # let (internal_descriptor,_) = Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, "tr([73c5da0a/86'/0'/0']xprv9xgqHN7yz9MwCkxsBPN5qetuNdQSUttZNKw1dcYTV4mkaAFiBVGQziHs3NRSWMkCzvgjEe3n9xV8oYywvM8at9yRqyaZVz6TYYhX98VjsUk/1/*)").unwrap();
164
167
/// # let (descriptor_42, _) = Descriptor::<DescriptorPublicKey>::parse_descriptor(&secp, "tr([73c5da0a/86'/0'/0']xprv9xgqHN7yz9MwCkxsBPN5qetuNdQSUttZNKw1dcYTV4mkaAFiBVGQziHs3NRSWMkCzvgjEe3n9xV8oYywvM8at9yRqyaZVz6TYYhX98VjsUk/2/*)").unwrap();
165
- /// let _ = txout_index.insert_descriptor(MyKeychain::External, external_descriptor);
166
- /// let _ = txout_index.insert_descriptor(MyKeychain::Internal, internal_descriptor);
167
- /// let _ = txout_index.insert_descriptor(MyKeychain::MyAppUser { user_id: 42 }, descriptor_42);
168
+ /// let _ = txout_index.insert_descriptor(MyKeychain::External, external_descriptor)? ;
169
+ /// let _ = txout_index.insert_descriptor(MyKeychain::Internal, internal_descriptor)? ;
170
+ /// let _ = txout_index.insert_descriptor(MyKeychain::MyAppUser { user_id: 42 }, descriptor_42)? ;
168
171
///
169
172
/// let new_spk_for_user = txout_index.reveal_next_spk(&MyKeychain::MyAppUser{ user_id: 42 });
173
+ /// # Ok::<_, bdk_chain::keychain::InsertDescriptorError<_>>(())
170
174
/// ```
171
175
///
172
- /// # Non-recommend keychain to descriptor assignments
173
- ///
174
- /// A keychain (`K`) is used to identify a descriptor. However, the following keychain to descriptor
175
- /// arrangements result in behavior that is harder to reason about and is not recommended.
176
- ///
177
- /// ## Multiple keychains identifying the same descriptor
178
- ///
179
- /// Although a single keychain variant can only identify a single descriptor, multiple keychain
180
- /// variants can identify the same descriptor.
181
- ///
182
- /// If multiple keychains identify the same descriptor:
183
- /// 1. Methods that take in a keychain (such as [`reveal_next_spk`]) will work normally when any
184
- /// keychain (that identifies that descriptor) is passed in.
185
- /// 2. Methods that return data which associates with a descriptor (such as [`outpoints`],
186
- /// [`txouts`], [`unused_spks`], etc.) the method will return the highest-ranked keychain variant
187
- /// that identifies the descriptor. Rank is determined by the [`Ord`] implementation of the keychain
188
- /// type.
189
- ///
190
- /// This arrangement is not recommended since some methods will return a single keychain variant
191
- /// even though multiple keychain variants identify the same descriptor.
192
- ///
193
- /// ## Reassigning the descriptor of a single keychain
194
- ///
195
- /// Descriptors added to [`KeychainTxOutIndex`] are never removed. However, a keychain that
196
- /// identifies a descriptor can be reassigned to identify a different descriptor. This may result in
197
- /// a situation where a descriptor has no associated keychain(s), and relevant [`TxOut`]s,
198
- /// [`OutPoint`]s and [`Script`]s (of that descriptor) will not be return by [`KeychainTxOutIndex`].
199
- /// Therefore, reassigning the descriptor of a single keychain is not recommended.
200
- ///
201
176
/// [`Ord`]: core::cmp::Ord
202
177
/// [`SpkTxOutIndex`]: crate::spk_txout_index::SpkTxOutIndex
203
178
/// [`Descriptor`]: crate::miniscript::Descriptor
0 commit comments