Skip to content

Commit d851ba6

Browse files
committed
wip2
1 parent 737b19b commit d851ba6

File tree

20 files changed

+312
-251
lines changed

20 files changed

+312
-251
lines changed

crates/bitcoind_rpc/examples/filter_iter.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ fn main() -> anyhow::Result<()> {
6969
println!("\ntook: {}s", start.elapsed().as_secs());
7070
println!("Local tip: {}", chain.tip().height());
7171

72-
let canonical_view = graph.canonical_view(&chain, chain.tip().block_id(), Default::default());
72+
let task = graph.canonicalization_task(Default::default());
73+
let canonical_view = chain.canonicalize(task, Some(chain.tip().block_id()));
7374

7475
let unspent: Vec<_> = canonical_view
7576
.filter_unspent_outpoints(graph.index.outpoints().clone())

crates/bitcoind_rpc/tests/test_emitter.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,11 @@ fn get_balance(
310310
) -> anyhow::Result<Balance> {
311311
let chain_tip = recv_chain.tip().block_id();
312312
let outpoints = recv_graph.index.outpoints().clone();
313-
let balance = recv_graph
314-
.canonical_view(recv_chain, chain_tip, CanonicalizationParams::default())
313+
let task = recv_graph
314+
.graph()
315+
.canonicalization_task(CanonicalizationParams::default());
316+
let balance = recv_chain
317+
.canonicalize(task, Some(chain_tip))
315318
.balance(outpoints, |_, _| true, 0);
316319
Ok(balance)
317320
}
@@ -616,8 +619,9 @@ fn test_expect_tx_evicted() -> anyhow::Result<()> {
616619
let _txid_2 = core.send_raw_transaction(&tx1b)?;
617620

618621
// Retrieve the expected unconfirmed txids and spks from the graph.
619-
let exp_spk_txids = graph
620-
.canonical_view(&chain, chain_tip, Default::default())
622+
let task = graph.canonicalization_task(Default::default());
623+
let exp_spk_txids = chain
624+
.canonicalize(task, Some(chain_tip))
621625
.list_expected_spk_txids(&graph.index, ..)
622626
.collect::<Vec<_>>();
623627
assert_eq!(exp_spk_txids, vec![(spk, txid_1)]);
@@ -632,8 +636,11 @@ fn test_expect_tx_evicted() -> anyhow::Result<()> {
632636
// Update graph with evicted tx.
633637
let _ = graph.batch_insert_relevant_evicted_at(mempool_event.evicted);
634638

635-
let canonical_txids = graph
636-
.canonical_view(&chain, chain_tip, CanonicalizationParams::default())
639+
let task = graph
640+
.graph()
641+
.canonicalization_task(CanonicalizationParams::default());
642+
let canonical_txids = chain
643+
.canonicalize(task, Some(chain_tip))
637644
.txs()
638645
.map(|tx| tx.txid)
639646
.collect::<Vec<_>>();

crates/chain/benches/canonicalization.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,31 +95,28 @@ fn setup<F: Fn(&mut KeychainTxGraph, &LocalChain)>(f: F) -> (KeychainTxGraph, Lo
9595
}
9696

9797
fn run_list_canonical_txs(tx_graph: &KeychainTxGraph, chain: &LocalChain, exp_txs: usize) {
98-
let view = tx_graph.canonical_view(
99-
chain,
100-
chain.tip().block_id(),
101-
CanonicalizationParams::default(),
102-
);
98+
let task = tx_graph
99+
.graph()
100+
.canonicalization_task(CanonicalizationParams::default());
101+
let view = chain.canonicalize(task, Some(chain.tip().block_id()));
103102
let txs = view.txs();
104103
assert_eq!(txs.count(), exp_txs);
105104
}
106105

107106
fn run_filter_chain_txouts(tx_graph: &KeychainTxGraph, chain: &LocalChain, exp_txos: usize) {
108-
let view = tx_graph.canonical_view(
109-
chain,
110-
chain.tip().block_id(),
111-
CanonicalizationParams::default(),
112-
);
107+
let task = tx_graph
108+
.graph()
109+
.canonicalization_task(CanonicalizationParams::default());
110+
let view = chain.canonicalize(task, Some(chain.tip().block_id()));
113111
let utxos = view.filter_outpoints(tx_graph.index.outpoints().clone());
114112
assert_eq!(utxos.count(), exp_txos);
115113
}
116114

117115
fn run_filter_chain_unspents(tx_graph: &KeychainTxGraph, chain: &LocalChain, exp_utxos: usize) {
118-
let view = tx_graph.canonical_view(
119-
chain,
120-
chain.tip().block_id(),
121-
CanonicalizationParams::default(),
122-
);
116+
let task = tx_graph
117+
.graph()
118+
.canonicalization_task(CanonicalizationParams::default());
119+
let view = chain.canonicalize(task, Some(chain.tip().block_id()));
123120
let utxos = view.filter_unspent_outpoints(tx_graph.index.outpoints().clone());
124121
assert_eq!(utxos.count(), exp_utxos);
125122
}

crates/chain/benches/indexer.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,11 @@ fn do_bench(indexed_tx_graph: &KeychainTxGraph, chain: &LocalChain) {
8484
// Check balance
8585
let chain_tip = chain.tip().block_id();
8686
let op = graph.index.outpoints().clone();
87-
let bal = graph
88-
.canonical_view(chain, chain_tip, CanonicalizationParams::default())
87+
let task = graph
88+
.graph()
89+
.canonicalization_task(CanonicalizationParams::default());
90+
let bal = chain
91+
.canonicalize(task, Some(chain_tip))
8992
.balance(op, |_, _| false, 1);
9093
assert_eq!(bal.total(), AMOUNT * TX_CT as u64);
9194
}

crates/chain/src/canonical_task.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,7 @@ pub struct CanonicalizationTask<'g, A> {
4949

5050
impl<'g, A: Anchor> CanonicalizationTask<'g, A> {
5151
/// Creates a new canonicalization task.
52-
pub fn new(
53-
tx_graph: &'g TxGraph<A>,
54-
params: CanonicalizationParams,
55-
) -> Self {
52+
pub fn new(tx_graph: &'g TxGraph<A>, params: CanonicalizationParams) -> Self {
5653
let anchors = tx_graph.all_anchors();
5754
let unprocessed_assumed_txs = Box::new(
5855
params
@@ -100,7 +97,7 @@ impl<'g, A: Anchor> CanonicalizationTask<'g, A> {
10097
// Check if we have pending anchor checks
10198
if let Some((_, _, anchors)) = self.pending_anchor_checks.front() {
10299
return Some(CanonicalizationRequest {
103-
anchors: anchors.clone()
100+
anchors: anchors.clone(),
104101
});
105102
}
106103

@@ -418,7 +415,7 @@ mod tests {
418415
// Create canonicalization task and canonicalize using the chain
419416
let params = CanonicalizationParams::default();
420417
let task = CanonicalizationTask::new(&tx_graph, params);
421-
let canonical_view = chain.canonicalize(task).unwrap();
418+
let canonical_view = chain.canonicalize(task, Some(chain_tip));
422419

423420
// Should have one canonical transaction
424421
assert_eq!(canonical_view.txs().len(), 1);

crates/chain/src/canonical_view.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
//! ## Example
77
//!
88
//! ```
9-
//! # use bdk_chain::{CanonicalView, TxGraph, CanonicalizationParams, local_chain::LocalChain};
9+
//! # use bdk_chain::{TxGraph, CanonicalizationParams, CanonicalizationTask, local_chain::LocalChain};
1010
//! # use bdk_core::BlockId;
1111
//! # use bitcoin::hashes::Hash;
1212
//! # let tx_graph = TxGraph::<BlockId>::default();
1313
//! # let chain = LocalChain::from_blocks([(0, bitcoin::BlockHash::all_zeros())].into_iter().collect()).unwrap();
14-
//! # let chain_tip = chain.tip().block_id();
1514
//! let params = CanonicalizationParams::default();
16-
//! let view = CanonicalView::new(&tx_graph, &chain, chain_tip, params).unwrap();
15+
//! let task = CanonicalizationTask::new(&tx_graph, params);
16+
//! let view = chain.canonicalize(task, Some(chain.tip().block_id()));
1717
//!
1818
//! // Iterate over canonical transactions
1919
//! for tx in view.txs() {
@@ -23,20 +23,14 @@
2323
2424
use crate::collections::HashMap;
2525
use alloc::sync::Arc;
26-
use core::{convert::Infallible, fmt, ops::RangeBounds};
26+
use core::{fmt, ops::RangeBounds};
2727

2828
use alloc::vec::Vec;
2929

3030
use bdk_core::BlockId;
3131
use bitcoin::{Amount, OutPoint, ScriptBuf, Transaction, Txid};
3232

33-
use crate::{
34-
canonical_iter::{CanonicalIter, CanonicalReason, ObservedIn},
35-
spk_txout::SpkTxOutIndex,
36-
tx_graph::TxNode,
37-
Anchor, Balance, CanonicalizationParams, ChainOracle, ChainPosition,
38-
FullTxOut, TxGraph,
39-
};
33+
use crate::{spk_txout::SpkTxOutIndex, Anchor, Balance, ChainPosition, FullTxOut};
4034

4135
/// A single canonical transaction with its chain position.
4236
///
@@ -141,12 +135,13 @@ impl<A: Anchor> CanonicalView<A> {
141135
/// # Example
142136
///
143137
/// ```
144-
/// # use bdk_chain::{CanonicalView, TxGraph, local_chain::LocalChain};
138+
/// # use bdk_chain::{TxGraph, CanonicalizationTask, local_chain::LocalChain};
145139
/// # use bdk_core::BlockId;
146140
/// # use bitcoin::hashes::Hash;
147141
/// # let tx_graph = TxGraph::<BlockId>::default();
148142
/// # let chain = LocalChain::from_blocks([(0, bitcoin::BlockHash::all_zeros())].into_iter().collect()).unwrap();
149-
/// # let view = CanonicalView::new(&tx_graph, &chain, chain.tip().block_id(), Default::default()).unwrap();
143+
/// # let task = CanonicalizationTask::new(&tx_graph, Default::default());
144+
/// # let view = chain.canonicalize(task, Some(chain.tip().block_id()));
150145
/// // Iterate over all canonical transactions
151146
/// for tx in view.txs() {
152147
/// println!("TX {}: {:?}", tx.txid, tx.pos);
@@ -174,12 +169,13 @@ impl<A: Anchor> CanonicalView<A> {
174169
/// # Example
175170
///
176171
/// ```
177-
/// # use bdk_chain::{CanonicalView, TxGraph, local_chain::LocalChain, keychain_txout::KeychainTxOutIndex};
172+
/// # use bdk_chain::{TxGraph, CanonicalizationTask, local_chain::LocalChain, keychain_txout::KeychainTxOutIndex};
178173
/// # use bdk_core::BlockId;
179174
/// # use bitcoin::hashes::Hash;
180175
/// # let tx_graph = TxGraph::<BlockId>::default();
181176
/// # let chain = LocalChain::from_blocks([(0, bitcoin::BlockHash::all_zeros())].into_iter().collect()).unwrap();
182-
/// # let view = CanonicalView::new(&tx_graph, &chain, chain.tip().block_id(), Default::default()).unwrap();
177+
/// # let task = CanonicalizationTask::new(&tx_graph, Default::default());
178+
/// # let view = chain.canonicalize(task, Some(chain.tip().block_id()));
183179
/// # let indexer = KeychainTxOutIndex::<&str>::default();
184180
/// // Get all outputs from an indexer
185181
/// for (keychain, txout) in view.filter_outpoints(indexer.outpoints().clone()) {
@@ -203,12 +199,13 @@ impl<A: Anchor> CanonicalView<A> {
203199
/// # Example
204200
///
205201
/// ```
206-
/// # use bdk_chain::{CanonicalView, TxGraph, local_chain::LocalChain, keychain_txout::KeychainTxOutIndex};
202+
/// # use bdk_chain::{TxGraph, CanonicalizationTask, local_chain::LocalChain, keychain_txout::KeychainTxOutIndex};
207203
/// # use bdk_core::BlockId;
208204
/// # use bitcoin::hashes::Hash;
209205
/// # let tx_graph = TxGraph::<BlockId>::default();
210206
/// # let chain = LocalChain::from_blocks([(0, bitcoin::BlockHash::all_zeros())].into_iter().collect()).unwrap();
211-
/// # let view = CanonicalView::new(&tx_graph, &chain, chain.tip().block_id(), Default::default()).unwrap();
207+
/// # let task = CanonicalizationTask::new(&tx_graph, Default::default());
208+
/// # let view = chain.canonicalize(task, Some(chain.tip().block_id()));
212209
/// # let indexer = KeychainTxOutIndex::<&str>::default();
213210
/// // Get unspent outputs (UTXOs) from an indexer
214211
/// for (keychain, utxo) in view.filter_unspent_outpoints(indexer.outpoints().clone()) {
@@ -247,12 +244,13 @@ impl<A: Anchor> CanonicalView<A> {
247244
/// # Example
248245
///
249246
/// ```
250-
/// # use bdk_chain::{CanonicalView, TxGraph, local_chain::LocalChain, keychain_txout::KeychainTxOutIndex};
247+
/// # use bdk_chain::{CanonicalizationTask, TxGraph, local_chain::LocalChain, keychain_txout::KeychainTxOutIndex};
251248
/// # use bdk_core::BlockId;
252249
/// # use bitcoin::hashes::Hash;
253250
/// # let tx_graph = TxGraph::<BlockId>::default();
254251
/// # let chain = LocalChain::from_blocks([(0, bitcoin::BlockHash::all_zeros())].into_iter().collect()).unwrap();
255-
/// # let view = CanonicalView::new(&tx_graph, &chain, chain.tip().block_id(), Default::default()).unwrap();
252+
/// # let task = CanonicalizationTask::new(&tx_graph, Default::default());
253+
/// # let view = chain.canonicalize(task, Some(chain.tip().block_id()));
256254
/// # let indexer = KeychainTxOutIndex::<&str>::default();
257255
/// // Calculate balance with 6 confirmations, trusting all outputs
258256
/// let balance = view.balance(

crates/chain/src/indexed_tx_graph.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
//! Contains the [`IndexedTxGraph`] and associated types. Refer to the
22
//! [`IndexedTxGraph`] documentation for more.
3-
use core::{convert::Infallible, fmt::Debug};
3+
use core::fmt::Debug;
44

55
use alloc::{sync::Arc, vec::Vec};
66
use bitcoin::{Block, OutPoint, Transaction, TxOut, Txid};
77

88
use crate::{
99
tx_graph::{self, TxGraph},
10-
Anchor, BlockId, CanonicalView, CanonicalizationParams, ChainOracle, Indexer, Merge,
11-
TxPosInBlock,
10+
Anchor, BlockId, CanonicalizationParams, CanonicalizationTask, Indexer, Merge, TxPosInBlock,
1211
};
1312

1413
/// A [`TxGraph<A>`] paired with an indexer `I`, enforcing that every insertion into the graph is
@@ -429,6 +428,19 @@ impl<A, I> AsRef<TxGraph<A>> for IndexedTxGraph<A, I> {
429428
}
430429
}
431430

431+
impl<A, X> IndexedTxGraph<A, X>
432+
where
433+
A: Anchor,
434+
{
435+
/// TODO: (@oleonardolima).
436+
pub fn canonicalization_task(
437+
&'_ self,
438+
params: CanonicalizationParams,
439+
) -> CanonicalizationTask<'_, A> {
440+
self.graph.canonicalization_task(params)
441+
}
442+
}
443+
432444
/// Represents changes to an [`IndexedTxGraph`].
433445
#[derive(Clone, Debug, PartialEq)]
434446
#[cfg_attr(

0 commit comments

Comments
 (0)