Skip to content

Commit 0abec48

Browse files
author
Antoine Riard
committed
Add test_htlc_no_detection
This test is a mutation to underscore the detetection logic bug we had before #653. HTLC value routed is above the remaining balance, thus inverting HTLC and `to_remote` output. HTLC will come second and it wouldn't be seen by pre-#653 detection as we were eneumerate()'ing on a watched outputs vector (Vec<TxOut>) thus implictly relying on outputs order detection for correct spending children filtering.
1 parent 8c339e3 commit 0abec48

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

lightning/src/ln/functional_tests.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8497,3 +8497,47 @@ fn test_concurrent_monitor_claim() {
84978497
check_spends!(htlc_txn[1], bob_state_y);
84988498
}
84998499
}
8500+
8501+
#[test]
8502+
fn test_htlc_no_detection() {
8503+
// This test is a mutation to underscore the detection logic bug we had
8504+
// before #653. HTLC value routed is above the remaining balance, thus
8505+
// inverting HTLC and `to_remote` output. HTLC will come second and
8506+
// it wouldn't be seen by pre-#653 detection as we were enumerate()'ing
8507+
// on a watched outputs vector (Vec<TxOut>) thus implicitly relying on
8508+
// outputs order detection for correct spending children filtring.
8509+
8510+
let chanmon_cfgs = create_chanmon_cfgs(2);
8511+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
8512+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
8513+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
8514+
8515+
// Create some initial channels
8516+
let chan_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, InitFeatures::known(), InitFeatures::known());
8517+
8518+
send_payment(&nodes[0], &vec!(&nodes[1])[..], 1_000_000, 1_000_000);
8519+
let (_, our_payment_hash) = route_payment(&nodes[0], &vec!(&nodes[1])[..], 2_000_000);
8520+
let local_txn = get_local_commitment_txn!(nodes[0], chan_1.2);
8521+
assert_eq!(local_txn[0].input.len(), 1);
8522+
assert_eq!(local_txn[0].output.len(), 3);
8523+
check_spends!(local_txn[0], chan_1.3);
8524+
8525+
// Timeout HTLC on A's chain and so it can generate a HTLC-Timeout tx
8526+
let header = BlockHeader { version: 0x20000000, prev_blockhash: Default::default(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
8527+
connect_block(&nodes[0], &Block { header, txdata: vec![local_txn[0].clone()] }, 200);
8528+
check_closed_broadcast!(nodes[0], false);
8529+
check_added_monitors!(nodes[0], 1);
8530+
8531+
let htlc_timeout = {
8532+
let node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap();
8533+
assert_eq!(node_txn[0].input.len(), 1);
8534+
assert_eq!(node_txn[0].input[0].witness.last().unwrap().len(), OFFERED_HTLC_SCRIPT_WEIGHT);
8535+
check_spends!(node_txn[0], local_txn[0]);
8536+
node_txn[0].clone()
8537+
};
8538+
8539+
let header_201 = BlockHeader { version: 0x20000000, prev_blockhash: header.block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
8540+
connect_block(&nodes[0], &Block { header: header_201, txdata: vec![htlc_timeout.clone()] }, 201);
8541+
connect_blocks(&nodes[0], ANTI_REORG_DELAY - 1, 201, true, header_201.block_hash());
8542+
expect_payment_failed!(nodes[0], our_payment_hash, true);
8543+
}

0 commit comments

Comments
 (0)