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>
36 lines
826 B
Rust
36 lines
826 B
Rust
#![doc = include_str!("../README.md")]
|
|
use bdk_chain::{BlockId, ConfirmationTimeAnchor};
|
|
use esplora_client::TxStatus;
|
|
|
|
pub use esplora_client;
|
|
|
|
#[cfg(feature = "blocking")]
|
|
mod blocking_ext;
|
|
#[cfg(feature = "blocking")]
|
|
pub use blocking_ext::*;
|
|
|
|
#[cfg(feature = "async")]
|
|
mod async_ext;
|
|
#[cfg(feature = "async")]
|
|
pub use async_ext::*;
|
|
|
|
const ASSUME_FINAL_DEPTH: u32 = 15;
|
|
|
|
fn anchor_from_status(status: &TxStatus) -> Option<ConfirmationTimeAnchor> {
|
|
if let TxStatus {
|
|
block_height: Some(height),
|
|
block_hash: Some(hash),
|
|
block_time: Some(time),
|
|
..
|
|
} = status.clone()
|
|
{
|
|
Some(ConfirmationTimeAnchor {
|
|
anchor_block: BlockId { height, hash },
|
|
confirmation_height: height,
|
|
confirmation_time: time,
|
|
})
|
|
} else {
|
|
None
|
|
}
|
|
}
|