LLFourn / bdk_core_staging

Staging area for bdk_core initial development
15 stars 12 forks source link

`KeychainTxOutIndex::script_pubkeys_of_keychain` might be broken #136

Closed danielabrozzoni closed 1 year ago

danielabrozzoni commented 1 year ago

I think I've found a bug on the KeychainTxOutIndex: when I call script_pubkeys_of_all_keychains I get back a map like { KeychainExternal: [ spk0, spk1, spk2, ... ] }, but if I call script_pubkeys_of_keychain(&Keychain::External) I get back an empty iterator. Is there something I'm missing?

My code:

    let spk_iterators = keychain_tracker
        .txout_index
        .script_pubkeys_of_all_keychains()
        .into_iter()
        .map(|(keychain, iter)| {
            let mut first = true;
            (
                keychain,
                iter.take(10)
                    .inspect(move |(i, _)| {
                        if first {
                            eprint!("\nscanning {}: ", keychain);
                            first = false;
                        }

                        eprint!("{} ", i);
                    })
                    .collect::<Vec<_>>(),
            )
        })
        .collect::<Vec<_>>();
    // Prints ( External, [ spk1, spk2, spk3, ...] )
    dbg!(spk_iterators);
    let spks = keychain_tracker
        .txout_index
        .script_pubkeys_of_keychain(&Keychain::External)
        .take(10)
        .inspect(move |(i, _)| {
            let mut first = true;
            if first {
                eprint!("\nscanning external (hardcoded): ");
                first = false;
            }

            eprint!("{} ", i);
        })
        .map(|(_, k)| k.clone());
    // Prints []
    dbg!(&spks.collect::<Vec<_>>());
evanlinjin commented 1 year ago

As proposed on Discord, I think we should have 4 methods:

pub fn scripts_of_all_keychains() {}
pub fn scripts_of_keychain() {}
pub fn stored_scripts_of_all_keychains() {}
pub fn stored_scripts_of_keychain() {}