]> git.bitcoin.ninja Git - rust-lightning/commitdiff
There can only be one input in matched txn in ChannelMonitor
authorMatt Corallo <git@bluematt.me>
Thu, 13 Sep 2018 15:35:23 +0000 (11:35 -0400)
committerMatt Corallo <git@bluematt.me>
Thu, 13 Sep 2018 18:05:08 +0000 (14:05 -0400)
This lets us simplify a few tidbits of loop.

src/ln/channelmonitor.rs

index f037c673079b2b0071697c012bbbac3d4d4d850d..12c26322bf8557fa845d9aa3f482479846b527fe 100644 (file)
@@ -1352,9 +1352,14 @@ impl ChannelMonitor {
        fn block_connected(&self, txn_matched: &[&Transaction], height: u32, broadcaster: &BroadcasterInterface)-> Vec<(Sha256dHash, Vec<TxOut>)> {
                let mut watch_outputs = Vec::new();
                for tx in txn_matched {
-                       let mut txn: Vec<Transaction> = Vec::new();
-                       for txin in tx.input.iter() {
-                               if self.funding_txo.is_none() || (txin.previous_output.txid == self.funding_txo.as_ref().unwrap().0.txid && txin.previous_output.vout == self.funding_txo.as_ref().unwrap().0.index as u32) {
+                       if tx.input.len() == 1 {
+                               // Assuming our keys were not leaked (in which case we're screwed no matter what),
+                               // commitment transactions and HTLC transactions will all only ever have one input,
+                               // which is an easy way to filter out any potential non-matching txn for lazy
+                               // filters.
+                               let prevout = &tx.input[0].previous_output;
+                               let mut txn: Vec<Transaction> = Vec::new();
+                               if self.funding_txo.is_none() || (prevout.txid == self.funding_txo.as_ref().unwrap().0.txid && prevout.vout == self.funding_txo.as_ref().unwrap().0.index as u32) {
                                        let (remote_txn, new_outputs) = self.check_spend_remote_transaction(tx, height);
                                        txn = remote_txn;
                                        if !new_outputs.1.is_empty() {