From: Matt Corallo Date: Thu, 13 Sep 2018 15:35:23 +0000 (-0400) Subject: There can only be one input in matched txn in ChannelMonitor X-Git-Tag: v0.0.12~311^2~1 X-Git-Url: http://git.bitcoin.ninja/?a=commitdiff_plain;h=e9e27f277a3330cede4fd79f41923b03d3b872ed;p=rust-lightning There can only be one input in matched txn in ChannelMonitor This lets us simplify a few tidbits of loop. --- diff --git a/src/ln/channelmonitor.rs b/src/ln/channelmonitor.rs index f037c6730..12c26322b 100644 --- a/src/ln/channelmonitor.rs +++ b/src/ln/channelmonitor.rs @@ -1352,9 +1352,14 @@ impl ChannelMonitor { fn block_connected(&self, txn_matched: &[&Transaction], height: u32, broadcaster: &BroadcasterInterface)-> Vec<(Sha256dHash, Vec)> { let mut watch_outputs = Vec::new(); for tx in txn_matched { - let mut txn: Vec = 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 = 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() {