Skip to content

Commit

Permalink
[bdk_chain_redesign] Introduce Append trait for additions
Browse files Browse the repository at this point in the history
Before, we were using `core::ops::AddAsign` but it was not the most
appropriate.
  • Loading branch information
evanlinjin committed Apr 5, 2023
1 parent 89cfa4d commit da4cef0
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 27 deletions.
28 changes: 12 additions & 16 deletions crates/chain/src/indexed_tx_graph.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use core::{convert::Infallible, ops::AddAssign};
use core::convert::Infallible;

use bitcoin::{OutPoint, Script, Transaction, TxOut};

use crate::{
keychain::Balance,
tx_graph::{Additions, TxGraph, TxNode},
BlockAnchor, ChainOracle, FullTxOut, ObservedAs, TxIndex,
Append, BlockAnchor, ChainOracle, FullTxOut, ObservedAs, TxIndex,
};

/// An outwards-facing view of a transaction that is part of the *best chain*'s history.
Expand Down Expand Up @@ -50,18 +50,14 @@ impl<A, IA: Default> Default for IndexedAdditions<A, IA> {
}
}

impl<A: BlockAnchor, IA: AddAssign> AddAssign for IndexedAdditions<A, IA> {
fn add_assign(&mut self, rhs: Self) {
let Self {
graph_additions,
index_additions: index_delta,
last_height,
} = rhs;
self.graph_additions.append(graph_additions);
self.index_additions += index_delta;
if self.last_height < last_height {
let last_height =
last_height.expect("must exist as it is larger than self.last_height");
impl<A: BlockAnchor, IA: Append> Append for IndexedAdditions<A, IA> {
fn append(&mut self, other: Self) {
self.graph_additions.append(other.graph_additions);
self.index_additions.append(other.index_additions);
if self.last_height < other.last_height {
let last_height = other
.last_height
.expect("must exist as it is larger than self.last_height");
self.last_height.replace(last_height);
}
}
Expand Down Expand Up @@ -201,7 +197,7 @@ impl<A: BlockAnchor, I: TxIndex> IndexedTxGraph<A, I> {
) -> IndexedAdditions<A, I::Additions>
where
T: Iterator<Item = &'t Transaction>,
I::Additions: Default + AddAssign,
I::Additions: Default + Append,
{
txs.filter_map(|tx| {
if self.index.is_tx_relevant(tx) {
Expand All @@ -211,7 +207,7 @@ impl<A: BlockAnchor, I: TxIndex> IndexedTxGraph<A, I> {
}
})
.fold(IndexedAdditions::default(), |mut acc, other| {
acc += other;
acc.append(other);
acc
})
}
Expand Down
13 changes: 3 additions & 10 deletions crates/chain/src/keychain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,13 @@
//! [`KeychainChangeSet`]s.
//!
//! [`SpkTxOutIndex`]: crate::SpkTxOutIndex
use core::ops::AddAssign;
use crate::{
chain_graph::{self, ChainGraph},
collections::BTreeMap,
sparse_chain::ChainPosition,
tx_graph::TxGraph,
ForEachTxOut,
Append, ForEachTxOut,
};

#[cfg(feature = "miniscript")]
Expand Down Expand Up @@ -71,12 +70,12 @@ impl<K> DerivationAdditions<K> {
}
}

impl<K: Ord> DerivationAdditions<K> {
impl<K: Ord> Append for DerivationAdditions<K> {
/// Append another [`DerivationAdditions`] into self.
///
/// If the keychain already exists, increase the index when the other's index > self's index.
/// If the keychain did not exist, append the new keychain.
pub fn append(&mut self, mut other: Self) {
fn append(&mut self, mut other: Self) {
self.0.iter_mut().for_each(|(key, index)| {
if let Some(other_index) = other.0.remove(key) {
*index = other_index.max(*index);
Expand All @@ -87,12 +86,6 @@ impl<K: Ord> DerivationAdditions<K> {
}
}

impl<K: Ord> AddAssign for DerivationAdditions<K> {
fn add_assign(&mut self, rhs: Self) {
self.append(rhs)
}
}

impl<K> Default for DerivationAdditions<K> {
fn default() -> Self {
Self(Default::default())
Expand Down
2 changes: 2 additions & 0 deletions crates/chain/src/keychain/txout_index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ use alloc::{borrow::Cow, vec::Vec};
use bitcoin::{secp256k1::Secp256k1, OutPoint, Script, TxOut};
use core::{fmt::Debug, ops::Deref};

use crate::Append;

use super::DerivationAdditions;

/// Maximum [BIP32](https://bips.xyz/32) derivation index.
Expand Down
10 changes: 10 additions & 0 deletions crates/chain/src/tx_data_traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,16 @@ impl BlockAnchor for (u32, BlockHash) {
}
}

/// Trait that makes an object appendable.
pub trait Append {
/// Append another object of the same type onto `self`.
fn append(&mut self, other: Self);
}

impl Append for () {
fn append(&mut self, _other: Self) {}
}

/// Represents an index of transaction data.
pub trait TxIndex {
/// The resultant "additions" when new transaction data is indexed.
Expand Down
2 changes: 1 addition & 1 deletion example-crates/keychain_tracker_example_cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use bdk_chain::{
Descriptor, DescriptorPublicKey,
},
sparse_chain::{self, ChainPosition},
DescriptorExt, FullTxOut,
Append, DescriptorExt, FullTxOut,
};
use bdk_coin_select::{coin_select_bnb, CoinSelector, CoinSelectorOpt, WeightedValue};
use bdk_file_store::KeychainStore;
Expand Down

0 comments on commit da4cef0

Please sign in to comment.