Skip to content

Commit d7a9e74

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 6fd9488 commit d7a9e74

File tree

3 files changed

+33
-44
lines changed

3 files changed

+33
-44
lines changed

lightning/src/ln/functional_test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -992,7 +992,7 @@ pub fn fail_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
992992
pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
993993
let mut chan_mon_cfgs = Vec::new();
994994
for _ in 0..node_count {
995-
let tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())};
995+
let tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), broadcasted_txn: Mutex::new(HashMap::new())};
996996
let fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: 253 };
997997
chan_mon_cfgs.push(TestChanMonCfg{ tx_broadcaster, fee_estimator });
998998
}

lightning/src/ln/functional_tests.rs

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2346,30 +2346,13 @@ fn claim_htlc_outputs_single_tx() {
23462346
}
23472347

23482348
let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
2349-
assert_eq!(node_txn.len(), 21);
2349+
assert_eq!(node_txn.len(), 9);
23502350
// ChannelMonitor: justice tx revoked offered htlc, justice tx revoked received htlc, justice tx revoked to_local (3)
23512351
// ChannelManager: local commmitment + local HTLC-timeout (2)
2352-
// ChannelMonitor: bumped justice tx (4), after one increase, bumps on HTLC aren't generated not being substantial anymore
2353-
// ChannelMonito r: local commitment + local HTLC-timeout (14)
2354-
2355-
assert_eq!(node_txn[0], node_txn[5]);
2356-
assert_eq!(node_txn[0], node_txn[7]);
2357-
assert_eq!(node_txn[0], node_txn[9]);
2358-
assert_eq!(node_txn[0], node_txn[13]);
2359-
assert_eq!(node_txn[0], node_txn[15]);
2360-
assert_eq!(node_txn[0], node_txn[17]);
2361-
assert_eq!(node_txn[0], node_txn[19]);
2362-
2363-
assert_eq!(node_txn[1], node_txn[6]);
2364-
assert_eq!(node_txn[1], node_txn[8]);
2365-
assert_eq!(node_txn[1], node_txn[10]);
2366-
assert_eq!(node_txn[1], node_txn[14]);
2367-
assert_eq!(node_txn[1], node_txn[16]);
2368-
assert_eq!(node_txn[1], node_txn[18]);
2369-
assert_eq!(node_txn[1], node_txn[20]);
2370-
2371-
2372-
// 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)
2352+
// ChannelMonitor: bumped justice tx (2), 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
2353+
// ChannelMonitor: local commitment + local HTLC-timeout (2)
2354+
2355+
// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
23732356
assert_eq!(node_txn[0].input.len(), 1);
23742357
check_spends!(node_txn[0], chan_1.3);
23752358
assert_eq!(node_txn[1].input.len(), 1);
@@ -2449,12 +2432,10 @@ fn test_htlc_on_chain_success() {
24492432
nodes[2].block_notifier.block_connected(&Block { header, txdata: vec![commitment_tx[0].clone()]}, 1);
24502433
check_closed_broadcast!(nodes[2], false);
24512434
check_added_monitors!(nodes[2], 1);
2452-
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)
2453-
assert_eq!(node_txn.len(), 7);
2435+
let node_txn = nodes[2].tx_broadcaster.txn_broadcasted.lock().unwrap().clone(); // ChannelManager : 3 (commitment tx, 2*htlc-success tx), ChannelMonitor : 4 (2 * HTLC-Success tx)
2436+
assert_eq!(node_txn.len(), 5);
24542437
assert_eq!(node_txn[0], node_txn[3]);
24552438
assert_eq!(node_txn[1], node_txn[4]);
2456-
assert_eq!(node_txn[0], node_txn[5]);
2457-
assert_eq!(node_txn[1], node_txn[6]);
24582439
assert_eq!(node_txn[2], commitment_tx[0]);
24592440
check_spends!(node_txn[0], commitment_tx[0]);
24602441
check_spends!(node_txn[1], commitment_tx[0]);
@@ -2499,15 +2480,11 @@ fn test_htlc_on_chain_success() {
24992480
macro_rules! check_tx_local_broadcast {
25002481
($node: expr, $htlc_offered: expr, $commitment_tx: expr, $chan_tx: expr) => { {
25012482
let mut node_txn = $node.tx_broadcaster.txn_broadcasted.lock().unwrap();
2502-
assert_eq!(node_txn.len(), if $htlc_offered { 7 } else { 5 });
2483+
assert_eq!(node_txn.len(), 5);
25032484
// Node[1]: ChannelManager: 3 (commitment tx, 2*HTLC-Timeout tx), ChannelMonitor: 2 (timeout tx)
2504-
// Node[0]: ChannelManager: 3 (commtiemtn tx, 2*HTLC-Timeout tx), ChannelMonitor: 2 HTLC-timeout * 2 (block-rescan)
2505-
check_spends!(node_txn[0], $commitment_tx);
2506-
check_spends!(node_txn[1], $commitment_tx);
2507-
if $htlc_offered {
2508-
assert_eq!(node_txn[0], node_txn[5]);
2509-
assert_eq!(node_txn[1], node_txn[6]);
2510-
}
2485+
// Node[0]: ChannelManager: 3 (commtiemtn tx, 2*HTLC-Timeout tx), ChannelMonitor: 2 HTLC-timeout
2486+
check_spends!(node_txn[0], $commitment_tx.clone());
2487+
check_spends!(node_txn[1], $commitment_tx.clone());
25112488
assert_ne!(node_txn[0].lock_time, 0);
25122489
assert_ne!(node_txn[1].lock_time, 0);
25132490
if $htlc_offered {
@@ -2644,11 +2621,9 @@ fn test_htlc_on_chain_timeout() {
26442621
let timeout_tx;
26452622
{
26462623
let mut node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
2647-
assert_eq!(node_txn.len(), 7); // ChannelManager : 2 (commitment tx, HTLC-Timeout tx), ChannelMonitor : (local commitment tx + HTLC-timeout) * 2 (block-rescan), timeout tx
2624+
assert_eq!(node_txn.len(), 5); // ChannelManager : 2 (commitment tx, HTLC-Timeout tx), ChannelMonitor : (local commitment tx + HTLC-timeout), timeout tx
26482625
assert_eq!(node_txn[0], node_txn[3]);
2649-
assert_eq!(node_txn[0], node_txn[5]);
26502626
assert_eq!(node_txn[1], node_txn[4]);
2651-
assert_eq!(node_txn[1], node_txn[6]);
26522627

26532628
check_spends!(node_txn[2], commitment_tx[0]);
26542629
assert_eq!(node_txn[2].clone().input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
@@ -4443,9 +4418,8 @@ fn test_onchain_to_onchain_claim() {
44434418
check_added_monitors!(nodes[2], 1);
44444419

44454420
let c_txn = nodes[2].tx_broadcaster.txn_broadcasted.lock().unwrap().clone(); // ChannelManager : 2 (commitment tx, HTLC-Success tx), ChannelMonitor : 1 (HTLC-Success tx)
4446-
assert_eq!(c_txn.len(), 4);
4421+
assert_eq!(c_txn.len(), 3);
44474422
assert_eq!(c_txn[0], c_txn[2]);
4448-
assert_eq!(c_txn[0], c_txn[3]);
44494423
assert_eq!(commitment_tx[0], c_txn[1]);
44504424
check_spends!(c_txn[1], chan_2.3);
44514425
check_spends!(c_txn[2], c_txn[1]);
@@ -4561,11 +4535,11 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
45614535
_ => panic!("Unexepected event"),
45624536
}
45634537
let htlc_success_txn: Vec<_> = nodes[2].tx_broadcaster.txn_broadcasted.lock().unwrap().clone();
4564-
assert_eq!(htlc_success_txn.len(), 7);
4565-
check_spends!(htlc_success_txn[2], chan_2.3);
4538+
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)
4539+
check_spends!(htlc_success_txn[2], chan_2.3.clone());
45664540
check_spends!(htlc_success_txn[3], htlc_success_txn[2]);
45674541
check_spends!(htlc_success_txn[4], htlc_success_txn[2]);
4568-
assert_eq!(htlc_success_txn[0], htlc_success_txn[5]);
4542+
assert_eq!(htlc_success_txn[0], htlc_success_txn[3]);
45694543
assert_eq!(htlc_success_txn[0].input.len(), 1);
45704544
assert_eq!(htlc_success_txn[0].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
45714545
assert_eq!(htlc_success_txn[1], htlc_success_txn[4]);
@@ -6781,7 +6755,7 @@ fn test_data_loss_protect() {
67816755
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::with_id(format!("node {}", 0)));
67826756
let mut chan_monitor = <(Sha256dHash, ChannelMonitor<EnforcingChannelKeys>)>::read(&mut ::std::io::Cursor::new(previous_chan_monitor_state.0), Arc::clone(&logger)).unwrap().1;
67836757
let chain_monitor = Arc::new(ChainWatchInterfaceUtil::new(Network::Testnet, Arc::clone(&logger)));
6784-
tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())};
6758+
tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), broadcasted_txn: Mutex::new(HashMap::new())};
67856759
fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: 253 };
67866760
keys_manager = test_utils::TestKeysInterface::new(&nodes[0].node_seed, Network::Testnet, Arc::clone(&logger));
67876761
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
@@ -108,9 +108,24 @@ impl<'a> channelmonitor::ManyChannelMonitor<EnforcingChannelKeys> for TestChanne
108108

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

0 commit comments

Comments
 (0)