Syncing/Rescanning super issue
There seems to be quite a few independent efforts to define and address problems with the syncing/scanning API. I thought it would be nice to organize them in one place and have a single PR that does all of them.
- Rename "scan" to "rescan": Anything that is using
stop_gapstyle scanning must necessarily be assuming that another wallet must have given out addresses prior to this one. The namerescancommunicates this better (h/t @danielabrozzoni). Related #1112. - (#1153) We should have data structures defined in
bdk_chainthat define bundles of things aWallet(or any other system) could be interested in. I think these should be:
/// A list of blockchain entities for which we want to receive any related transaction data.
struct SyncRequest {
/// transactions that spend from or two these script pubkeys
spks: Vec<ScriptBuf>,
/// Transactions with these txids
txids: Vec<Txid>,
/// Transactions with these outpoints or spend from these outpoints
outpoints: Vec<OutPoint>,
/// The local chain checkpoint. The sync process will return a new chain that extends this one.
checkpoint: Option<CheckPoint>
}
/// Script pubkeys indexed by their keychain.
struct RescanRequest<K, I> {
/// Iterators of script pubkeys indexed by the keychain index
spks_by_keychain: BTreeMap<K,I>,
/// The local chain checkpoint. The scan process will return a new chain that extends this one.
checkpoint: Option<CheckPoint>
}
- Now the problem with the above is that we want to be able to easy log when a new spk etc is drawn by the blockchain. So really we can't have these fields public -- internally each thing should be
Box<dyn Iterator<Item = ...>>. Then when you add a new items to theSyncRequestit should be something likeSyncRequest::append_spks(&mut self, spks: impl IntoIterator<Item=ScriptBuf>)which would append the new iterator onto the existing one withchainand replace it. - Then we need APIs in wallet that return these structs (https://github.com/bitcoindevkit/bdk/issues/1195)
We will discuss on this on Tues at the call but your recommendations above all look good to me. I'll start updating #1194 unless anyone has already started working on it or thinks it'd be better to start a new PR.
Given Evan's PR (#1178 ), I believe the checkpoint fields on both structs don't have to be an option anymore.
Adding this draft PR to the discussion: https://github.com/vladimirfomene/bdk/pull/2
completed with #1403