From: Matt Corallo Date: Wed, 4 Mar 2020 22:27:03 +0000 (-0500) Subject: Flatten Vec passed from channelmonitor to onchaintx block_connected X-Git-Tag: v0.0.12~109^2~3 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=4c3533d017fdcb8754c23facb864001485ba7672;p=rust-lightning Flatten Vec passed from channelmonitor to onchaintx block_connected Instead of passing a Vec of Vecs drop them into one as we go in ChannelMonitor, hopefully avoiding a bit of memory fragmentation and improving readability. --- diff --git a/lightning/src/ln/channelmonitor.rs b/lightning/src/ln/channelmonitor.rs index ea9e7851..205f4b01 100644 --- a/lightning/src/ln/channelmonitor.rs +++ b/lightning/src/ln/channelmonitor.rs @@ -2010,7 +2010,7 @@ impl ChannelMonitor { watch_outputs.push(new_outputs); } } - claimable_outpoints.push(new_outpoints); + claimable_outpoints.append(&mut new_outpoints); } if !funding_txo.is_none() && claimable_outpoints.is_empty() { if let Some(spendable_output) = self.check_spend_closing_transaction(&tx) { @@ -2020,7 +2020,7 @@ impl ChannelMonitor { } else { if let Some(&(commitment_number, _)) = self.remote_commitment_txn_on_chain.get(&prevout.txid) { let mut new_outpoints = self.check_spend_remote_htlc(&tx, commitment_number, height); - claimable_outpoints.push(new_outpoints); + claimable_outpoints.append(&mut new_outpoints); } } } diff --git a/lightning/src/ln/onchaintx.rs b/lightning/src/ln/onchaintx.rs index 1ec68f5e..c731bc07 100644 --- a/lightning/src/ln/onchaintx.rs +++ b/lightning/src/ln/onchaintx.rs @@ -478,7 +478,7 @@ impl OnchainTxHandler { Some((new_timer, new_feerate, bumped_tx)) } - pub(super) fn block_connected(&mut self, txn_matched: &[&Transaction], claimable_outpoints: Vec>, height: u32, broadcaster: B, fee_estimator: F) -> Vec + pub(super) fn block_connected(&mut self, txn_matched: &[&Transaction], claimable_outpoints: Vec, height: u32, broadcaster: B, fee_estimator: F) -> Vec where B::Target: BroadcasterInterface, F::Target: FeeEstimator { @@ -489,20 +489,18 @@ impl OnchainTxHandler { // Try to aggregate outputs if they're 1) belong to same parent tx, 2) their // timelock expiration isn't imminent (<= CLTV_SHARED_CLAIM_BUFFER). - for siblings_outpoints in claimable_outpoints { - for req in siblings_outpoints { - // Don't claim a outpoint twice that would be bad for privacy and may uselessly lock a CPFP input for a while - if let Some(_) = self.claimable_outpoints.get(&req.outpoint) { log_trace!(self, "Bouncing off outpoint {}:{}, already registered its claiming request", req.outpoint.txid, req.outpoint.vout); } else { - log_trace!(self, "Test if outpoint can be aggregated with expiration {} against {}", req.absolute_timelock, height + CLTV_SHARED_CLAIM_BUFFER); - if req.absolute_timelock <= height + CLTV_SHARED_CLAIM_BUFFER || !req.aggregable { // Don't aggregate if outpoint absolute timelock is soon or marked as non-aggregable - let mut single_input = HashMap::new(); - single_input.insert(req.outpoint, req.witness_data); - new_claims.push((req.absolute_timelock, single_input)); - } else { - aggregated_claim.insert(req.outpoint, req.witness_data); - if req.absolute_timelock < aggregated_soonest { - aggregated_soonest = req.absolute_timelock; - } + for req in claimable_outpoints { + // Don't claim a outpoint twice that would be bad for privacy and may uselessly lock a CPFP input for a while + if let Some(_) = self.claimable_outpoints.get(&req.outpoint) { log_trace!(self, "Bouncing off outpoint {}:{}, already registered its claiming request", req.outpoint.txid, req.outpoint.vout); } else { + log_trace!(self, "Test if outpoint can be aggregated with expiration {} against {}", req.absolute_timelock, height + CLTV_SHARED_CLAIM_BUFFER); + if req.absolute_timelock <= height + CLTV_SHARED_CLAIM_BUFFER || !req.aggregable { // Don't aggregate if outpoint absolute timelock is soon or marked as non-aggregable + let mut single_input = HashMap::new(); + single_input.insert(req.outpoint, req.witness_data); + new_claims.push((req.absolute_timelock, single_input)); + } else { + aggregated_claim.insert(req.outpoint, req.witness_data); + if req.absolute_timelock < aggregated_soonest { + aggregated_soonest = req.absolute_timelock; } } }