Skip to content

Commit d292d00

Browse files
committed
f - Move recursion outside nested for-loops
1 parent a92b3c2 commit d292d00

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

lightning/src/chain/chainmonitor.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,13 @@ where C::Target: chain::Filter,
9393
/// [`chain::Watch::release_pending_monitor_events`]: ../trait.Watch.html#tymethod.release_pending_monitor_events
9494
/// [`chain::Filter`]: ../trait.Filter.html
9595
pub fn block_connected(&self, header: &BlockHeader, txdata: &TransactionData, height: u32) {
96+
let mut dependent_txdata = Vec::new();
9697
let monitors = self.monitors.read().unwrap();
9798
for monitor in monitors.values() {
9899
let mut txn_outputs = monitor.block_connected(header, txdata, height, &*self.broadcaster, &*self.fee_estimator, &*self.logger);
99100

101+
// Register any new outputs with the chain source for filtering, storing any dependent
102+
// transactions from within the block that previously had not been included in txdata.
100103
if let Some(ref chain_source) = self.chain_source {
101104
let block_hash = header.block_hash();
102105
for (txid, outputs) in txn_outputs.drain(..) {
@@ -109,13 +112,21 @@ where C::Target: chain::Filter,
109112
outpoint: OutPoint { txid, index: *idx as u16 },
110113
script_pubkey: output.script_pubkey.clone(),
111114
};
112-
if let Some((index, tx)) = chain_source.register_output(output) {
113-
self.block_connected(header, &[(index, &tx)], height);
115+
if let Some(tx) = chain_source.register_output(output) {
116+
dependent_txdata.push(tx);
114117
}
115118
}
116119
}
117120
}
118121
}
122+
123+
// Recursively call for any dependent transactions that were identified by the chain source.
124+
if !dependent_txdata.is_empty() {
125+
dependent_txdata.sort_unstable_by_key(|(index, _tx)| *index);
126+
dependent_txdata.dedup_by_key(|(index, _tx)| *index);
127+
let txdata: Vec<_> = dependent_txdata.iter().map(|(index, tx)| (*index, tx)).collect();
128+
self.block_connected(header, &txdata, height);
129+
}
119130
}
120131

121132
/// Dispatches to per-channel monitors, which are responsible for updating their on-chain view

0 commit comments

Comments
 (0)