Skip to content

Commit f60519d

Browse files
author
Antoine Riard
committed
Remove duplicata for local commitment+HTLC txn
Previously, we would regenerate this class of txn twice due to block-rescan triggered by new watching outputs registered. This commmit doesn't change behavior, it only tweaks TestBroadcaster to ensure we modify cleanly tests anticipating next commit refactor.
1 parent 5101d20 commit f60519d

File tree

3 files changed

+30
-41
lines changed

3 files changed

+30
-41
lines changed

lightning/src/ln/functional_test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1038,7 +1038,7 @@ pub fn fail_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
10381038
pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
10391039
let mut chan_mon_cfgs = Vec::new();
10401040
for _ in 0..node_count {
1041-
let tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())};
1041+
let tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), broadcasted_txn: Mutex::new(HashMap::new())};
10421042
let fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: 253 };
10431043
chan_mon_cfgs.push(TestChanMonCfg{ tx_broadcaster, fee_estimator });
10441044
}

lightning/src/ln/functional_tests.rs

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2335,30 +2335,13 @@ fn claim_htlc_outputs_single_tx() {
23352335
}
23362336

23372337
let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
2338-
assert_eq!(node_txn.len(), 21);
2338+
assert_eq!(node_txn.len(), 9);
23392339
// ChannelMonitor: justice tx revoked offered htlc, justice tx revoked received htlc, justice tx revoked to_local (3)
23402340
// ChannelManager: local commmitment + local HTLC-timeout (2)
2341-
// ChannelMonitor: bumped justice tx (4), after one increase, bumps on HTLC aren't generated not being substantial anymore
2342-
// ChannelMonito r: local commitment + local HTLC-timeout (14)
2343-
2344-
assert_eq!(node_txn[0], node_txn[5]);
2345-
assert_eq!(node_txn[0], node_txn[7]);
2346-
assert_eq!(node_txn[0], node_txn[9]);
2347-
assert_eq!(node_txn[0], node_txn[13]);
2348-
assert_eq!(node_txn[0], node_txn[15]);
2349-
assert_eq!(node_txn[0], node_txn[17]);
2350-
assert_eq!(node_txn[0], node_txn[19]);
2351-
2352-
assert_eq!(node_txn[1], node_txn[6]);
2353-
assert_eq!(node_txn[1], node_txn[8]);
2354-
assert_eq!(node_txn[1], node_txn[10]);
2355-
assert_eq!(node_txn[1], node_txn[14]);
2356-
assert_eq!(node_txn[1], node_txn[16]);
2357-
assert_eq!(node_txn[1], node_txn[18]);
2358-
assert_eq!(node_txn[1], node_txn[20]);
2359-
2360-
2361-
// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration and present 8 times (rebroadcast at every block from 200 to 206)
2341+
// ChannelMonitor: bumped justice tx, after one increase, bumps on HTLC aren't generated not being substantial anymore, bump on revoked to_local isn't generated due to more room for expiration (2)
2342+
// ChannelMonitor: local commitment + local HTLC-timeout (2)
2343+
2344+
// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
23622345
assert_eq!(node_txn[0].input.len(), 1);
23632346
check_spends!(node_txn[0], chan_1.3);
23642347
assert_eq!(node_txn[1].input.len(), 1);
@@ -2438,12 +2421,10 @@ fn test_htlc_on_chain_success() {
24382421
nodes[2].block_notifier.block_connected(&Block { header, txdata: vec![commitment_tx[0].clone()]}, 1);
24392422
check_closed_broadcast!(nodes[2], false);
24402423
check_added_monitors!(nodes[2], 1);
2441-
let node_txn = nodes[2].tx_broadcaster.txn_broadcasted.lock().unwrap().clone(); // ChannelManager : 3 (commitment tx, 2*htlc-success tx), ChannelMonitor : 4 (2*2 * HTLC-Success tx)
2442-
assert_eq!(node_txn.len(), 7);
2424+
let node_txn = nodes[2].tx_broadcaster.txn_broadcasted.lock().unwrap().clone(); // ChannelManager : 3 (commitment tx, 2*htlc-success tx), ChannelMonitor : 2 (2 * HTLC-Success tx)
2425+
assert_eq!(node_txn.len(), 5);
24432426
assert_eq!(node_txn[0], node_txn[3]);
24442427
assert_eq!(node_txn[1], node_txn[4]);
2445-
assert_eq!(node_txn[0], node_txn[5]);
2446-
assert_eq!(node_txn[1], node_txn[6]);
24472428
assert_eq!(node_txn[2], commitment_tx[0]);
24482429
check_spends!(node_txn[0], commitment_tx[0]);
24492430
check_spends!(node_txn[1], commitment_tx[0]);
@@ -2488,15 +2469,11 @@ fn test_htlc_on_chain_success() {
24882469
macro_rules! check_tx_local_broadcast {
24892470
($node: expr, $htlc_offered: expr, $commitment_tx: expr, $chan_tx: expr) => { {
24902471
let mut node_txn = $node.tx_broadcaster.txn_broadcasted.lock().unwrap();
2491-
assert_eq!(node_txn.len(), if $htlc_offered { 7 } else { 5 });
2472+
assert_eq!(node_txn.len(), 5);
24922473
// Node[1]: ChannelManager: 3 (commitment tx, 2*HTLC-Timeout tx), ChannelMonitor: 2 (timeout tx)
2493-
// Node[0]: ChannelManager: 3 (commtiemtn tx, 2*HTLC-Timeout tx), ChannelMonitor: 2 HTLC-timeout * 2 (block-rescan)
2474+
// Node[0]: ChannelManager: 3 (commtiemtn tx, 2*HTLC-Timeout tx), ChannelMonitor: 2 HTLC-timeout
24942475
check_spends!(node_txn[0], $commitment_tx);
24952476
check_spends!(node_txn[1], $commitment_tx);
2496-
if $htlc_offered {
2497-
assert_eq!(node_txn[0], node_txn[5]);
2498-
assert_eq!(node_txn[1], node_txn[6]);
2499-
}
25002477
assert_ne!(node_txn[0].lock_time, 0);
25012478
assert_ne!(node_txn[1].lock_time, 0);
25022479
if $htlc_offered {
@@ -2633,11 +2610,9 @@ fn test_htlc_on_chain_timeout() {
26332610
let timeout_tx;
26342611
{
26352612
let mut node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
2636-
assert_eq!(node_txn.len(), 7); // ChannelManager : 2 (commitment tx, HTLC-Timeout tx), ChannelMonitor : (local commitment tx + HTLC-timeout) * 2 (block-rescan), timeout tx
2613+
assert_eq!(node_txn.len(), 5); // ChannelManager : 2 (commitment tx, HTLC-Timeout tx), ChannelMonitor : 2 (local commitment tx + HTLC-timeout), 1 timeout tx
26372614
assert_eq!(node_txn[0], node_txn[3]);
2638-
assert_eq!(node_txn[0], node_txn[5]);
26392615
assert_eq!(node_txn[1], node_txn[4]);
2640-
assert_eq!(node_txn[1], node_txn[6]);
26412616

26422617
check_spends!(node_txn[2], commitment_tx[0]);
26432618
assert_eq!(node_txn[2].clone().input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
@@ -4504,9 +4479,8 @@ fn test_onchain_to_onchain_claim() {
45044479
check_added_monitors!(nodes[2], 1);
45054480

45064481
let c_txn = nodes[2].tx_broadcaster.txn_broadcasted.lock().unwrap().clone(); // ChannelManager : 2 (commitment tx, HTLC-Success tx), ChannelMonitor : 1 (HTLC-Success tx)
4507-
assert_eq!(c_txn.len(), 4);
4482+
assert_eq!(c_txn.len(), 3);
45084483
assert_eq!(c_txn[0], c_txn[2]);
4509-
assert_eq!(c_txn[0], c_txn[3]);
45104484
assert_eq!(commitment_tx[0], c_txn[1]);
45114485
check_spends!(c_txn[1], chan_2.3);
45124486
check_spends!(c_txn[2], c_txn[1]);
@@ -4622,11 +4596,11 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
46224596
_ => panic!("Unexepected event"),
46234597
}
46244598
let htlc_success_txn: Vec<_> = nodes[2].tx_broadcaster.txn_broadcasted.lock().unwrap().clone();
4625-
assert_eq!(htlc_success_txn.len(), 7);
4599+
assert_eq!(htlc_success_txn.len(), 5); // ChannelMonitor: HTLC-Success txn (*2 due to 2-HTLC outputs), ChannelManager: local commitment tx + HTLC-Success txn (*2 due to 2-HTLC outputs)
46264600
check_spends!(htlc_success_txn[2], chan_2.3);
46274601
check_spends!(htlc_success_txn[3], htlc_success_txn[2]);
46284602
check_spends!(htlc_success_txn[4], htlc_success_txn[2]);
4629-
assert_eq!(htlc_success_txn[0], htlc_success_txn[5]);
4603+
assert_eq!(htlc_success_txn[0], htlc_success_txn[3]);
46304604
assert_eq!(htlc_success_txn[0].input.len(), 1);
46314605
assert_eq!(htlc_success_txn[0].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
46324606
assert_eq!(htlc_success_txn[1], htlc_success_txn[4]);
@@ -6819,7 +6793,7 @@ fn test_data_loss_protect() {
68196793
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::with_id(format!("node {}", 0)));
68206794
let mut chan_monitor = <(Sha256dHash, ChannelMonitor<EnforcingChannelKeys>)>::read(&mut ::std::io::Cursor::new(previous_chan_monitor_state.0), Arc::clone(&logger)).unwrap().1;
68216795
let chain_monitor = Arc::new(ChainWatchInterfaceUtil::new(Network::Testnet, Arc::clone(&logger)));
6822-
tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())};
6796+
tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), broadcasted_txn: Mutex::new(HashMap::new())};
68236797
fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: 253 };
68246798
keys_manager = test_utils::TestKeysInterface::new(&nodes[0].node_seed, Network::Testnet, Arc::clone(&logger));
68256799
monitor = test_utils::TestChannelMonitor::new(chain_monitor.clone(), &tx_broadcaster, logger.clone(), &fee_estimator);

lightning/src/util/test_utils.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,24 @@ impl<'a> channelmonitor::ManyChannelMonitor<EnforcingChannelKeys> for TestChanne
110110

111111
pub struct TestBroadcaster {
112112
pub txn_broadcasted: Mutex<Vec<Transaction>>,
113+
pub broadcasted_txn: Mutex<HashMap<Sha256dHash, u8>> // Temporary field while refactoring out tx duplication
113114
}
114115
impl chaininterface::BroadcasterInterface for TestBroadcaster {
115116
fn broadcast_transaction(&self, tx: &Transaction) {
117+
let mut already = false;
118+
{
119+
if let Some(counter) = self.broadcasted_txn.lock().unwrap().get_mut(&tx.txid()) {
120+
match counter {
121+
0 => { *counter = 1; already = true }, // We still authorize at least 2 duplicata for a given TXID to account ChannelManager/ChannelMonitor broadcast
122+
1 => return,
123+
_ => panic!()
124+
}
125+
}
126+
}
127+
if !already {
128+
self.broadcasted_txn.lock().unwrap().insert(tx.txid(), 0);
129+
}
130+
print!("\nFRESH BROADCAST {}\n\n", tx.txid());
116131
self.txn_broadcasted.lock().unwrap().push(tx.clone());
117132
}
118133
}

0 commit comments

Comments
 (0)