fix: improve more docs and more refactoring

Thank you @vladimirfomene for these suggestions.

* Rename `LocalUpdate::keychain` to `LocalUpdate::last_active_indices`.
* Change docs for `CheckPoint` to be more descriptive.
* Fix incorrect logic in `update_local_chain` for `EsploraExt` and
  `EsploraAsyncExt`.
This commit is contained in:
志宇 2023-07-22 19:42:12 +08:00
parent 95312d4d05
commit db15e03bdc
No known key found for this signature in database
GPG Key ID: F6345C9837C2BDE8
9 changed files with 21 additions and 16 deletions

View File

@ -1711,7 +1711,7 @@ impl<D> Wallet<D> {
let (_, index_additions) = self let (_, index_additions) = self
.indexed_graph .indexed_graph
.index .index
.reveal_to_target_multi(&update.keychain); .reveal_to_target_multi(&update.last_active_indices);
changeset.append(ChangeSet::from(IndexedAdditions::from(index_additions))); changeset.append(ChangeSet::from(IndexedAdditions::from(index_additions)));
changeset.append(ChangeSet::from( changeset.append(ChangeSet::from(
self.indexed_graph.apply_update(update.graph), self.indexed_graph.apply_update(update.graph),

View File

@ -91,8 +91,9 @@ impl<K> AsRef<BTreeMap<K, u32>> for DerivationAdditions<K> {
/// [`LocalChain`]: local_chain::LocalChain /// [`LocalChain`]: local_chain::LocalChain
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct LocalUpdate<K, A> { pub struct LocalUpdate<K, A> {
/// Last active derivation index per keychain (`K`). /// Contains the last active derivation indices per keychain (`K`), which is used to update the
pub keychain: BTreeMap<K, u32>, /// [`KeychainTxOutIndex`].
pub last_active_indices: BTreeMap<K, u32>,
/// Update for the [`TxGraph`]. /// Update for the [`TxGraph`].
pub graph: TxGraph<A>, pub graph: TxGraph<A>,
@ -104,12 +105,12 @@ pub struct LocalUpdate<K, A> {
} }
impl<K, A> LocalUpdate<K, A> { impl<K, A> LocalUpdate<K, A> {
/// Construct a [`LocalUpdate`] with a given [`CheckPoint`] tip. /// Construct a [`LocalUpdate`] with a given [`local_chain::Update`].
/// ///
/// [`CheckPoint`]: local_chain::CheckPoint /// [`CheckPoint`]: local_chain::CheckPoint
pub fn new(chain_update: local_chain::Update) -> Self { pub fn new(chain_update: local_chain::Update) -> Self {
Self { Self {
keychain: BTreeMap::new(), last_active_indices: BTreeMap::new(),
graph: TxGraph::default(), graph: TxGraph::default(),
chain: chain_update, chain: chain_update,
} }

View File

@ -10,9 +10,13 @@ use bitcoin::BlockHash;
/// A structure that represents changes to [`LocalChain`]. /// A structure that represents changes to [`LocalChain`].
pub type ChangeSet = BTreeMap<u32, Option<BlockHash>>; pub type ChangeSet = BTreeMap<u32, Option<BlockHash>>;
/// A blockchain of [`LocalChain`]. /// A [`LocalChain`] checkpoint is used to find the agreement point between two chains and as a
/// transaction anchor.
/// ///
/// The in a linked-list with newer blocks pointing to older ones. /// Each checkpoint contains the height and hash of a block ([`BlockId`]).
///
/// Internaly, checkpoints are nodes of a linked-list. This allows the caller to view the entire
/// chain without holding a lock to [`LocalChain`].
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct CheckPoint(Arc<CPInner>); pub struct CheckPoint(Arc<CPInner>);
@ -382,7 +386,7 @@ impl LocalChain {
} }
} }
/// Get a reference to the internal index mapping the height to block hash /// Get a reference to the internal index mapping the height to block hash.
pub fn heights(&self) -> &BTreeMap<u32, BlockHash> { pub fn heights(&self) -> &BTreeMap<u32, BlockHash> {
&self.index &self.index
} }

View File

@ -123,7 +123,7 @@ fn update_local_chain() {
}, },
}, },
// Introduce an older checkpoint (A) that is not directly behind PoA // Introduce an older checkpoint (A) that is not directly behind PoA
// | 1 | 2 | 3 // | 2 | 3 | 4
// chain | B C // chain | B C
// update | A C // update | A C
TestLocalChain { TestLocalChain {

View File

@ -69,7 +69,7 @@ impl<K, A: Anchor> ElectrumUpdate<K, A> {
} }
} }
Ok(LocalUpdate { Ok(LocalUpdate {
keychain: self.keychain_update, last_active_indices: self.keychain_update,
graph: graph_update, graph: graph_update,
chain: local_chain::Update { chain: local_chain::Update {
tip: self.new_tip, tip: self.new_tip,
@ -93,7 +93,6 @@ impl<K> ElectrumUpdate<K, ConfirmationHeightAnchor> {
missing: Vec<Txid>, missing: Vec<Txid>,
) -> Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error> { ) -> Result<LocalUpdate<K, ConfirmationTimeAnchor>, Error> {
let update = self.finalize(client, seen_at, missing)?; let update = self.finalize(client, seen_at, missing)?;
// client.batch_transaction_get(txid)
let relevant_heights = { let relevant_heights = {
let mut visited_heights = HashSet::new(); let mut visited_heights = HashSet::new();
@ -141,7 +140,7 @@ impl<K> ElectrumUpdate<K, ConfirmationHeightAnchor> {
}; };
Ok(LocalUpdate { Ok(LocalUpdate {
keychain: update.keychain, last_active_indices: update.last_active_indices,
graph: { graph: {
let mut graph = TxGraph::default(); let mut graph = TxGraph::default();
graph.apply_additions(graph_additions); graph.apply_additions(graph_additions);

View File

@ -282,7 +282,6 @@ impl EsploraAsyncExt for esplora_client::AsyncClient {
async move { client.get_tx_status(&txid).await.map(|s| (txid, s)) } async move { client.get_tx_status(&txid).await.map(|s| (txid, s)) }
}) })
.collect::<FuturesOrdered<_>>(); .collect::<FuturesOrdered<_>>();
// .collect::<Vec<JoinHandle<Result<(Txid, TxStatus), Error>>>>();
if handles.is_empty() { if handles.is_empty() {
break; break;

View File

@ -278,7 +278,9 @@ fn main() -> anyhow::Result<()> {
let indexed_additions = { let indexed_additions = {
let mut additions = IndexedAdditions::<ConfirmationHeightAnchor, _>::default(); let mut additions = IndexedAdditions::<ConfirmationHeightAnchor, _>::default();
let (_, index_additions) = graph.index.reveal_to_target_multi(&final_update.keychain); let (_, index_additions) = graph
.index
.reveal_to_target_multi(&final_update.last_active_indices);
additions.append(IndexedAdditions { additions.append(IndexedAdditions {
index_additions, index_additions,
..Default::default() ..Default::default()

View File

@ -59,7 +59,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let get_heights = wallet.tx_graph().missing_blocks(wallet.local_chain()); let get_heights = wallet.tx_graph().missing_blocks(wallet.local_chain());
let chain_update = client.update_local_chain(prev_tip, get_heights)?; let chain_update = client.update_local_chain(prev_tip, get_heights)?;
let update = LocalUpdate { let update = LocalUpdate {
keychain: last_active_indices, last_active_indices,
graph: update_graph, graph: update_graph,
..LocalUpdate::new(chain_update) ..LocalUpdate::new(chain_update)
}; };

View File

@ -60,7 +60,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let get_heights = wallet.tx_graph().missing_blocks(wallet.local_chain()); let get_heights = wallet.tx_graph().missing_blocks(wallet.local_chain());
let chain_update = client.update_local_chain(prev_tip, get_heights).await?; let chain_update = client.update_local_chain(prev_tip, get_heights).await?;
let update = LocalUpdate { let update = LocalUpdate {
keychain: last_active_indices, last_active_indices,
graph: update_graph, graph: update_graph,
..LocalUpdate::new(chain_update) ..LocalUpdate::new(chain_update)
}; };