fix: docs and some minor refactoring
Shout out to @LLFourn for these suggestions. * Improve/fix `LocalChain` documentation * Refactor `TxGraph::missing_blocks` to make it more explicit that `last_block` has state. * `update_local_chain` method of `EsploraExt` and `EsploraAsyncExt` now returns a `local_chain::Update` instead of just a `CheckPoint`.
This commit is contained in:
		
							parent
							
								
									8bf7a997f7
								
							
						
					
					
						commit
						95312d4d05
					
				| @ -113,17 +113,25 @@ impl IntoIterator for CheckPoint { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Represents an update to [`LocalChain`].
 | /// A struct to update [`LocalChain`].
 | ||||||
|  | ///
 | ||||||
|  | /// This is used as input for [`LocalChain::apply_update`]. It contains the update's chain `tip` and
 | ||||||
|  | /// a `bool` which signals whether this update can introduce blocks below the original chain's tip
 | ||||||
|  | /// without invalidating blocks residing on the original chain. Block-by-block syncing mechanisms
 | ||||||
|  | /// would typically create updates that builds upon the previous tip. In this case, this paramater
 | ||||||
|  | /// would be `false`. Script-pubkey based syncing mechanisms may not introduce transactions in a
 | ||||||
|  | /// chronological order so some updates require introducing older blocks (to anchor older
 | ||||||
|  | /// transactions). For script-pubkey based syncing, this parameter would typically be `true`.
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub struct Update { | pub struct Update { | ||||||
|     /// The update's new [`CheckPoint`] tip.
 |     /// The update chain's new tip.
 | ||||||
|     pub tip: CheckPoint, |     pub tip: CheckPoint, | ||||||
| 
 | 
 | ||||||
|     /// Whether the update allows for introducing older blocks.
 |     /// Whether the update allows for introducing older blocks.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// Refer to [`LocalChain::apply_update`] for more.
 |     /// Refer to [struct-level documentation] for more.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// [`LocalChain::apply_update`]: crate::local_chain::LocalChain::apply_update
 |     /// [struct-level documentation]: Update
 | ||||||
|     pub introduce_older_blocks: bool, |     pub introduce_older_blocks: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -146,12 +154,6 @@ impl From<LocalChain> for BTreeMap<u32, BlockHash> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl From<ChangeSet> for LocalChain { |  | ||||||
|     fn from(value: ChangeSet) -> Self { |  | ||||||
|         Self::from_changeset(value) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl From<BTreeMap<u32, BlockHash>> for LocalChain { | impl From<BTreeMap<u32, BlockHash>> for LocalChain { | ||||||
|     fn from(value: BTreeMap<u32, BlockHash>) -> Self { |     fn from(value: BTreeMap<u32, BlockHash>) -> Self { | ||||||
|         Self::from_blocks(value) |         Self::from_blocks(value) | ||||||
| @ -244,18 +246,9 @@ impl LocalChain { | |||||||
|         self.tip.is_none() |         self.tip.is_none() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Updates [`Self`] with the given `update_tip`.
 |     /// Applies the given `update` to the chain.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// `introduce_older_blocks` specifies whether the `update_tip`'s history can introduce blocks
 |     /// The method returns [`ChangeSet`] on success. This represents the applied changes to `self`.
 | ||||||
|     /// below the original chain's tip without invalidating blocks. Block-by-block syncing
 |  | ||||||
|     /// mechanisms would typically create updates that builds upon the previous tip. In this case,
 |  | ||||||
|     /// this paramater would be false. Script-pubkey based syncing mechanisms may not introduce
 |  | ||||||
|     /// transactions in a chronological order so some updates require introducing older blocks (to
 |  | ||||||
|     /// anchor older transactions). For script-pubkey based syncing, this parameter would typically
 |  | ||||||
|     /// be true.
 |  | ||||||
|     ///
 |  | ||||||
|     /// The method returns [`ChangeSet`] on success. This represents the applied changes to
 |  | ||||||
|     /// [`Self`].
 |  | ||||||
|     ///
 |     ///
 | ||||||
|     /// To update, the `update_tip` must *connect* with `self`. If `self` and `update_tip` has a
 |     /// To update, the `update_tip` must *connect* with `self`. If `self` and `update_tip` has a
 | ||||||
|     /// mutual checkpoint (same height and hash), it can connect if:
 |     /// mutual checkpoint (same height and hash), it can connect if:
 | ||||||
| @ -275,7 +268,7 @@ impl LocalChain { | |||||||
|     ///
 |     ///
 | ||||||
|     /// An error will occur if the update does not correctly connect with `self`.
 |     /// An error will occur if the update does not correctly connect with `self`.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// Refer to [module-level documentation] for more.
 |     /// Refer to [`Update`] for more about the update struct.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// [module-level documentation]: crate::local_chain
 |     /// [module-level documentation]: crate::local_chain
 | ||||||
|     pub fn apply_update(&mut self, update: Update) -> Result<ChangeSet, CannotConnectError> { |     pub fn apply_update(&mut self, update: Update) -> Result<ChangeSet, CannotConnectError> { | ||||||
|  | |||||||
| @ -603,18 +603,16 @@ impl<A: Anchor> TxGraph<A> { | |||||||
|     /// This works by scanning through anchors, and seeing whether the anchor block of the anchor
 |     /// This works by scanning through anchors, and seeing whether the anchor block of the anchor
 | ||||||
|     /// exists in the [`LocalChain`].
 |     /// exists in the [`LocalChain`].
 | ||||||
|     pub fn missing_blocks<'a>(&'a self, chain: &'a LocalChain) -> impl Iterator<Item = u32> + 'a { |     pub fn missing_blocks<'a>(&'a self, chain: &'a LocalChain) -> impl Iterator<Item = u32> + 'a { | ||||||
|  |         let mut last_block = Option::<BlockId>::None; | ||||||
|         self.anchors |         self.anchors | ||||||
|             .iter() |             .iter() | ||||||
|             .map(|(a, _)| a.anchor_block()) |             .map(|(a, _)| a.anchor_block()) | ||||||
|             .filter({ |             .filter(move |block| { | ||||||
|                 let mut last_block = Option::<BlockId>::None; |                 if last_block.as_ref() == Some(block) { | ||||||
|                 move |block| { |                     false | ||||||
|                     if last_block.as_ref() == Some(block) { |                 } else { | ||||||
|                         false |                     last_block = Some(*block); | ||||||
|                     } else { |                     true | ||||||
|                         last_block = Some(*block); |  | ||||||
|                         true |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|             }) |             }) | ||||||
|             .filter_map(|block| match chain.heights().get(&block.height) { |             .filter_map(|block| match chain.heights().get(&block.height) { | ||||||
|  | |||||||
| @ -107,11 +107,11 @@ fn insert_relevant_txs() { | |||||||
| 
 | 
 | ||||||
| fn test_list_owned_txouts() { | fn test_list_owned_txouts() { | ||||||
|     // Create Local chains
 |     // Create Local chains
 | ||||||
| 
 |     let local_chain = LocalChain::from( | ||||||
|     let local_chain = (0..150) |         (0..150) | ||||||
|         .map(|i| (i as u32, Some(h!("random")))) |             .map(|i| (i as u32, h!("random"))) | ||||||
|         .collect::<BTreeMap<u32, Option<BlockHash>>>(); |             .collect::<BTreeMap<u32, BlockHash>>(), | ||||||
|     let local_chain = LocalChain::from(local_chain); |     ); | ||||||
| 
 | 
 | ||||||
|     // Initiate IndexedTxGraph
 |     // Initiate IndexedTxGraph
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -6,8 +6,8 @@ use bdk_chain::collections::{BTreeMap, BTreeSet}; | |||||||
| use bdk_chain::{ | use bdk_chain::{ | ||||||
|     bitcoin::{BlockHash, Script}, |     bitcoin::{BlockHash, Script}, | ||||||
|     local_chain::{self, CheckPoint}, |     local_chain::{self, CheckPoint}, | ||||||
|  |     BlockId, ConfirmationTimeAnchor, TxGraph, | ||||||
| }; | }; | ||||||
| use bdk_chain::{BlockId, ConfirmationTimeAnchor, TxGraph}; |  | ||||||
| use esplora_client::{Error, TxStatus}; | use esplora_client::{Error, TxStatus}; | ||||||
| 
 | 
 | ||||||
| use crate::{anchor_from_status, ASSUME_FINAL_DEPTH}; | use crate::{anchor_from_status, ASSUME_FINAL_DEPTH}; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user