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:
parent
95312d4d05
commit
db15e03bdc
@ -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),
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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()
|
||||||
|
@ -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)
|
||||||
};
|
};
|
||||||
|
@ -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)
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user