]> Untitled Git - bdk/commitdiff
chain: split `IndexedTxGraph::insert_tx` into 3 methods
author志宇 <hello@evanlinjin.me>
Fri, 6 Oct 2023 03:07:00 +0000 (11:07 +0800)
committer志宇 <hello@evanlinjin.me>
Mon, 9 Oct 2023 14:14:04 +0000 (22:14 +0800)
Instead of inserting anchors and seen_at timestamp in the same method,
we have three separate methods. This makes the API easier to understand
and makes `IndexedTxGraph` more consistent with the `TxGraph` API.

crates/bdk/src/wallet/mod.rs
crates/chain/src/indexed_tx_graph.rs
example-crates/example_cli/src/lib.rs

index 090a9ca60b9ba738c994b00d4bb1c6981b163ad1..659da90a26ed74e7801fb42818724ea318db0e09 100644 (file)
@@ -738,7 +738,16 @@ impl<D> Wallet<D> {
             ConfirmationTime::Unconfirmed { last_seen } => (None, Some(last_seen)),
         };
 
-        let changeset: ChangeSet = self.indexed_graph.insert_tx(&tx, anchor, last_seen).into();
+        let mut changeset = ChangeSet::default();
+        let txid = tx.txid();
+        changeset.append(self.indexed_graph.insert_tx(tx).into());
+        if let Some(anchor) = anchor {
+            changeset.append(self.indexed_graph.insert_anchor(txid, anchor).into());
+        }
+        if let Some(last_seen) = last_seen {
+            changeset.append(self.indexed_graph.insert_seen_at(txid, last_seen).into());
+        }
+
         let changed = !changeset.is_empty();
         self.persist.stage(changeset);
         Ok(changed)
index e65b6868a95a0447fad85061436e6242af35d47d..0e2620e0d1fa8ef94472e3ba367e7af062560dd4 100644 (file)
@@ -3,7 +3,7 @@
 //! This is essentially a [`TxGraph`] combined with an indexer.
 
 use alloc::vec::Vec;
-use bitcoin::{Block, OutPoint, Transaction, TxOut};
+use bitcoin::{Block, OutPoint, Transaction, TxOut, Txid};
 
 use crate::{
     keychain,
@@ -103,32 +103,25 @@ where
     }
 
     /// Insert and index a transaction into the graph.
-    ///
-    /// `anchors` can be provided to anchor the transaction to various blocks. `seen_at` is a
-    /// unix timestamp of when the transaction is last seen.
-    pub fn insert_tx(
-        &mut self,
-        tx: &Transaction,
-        anchors: impl IntoIterator<Item = A>,
-        seen_at: Option<u64>,
-    ) -> ChangeSet<A, I::ChangeSet> {
-        let txid = tx.txid();
-
-        let mut graph = tx_graph::ChangeSet::default();
-        if self.graph.get_tx(txid).is_none() {
-            graph.append(self.graph.insert_tx(tx.clone()));
-        }
-        for anchor in anchors.into_iter() {
-            graph.append(self.graph.insert_anchor(txid, anchor));
-        }
-        if let Some(seen_at) = seen_at {
-            graph.append(self.graph.insert_seen_at(txid, seen_at));
-        }
-
+    pub fn insert_tx(&mut self, tx: Transaction) -> ChangeSet<A, I::ChangeSet> {
+        let graph = self.graph.insert_tx(tx);
         let indexer = self.index_tx_graph_changeset(&graph);
         ChangeSet { graph, indexer }
     }
 
+    /// Insert an `anchor` for a given transaction.
+    pub fn insert_anchor(&mut self, txid: Txid, anchor: A) -> ChangeSet<A, I::ChangeSet> {
+        self.graph.insert_anchor(txid, anchor).into()
+    }
+
+    /// Insert a unix timestamp of when a transaction is seen in the mempool.
+    ///
+    /// This is used for transaction conflict resolution in [`TxGraph`] where the transaction with
+    /// the later last-seen is prioritized.
+    pub fn insert_seen_at(&mut self, txid: Txid, seen_at: u64) -> ChangeSet<A, I::ChangeSet> {
+        self.graph.insert_seen_at(txid, seen_at).into()
+    }
+
     /// Batch insert transactions, filtering out those that are irrelevant.
     ///
     /// Relevancy is determined by the [`Indexer::is_tx_relevant`] implementation of `I`. Irrelevant
index 1982c30c659cb44c32075487f1117b33cac981fd..9e572a89299dbf5adb233a40fa8eb64344f260ec 100644 (file)
@@ -624,8 +624,7 @@ where
                 Ok(_) => {
                     println!("Broadcasted Tx : {}", transaction.txid());
 
-                    let keychain_changeset =
-                        graph.lock().unwrap().insert_tx(&transaction, None, None);
+                    let keychain_changeset = graph.lock().unwrap().insert_tx(transaction);
 
                     // We know the tx is at least unconfirmed now. Note if persisting here fails,
                     // it's not a big deal since we can always find it again form