This commit changes the `LocalChain` implementation to have blocks stored as a linked-list. This allows the data-src thread to hold a shared ref to a single checkpoint and have access to the whole history of checkpoints without cloning or keeping a lock on `LocalChain`. The APIs of `bdk::Wallet`, `esplora` and `electrum` are also updated to reflect these changes. Note that the `esplora` crate is rewritten to anchor txs in the confirmation block (using the esplora API's tx status block_hash). This guarantees 100% consistency between anchor blocks and their transactions (instead of anchoring txs to the latest tip). `ExploraExt` now has separate methods for updating the `TxGraph` and `LocalChain`. A new method `TxGraph::missing_blocks` is introduced for finding "floating anchors" of a `TxGraph` update (given a chain). Additional changes: * `test_local_chain.rs` is refactored to make test cases easier to write. Additional tests are also added. * Examples are updated. * Fix `tempfile` dev dependency of `bdk_file_store` to work with MSRV Co-authored-by: LLFourn <lloyd.fourn@gmail.com>
64 lines
1.8 KiB
Rust
64 lines
1.8 KiB
Rust
#[allow(unused_macros)]
|
|
macro_rules! h {
|
|
($index:literal) => {{
|
|
bitcoin::hashes::Hash::hash($index.as_bytes())
|
|
}};
|
|
}
|
|
|
|
#[allow(unused_macros)]
|
|
macro_rules! local_chain {
|
|
[ $(($height:expr, $block_hash:expr)), * ] => {{
|
|
#[allow(unused_mut)]
|
|
bdk_chain::local_chain::LocalChain::from_blocks([$(($height, $block_hash).into()),*].into_iter().collect())
|
|
}};
|
|
}
|
|
|
|
#[allow(unused_macros)]
|
|
macro_rules! chain_update {
|
|
[ $(($height:expr, $hash:expr)), * ] => {{
|
|
#[allow(unused_mut)]
|
|
bdk_chain::local_chain::Update {
|
|
tip: bdk_chain::local_chain::LocalChain::from_blocks([$(($height, $hash).into()),*].into_iter().collect())
|
|
.tip()
|
|
.expect("must have tip"),
|
|
introduce_older_blocks: true,
|
|
}
|
|
}};
|
|
}
|
|
|
|
#[allow(unused_macros)]
|
|
macro_rules! changeset {
|
|
(checkpoints: $($tail:tt)*) => { changeset!(index: TxHeight, checkpoints: $($tail)*) };
|
|
(
|
|
index: $ind:ty,
|
|
checkpoints: [ $(( $height:expr, $cp_to:expr )),* ]
|
|
$(,txids: [ $(( $txid:expr, $tx_to:expr )),* ])?
|
|
) => {{
|
|
use bdk_chain::collections::BTreeMap;
|
|
|
|
#[allow(unused_mut)]
|
|
bdk_chain::sparse_chain::ChangeSet::<$ind> {
|
|
checkpoints: {
|
|
let mut changes = BTreeMap::default();
|
|
$(changes.insert($height, $cp_to);)*
|
|
changes
|
|
},
|
|
txids: {
|
|
let mut changes = BTreeMap::default();
|
|
$($(changes.insert($txid, $tx_to.map(|h: TxHeight| h.into()));)*)?
|
|
changes
|
|
}
|
|
}
|
|
}};
|
|
}
|
|
|
|
#[allow(unused)]
|
|
pub fn new_tx(lt: u32) -> bitcoin::Transaction {
|
|
bitcoin::Transaction {
|
|
version: 0x00,
|
|
lock_time: bitcoin::PackedLockTime(lt),
|
|
input: vec![],
|
|
output: vec![],
|
|
}
|
|
}
|