Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit eb48a43

Browse files
committedOct 29, 2024
f Verify claims of different outputs
1 parent a94ae8a commit eb48a43

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed
 

‎lightning/src/ln/functional_tests.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2522,6 +2522,7 @@ fn test_justice_tx_htlc_timeout() {
25222522
assert_eq!(tx.input.len(), 1);
25232523
check_spends!(tx, revoked_local_txn[0]);
25242524
}
2525+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
25252526
node_txn.clear();
25262527
}
25272528
check_added_monitors!(nodes[1], 1);
@@ -2746,6 +2747,9 @@ fn claim_htlc_outputs() {
27462747
assert_eq!(node_txn[1].input.len(), 2); // Claims both pinnable, revoked HTLC outputs separately.
27472748
check_spends!(node_txn[0], revoked_local_txn[0]);
27482749
check_spends!(node_txn[1], revoked_local_txn[0]);
2750+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
2751+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[1].previous_output);
2752+
assert_ne!(node_txn[1].input[0].previous_output, node_txn[1].input[1].previous_output);
27492753

27502754
let mut witness_lens = BTreeSet::new();
27512755
witness_lens.insert(node_txn[0].input[0].witness.last().unwrap().len());
@@ -2917,15 +2921,22 @@ fn test_htlc_on_chain_success() {
29172921
let mut node_txn = $node.tx_broadcaster.txn_broadcasted.lock().unwrap();
29182922
// HTLC timeout claims for non-anchor channels are only aggregated when claimed from the
29192923
// remote commitment transaction.
2920-
assert_eq!(node_txn.len(), if $htlc_offered { 2 } else { 1 });
2921-
check_spends!(node_txn[0], $commitment_tx);
2922-
assert_ne!(node_txn[0].lock_time, LockTime::ZERO);
29232924
if $htlc_offered {
2924-
assert_eq!(node_txn[0].input[0].witness.last().unwrap().len(), OFFERED_HTLC_SCRIPT_WEIGHT);
2925-
assert!(node_txn[0].output[0].script_pubkey.is_p2wsh()); // revokeable output
2925+
assert_eq!(node_txn.len(), 2);
2926+
for tx in node_txn.iter() {
2927+
check_spends!(tx, $commitment_tx);
2928+
assert_ne!(tx.lock_time, LockTime::ZERO);
2929+
assert_eq!(tx.input[0].witness.last().unwrap().len(), OFFERED_HTLC_SCRIPT_WEIGHT);
2930+
assert!(tx.output[0].script_pubkey.is_p2wsh()); // revokeable output
2931+
}
2932+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
29262933
} else {
2934+
assert_eq!(node_txn.len(), 1);
2935+
check_spends!(node_txn[0], $commitment_tx);
2936+
assert_ne!(node_txn[0].lock_time, LockTime::ZERO);
29272937
assert_eq!(node_txn[0].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
29282938
assert!(node_txn[0].output[0].script_pubkey.is_p2wpkh()); // direct payment
2939+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[0].input[1].previous_output);
29292940
}
29302941
node_txn.clear();
29312942
} }
@@ -2949,6 +2960,7 @@ fn test_htlc_on_chain_success() {
29492960
} else {
29502961
// Certain `ConnectStyle`s will cause RBF bumps of the previous HTLC transaction to be broadcast.
29512962
// FullBlockViaListen
2963+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
29522964
if node_txn[0].input[0].previous_output.txid == node_a_commitment_tx[0].compute_txid() {
29532965
check_spends!(node_txn[1], commitment_tx[0]);
29542966
&node_txn[0]
@@ -4686,6 +4698,7 @@ fn test_static_spendable_outputs_justice_tx_revoked_commitment_tx() {
46864698
assert_eq!(tx.input.len(), 1);
46874699
check_spends!(tx, revoked_local_txn[0]);
46884700
}
4701+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
46894702

46904703
mine_transaction(&nodes[1], &node_txn[0]);
46914704
connect_blocks(&nodes[1], ANTI_REORG_DELAY - 1);
@@ -4743,10 +4756,13 @@ fn test_static_spendable_outputs_justice_tx_revoked_htlc_timeout_tx() {
47434756
assert_eq!(node_txn.len(), 2);
47444757
assert_eq!(node_txn[0].input.len(), 2);
47454758
check_spends!(node_txn[0], revoked_local_txn[0], revoked_htlc_txn[0]);
4759+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[0].input[1].previous_output);
47464760

47474761
assert_eq!(node_txn[1].input.len(), 1);
47484762
check_spends!(node_txn[1], revoked_local_txn[0]);
47494763
assert_eq!(node_txn[1].input[0].previous_output, revoked_htlc_txn[0].input[0].previous_output);
4764+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
4765+
assert_ne!(node_txn[0].input[1].previous_output, node_txn[1].input[0].previous_output);
47504766

47514767
mine_transaction(&nodes[1], &node_txn[0]);
47524768
connect_blocks(&nodes[1], ANTI_REORG_DELAY - 1);
@@ -4806,7 +4822,7 @@ fn test_static_spendable_outputs_justice_tx_revoked_htlc_success_tx() {
48064822
let node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().clone();
48074823
assert_eq!(node_txn.len(), 2);
48084824

4809-
// TThe first transaction generated will become out-of-date as it spends the output already spent
4825+
// The first transaction generated will become out-of-date as it spends the output already spent
48104826
// by revoked_htlc_txn[0]. That's OK, we'll spend with valid transactions next...
48114827
assert_eq!(node_txn[0].input.len(), 1);
48124828
check_spends!(node_txn[0], revoked_local_txn[0]);
@@ -7449,6 +7465,8 @@ fn test_bump_penalty_txn_on_revoked_commitment() {
74497465
$penalty_txids.insert(input.previous_output, tx.compute_txid());
74507466
}
74517467
}
7468+
assert_eq!($fee_rates.len(), 3);
7469+
assert_eq!($penalty_txids.len(), 3);
74527470
node_txn.clear();
74537471
}
74547472
}
@@ -7834,7 +7852,12 @@ fn test_bump_txn_sanitize_tracking_maps() {
78347852
let mut node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap();
78357853
assert_eq!(node_txn.len(), 2); //ChannelMonitor: justice txn * 2
78367854
check_spends!(node_txn[0], revoked_local_txn[0]);
7855+
assert_eq!(node_txn[0].input.len(), 1);
78377856
check_spends!(node_txn[1], revoked_local_txn[0]);
7857+
assert_eq!(node_txn[1].input.len(), 2);
7858+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
7859+
assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[1].previous_output);
7860+
assert_ne!(node_txn[1].input[0].previous_output, node_txn[1].input[1].previous_output);
78387861
let penalty_txn = vec![node_txn[0].clone(), node_txn[1].clone()];
78397862
node_txn.clear();
78407863
penalty_txn

‎lightning/src/ln/monitor_tests.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,10 @@ fn revoked_output_htlc_resolution_timing() {
145145
let bs_spend_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
146146
assert_eq!(bs_spend_txn.len(), 2);
147147
for tx in bs_spend_txn.iter() {
148+
assert_eq!(tx.input.len(), 1);
148149
check_spends!(tx, revoked_local_txn[0]);
149150
}
151+
assert_ne!(bs_spend_txn[0].input[0].previous_output, bs_spend_txn[1].input[0].previous_output);
150152

151153
// After the commitment transaction confirms, we should still wait on the HTLC spend
152154
// transaction to confirm before resolving the HTLC.
@@ -1766,6 +1768,9 @@ fn do_test_revoked_counterparty_htlc_tx_balances(anchors: bool) {
17661768
assert_eq!(as_commitment_claim_txn[1].input.len(), 2);
17671769
check_spends!(as_commitment_claim_txn[0], revoked_local_txn[0]);
17681770
check_spends!(as_commitment_claim_txn[1], revoked_local_txn[0]);
1771+
assert_ne!(as_commitment_claim_txn[0].input[0].previous_output, as_commitment_claim_txn[1].input[0].previous_output);
1772+
assert_ne!(as_commitment_claim_txn[0].input[0].previous_output, as_commitment_claim_txn[1].input[1].previous_output);
1773+
assert_ne!(as_commitment_claim_txn[1].input[0].previous_output, as_commitment_claim_txn[1].input[1].previous_output);
17691774
as_commitment_claim_txn.remove(0)
17701775
};
17711776

@@ -2051,6 +2056,10 @@ fn do_test_revoked_counterparty_aggregated_claims(anchors: bool) {
20512056
assert_eq!(claim_txn[1].input.len(), 2);
20522057
check_spends!(claim_txn[0], as_revoked_txn[0]);
20532058
check_spends!(claim_txn[1], as_revoked_txn[0]);
2059+
assert_ne!(claim_txn[0].input[0].previous_output, claim_txn[1].input[0].previous_output);
2060+
assert_ne!(claim_txn[0].input[0].previous_output, claim_txn[1].input[1].previous_output);
2061+
assert_ne!(claim_txn[1].input[0].previous_output, claim_txn[1].input[1].previous_output);
2062+
20542063

20552064
let to_remote_maturity = nodes[1].best_block_info().1 + ANTI_REORG_DELAY - 1;
20562065

0 commit comments

Comments
 (0)
Please sign in to comment.