@@ -5356,115 +5356,119 @@ fn test_onchain_to_onchain_claim() {
5356
5356
#[test]
5357
5357
fn test_duplicate_payment_hash_one_failure_one_success() {
5358
5358
// Topology : A --> B --> C --> D
5359
- // We route 2 payments with same hash between B and C, one will be timeout, the other successfully claim
5360
- // Note that because C will refuse to generate two payment secrets for the same payment hash,
5361
- // we forward one of the payments onwards to D .
5362
- let chanmon_cfgs = create_chanmon_cfgs(4 );
5363
- let node_cfgs = create_node_cfgs(4 , &chanmon_cfgs);
5359
+ // \-> E
5360
+ // We route 2 payments with same hash between B and C, one we will time out on chain, the other
5361
+ // successfully claim .
5362
+ let chanmon_cfgs = create_chanmon_cfgs(5 );
5363
+ let node_cfgs = create_node_cfgs(5 , &chanmon_cfgs);
5364
5364
// When this test was written, the default base fee floated based on the HTLC count.
5365
5365
// It is now fixed, so we simply set the fee to the expected value here.
5366
5366
let mut config = test_default_channel_config();
5367
5367
config.channel_config.forwarding_fee_base_msat = 196;
5368
- let node_chanmgrs = create_node_chanmgrs(4 , &node_cfgs,
5369
- &[Some(config.clone()), Some(config.clone()), Some(config.clone()), Some(config.clone())]);
5370
- let mut nodes = create_network(4 , &node_cfgs, &node_chanmgrs);
5368
+ let node_chanmgrs = create_node_chanmgrs(5 , &node_cfgs,
5369
+ &[Some(config.clone()), Some(config.clone()), Some(config.clone()), Some(config.clone()), Some(config.clone()) ]);
5370
+ let mut nodes = create_network(5 , &node_cfgs, &node_chanmgrs);
5371
5371
5372
+ // Create the required channels and route one HTLC from A to D and another from A to E.
5372
5373
create_announced_chan_between_nodes(&nodes, 0, 1);
5373
5374
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2);
5374
5375
create_announced_chan_between_nodes(&nodes, 2, 3);
5376
+ create_announced_chan_between_nodes(&nodes, 2, 4);
5375
5377
5376
5378
let node_max_height = nodes.iter().map(|node| node.blocks.lock().unwrap().len()).max().unwrap() as u32;
5377
- connect_blocks(&nodes[0], node_max_height - nodes[0].best_block_info().1);
5378
- connect_blocks(&nodes[1], node_max_height - nodes[1].best_block_info().1);
5379
- connect_blocks(&nodes[2], node_max_height - nodes[2].best_block_info().1);
5380
- connect_blocks(&nodes[3], node_max_height - nodes[3].best_block_info().1);
5381
-
5382
- let (our_payment_preimage, duplicate_payment_hash, ..) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 900_000);
5383
-
5384
- let payment_secret = nodes[3].node.create_inbound_payment_for_hash(duplicate_payment_hash, None, 7200, None).unwrap();
5385
- // We reduce the final CLTV here by a somewhat arbitrary constant to keep it under the one-byte
5386
- // script push size limit so that the below script length checks match
5387
- // ACCEPTED_HTLC_SCRIPT_WEIGHT.
5388
- let payment_params = PaymentParameters::from_node_id (nodes[3].node.get_our_node_id(), TEST_FINAL_CLTV - 40)
5389
- .with_bolt11_features( nodes[3].node.bolt11_invoice_features()).unwrap( );
5390
- let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[3], payment_params, 800_000);
5391
- send_along_route_with_secret(&nodes[0], route, &[&[&nodes[1], &nodes[2], &nodes[3]]], 800_000, duplicate_payment_hash, payment_secret);
5392
-
5379
+ connect_blocks(&nodes[0], node_max_height * 2 - nodes[0].best_block_info().1);
5380
+ connect_blocks(&nodes[1], node_max_height * 2 - nodes[1].best_block_info().1);
5381
+ connect_blocks(&nodes[2], node_max_height * 2 - nodes[2].best_block_info().1);
5382
+ connect_blocks(&nodes[3], node_max_height * 2 - nodes[3].best_block_info().1);
5383
+ connect_blocks(&nodes[4], node_max_height * 2 - nodes[4].best_block_info().1);
5384
+
5385
+ let (our_payment_preimage, duplicate_payment_hash, ..) = route_payment(&nodes[0], &[&nodes[1], &nodes[2], &nodes[3]], 900_000);
5386
+
5387
+ let payment_secret = nodes[4].node.create_inbound_payment_for_hash(duplicate_payment_hash, None, 7200, None).unwrap();
5388
+ let payment_params = PaymentParameters::from_node_id(nodes[4].node.get_our_node_id(), TEST_FINAL_CLTV)
5389
+ .with_bolt11_features(nodes[4].node.bolt11_invoice_features()).unwrap();
5390
+ let (route, _, _, _) = get_route_and_payment_hash! (nodes[0], nodes[4], payment_params, 800_000);
5391
+ send_along_route_with_secret(& nodes[0], route, &[&[&nodes[1], &nodes[2], &nodes[4]]], 800_000, duplicate_payment_hash, payment_secret );
5392
+
5393
+ // Now mine C's commitment transaction on node B and mine enough blocks to get the HTLC timeout
5394
+ // transaction (which we'll split in two so that we can resolve the HTLCs differently).
5393
5395
let commitment_txn = get_local_commitment_txn!(nodes[2], chan_2.2);
5394
5396
assert_eq!(commitment_txn[0].input.len(), 1);
5397
+ assert_eq!(commitment_txn[0].output.len(), 3);
5395
5398
check_spends!(commitment_txn[0], chan_2.3);
5396
5399
5397
5400
mine_transaction(&nodes[1], &commitment_txn[0]);
5398
5401
check_closed_broadcast!(nodes[1], true);
5399
5402
check_added_monitors!(nodes[1], 1);
5400
5403
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed, [nodes[2].node.get_our_node_id()], 100000);
5401
- connect_blocks(&nodes[1], TEST_FINAL_CLTV - 40 + MIN_CLTV_EXPIRY_DELTA as u32); // Confirm blocks until the HTLC expires
5402
5404
5403
- let htlc_timeout_tx;
5404
- { // Extract one of the two HTLC-Timeout transaction
5405
- let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
5406
- // ChannelMonitor: timeout tx * 2-or-3
5407
- assert!(node_txn.len() == 2 || node_txn.len() == 3);
5405
+ // Confirm blocks until both HTLCs expire and get a transaction which times out one HTLC.
5406
+ connect_blocks(&nodes[1], TEST_FINAL_CLTV + config.channel_config.cltv_expiry_delta as u32);
5408
5407
5409
- check_spends!(node_txn[0], commitment_txn[0]);
5410
- assert_eq!(node_txn[0].input.len(), 1);
5411
- assert_eq!(node_txn[0].output.len(), 1);
5412
-
5413
- if node_txn.len() > 2 {
5414
- check_spends!(node_txn[1], commitment_txn[0]);
5415
- assert_eq!(node_txn[1].input.len(), 1);
5416
- assert_eq!(node_txn[1].output.len(), 1);
5417
- assert_eq!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
5418
-
5419
- check_spends!(node_txn[2], commitment_txn[0]);
5420
- assert_eq!(node_txn[2].input.len(), 1);
5421
- assert_eq!(node_txn[2].output.len(), 1);
5422
- assert_ne!(node_txn[0].input[0].previous_output, node_txn[2].input[0].previous_output);
5423
- } else {
5424
- check_spends!(node_txn[1], commitment_txn[0]);
5425
- assert_eq!(node_txn[1].input.len(), 1);
5426
- assert_eq!(node_txn[1].output.len(), 1);
5427
- assert_ne!(node_txn[0].input[0].previous_output, node_txn[1].input[0].previous_output);
5428
- }
5408
+ let htlc_timeout_tx = {
5409
+ let mut node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
5410
+ assert_eq!(node_txn.len(), 1);
5429
5411
5430
- assert_eq!(node_txn[0].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
5431
- assert_eq!(node_txn[1].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
5432
- // Assign htlc_timeout_tx to the forwarded HTLC (with value ~800 sats). The received HTLC
5433
- // (with value 900 sats) will be claimed in the below `claim_funds` call.
5434
- if node_txn.len() > 2 {
5435
- assert_eq!(node_txn[2].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
5436
- htlc_timeout_tx = if node_txn[2].output[0].value.to_sat() < 900 { node_txn[2].clone() } else { node_txn[0].clone() };
5437
- } else {
5438
- htlc_timeout_tx = if node_txn[0].output[0].value.to_sat() < 900 { node_txn[1].clone() } else { node_txn[0].clone() };
5412
+ let mut tx = node_txn.pop().unwrap();
5413
+ check_spends!(tx, commitment_txn[0]);
5414
+ assert_eq!(tx.input.len(), 2);
5415
+ assert_eq!(tx.output.len(), 1);
5416
+ // Note that the witness script lengths are one longer than our constant as the CLTV value
5417
+ // went to two bytes rather than one.
5418
+ assert_eq!(tx.input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT + 1);
5419
+ assert_eq!(tx.input[1].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT + 1);
5420
+
5421
+ // Split the HTLC claim transaction into two, one for each HTLC.
5422
+ if commitment_txn[0].output[tx.input[1].previous_output.vout as usize].value.to_sat() < 850 {
5423
+ tx.input.remove(1);
5439
5424
}
5440
- }
5425
+ if commitment_txn[0].output[tx.input[0].previous_output.vout as usize].value.to_sat() < 850 {
5426
+ tx.input.remove(0);
5427
+ }
5428
+ assert_eq!(tx.input.len(), 1);
5429
+ tx
5430
+ };
5441
5431
5442
- nodes[2].node.claim_funds(our_payment_preimage);
5443
- expect_payment_claimed!(nodes[2], duplicate_payment_hash, 900_000);
5432
+ // Now give node E the payment preimage and pass it back to C.
5433
+ nodes[4].node.claim_funds(our_payment_preimage);
5434
+ expect_payment_claimed!(nodes[4], duplicate_payment_hash, 800_000);
5435
+ check_added_monitors!(nodes[4], 1);
5436
+ let updates = get_htlc_update_msgs!(nodes[4], nodes[2].node.get_our_node_id());
5437
+ nodes[2].node.handle_update_fulfill_htlc(nodes[4].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
5438
+ let _cs_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
5439
+ expect_payment_forwarded!(nodes[2], nodes[1], nodes[4], Some(196), false, false);
5440
+ check_added_monitors!(nodes[2], 1);
5441
+ commitment_signed_dance!(nodes[2], nodes[4], &updates.commitment_signed, false);
5444
5442
5443
+ // Mine the commitment transaction on node C and get the HTLC success transactions it will
5444
+ // generate (note that the ChannelMonitor doesn't differentiate between HTLCs once it has the
5445
+ // preimage).
5445
5446
mine_transaction(&nodes[2], &commitment_txn[0]);
5446
- check_added_monitors!(nodes[2], 2 );
5447
+ check_added_monitors!(nodes[2], 1 );
5447
5448
check_closed_event!(nodes[2], 1, ClosureReason::CommitmentTxConfirmed, [nodes[1].node.get_our_node_id()], 100000);
5448
- let events = nodes[2].node.get_and_clear_pending_msg_events();
5449
- match events[0] {
5450
- MessageSendEvent::UpdateHTLCs { .. } => {},
5451
- _ => panic!("Unexpected event"),
5452
- }
5453
- match events[2] {
5454
- MessageSendEvent::BroadcastChannelUpdate { .. } => {},
5455
- _ => panic!("Unexepected event"),
5456
- }
5449
+ check_closed_broadcast(&nodes[2], 1, true);
5450
+
5457
5451
let htlc_success_txn: Vec<_> = nodes[2].tx_broadcaster.txn_broadcasted.lock().unwrap().clone();
5458
5452
assert_eq!(htlc_success_txn.len(), 2); // ChannelMonitor: HTLC-Success txn (*2 due to 2-HTLC outputs)
5459
5453
check_spends!(htlc_success_txn[0], commitment_txn[0]);
5460
5454
check_spends!(htlc_success_txn[1], commitment_txn[0]);
5461
5455
assert_eq!(htlc_success_txn[0].input.len(), 1);
5462
- assert_eq!(htlc_success_txn[0].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
5456
+ // Note that the witness script lengths are one longer than our constant as the CLTV value went
5457
+ // to two bytes rather than one.
5458
+ assert_eq!(htlc_success_txn[0].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT + 1);
5463
5459
assert_eq!(htlc_success_txn[1].input.len(), 1);
5464
- assert_eq!(htlc_success_txn[1].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
5460
+ assert_eq!(htlc_success_txn[1].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT + 1 );
5465
5461
assert_ne!(htlc_success_txn[0].input[0].previous_output, htlc_success_txn[1].input[0].previous_output);
5466
- assert_ne!(htlc_success_txn[1].input[0].previous_output, htlc_timeout_tx.input[0].previous_output);
5467
5462
5463
+ let htlc_success_tx_to_confirm =
5464
+ if htlc_success_txn[0].input[0].previous_output == htlc_timeout_tx.input[0].previous_output {
5465
+ &htlc_success_txn[1]
5466
+ } else {
5467
+ &htlc_success_txn[0]
5468
+ };
5469
+ assert_ne!(htlc_success_tx_to_confirm.input[0].previous_output, htlc_timeout_tx.input[0].previous_output);
5470
+
5471
+ // Mine the HTLC timeout transaction on node B.
5468
5472
mine_transaction(&nodes[1], &htlc_timeout_tx);
5469
5473
connect_blocks(&nodes[1], ANTI_REORG_DELAY - 1);
5470
5474
expect_pending_htlcs_forwardable_and_htlc_handling_failed!(nodes[1], vec![HTLCDestination::NextHopChannel { node_id: Some(nodes[2].node.get_our_node_id()), channel_id: chan_2.2 }]);
@@ -5478,14 +5482,13 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
5478
5482
5479
5483
nodes[0].node.handle_update_fail_htlc(nodes[1].node.get_our_node_id(), &htlc_updates.update_fail_htlcs[0]);
5480
5484
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
5481
- {
5482
- commitment_signed_dance!(nodes[0], nodes[1], &htlc_updates.commitment_signed, false, true);
5483
- }
5485
+ commitment_signed_dance!(nodes[0], nodes[1], &htlc_updates.commitment_signed, false, true);
5484
5486
expect_payment_failed_with_update!(nodes[0], duplicate_payment_hash, false, chan_2.0.contents.short_channel_id, true);
5485
5487
5486
- // Solve 2nd HTLC by broadcasting on B's chain HTLC-Success Tx from C
5487
- mine_transaction(&nodes[1], &htlc_success_txn[1]);
5488
- expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(196), true, true);
5488
+ // Finally, give node B the HTLC success transaction and ensure it extracts the preimage to
5489
+ // provide to node A.
5490
+ mine_transaction(&nodes[1], htlc_success_tx_to_confirm);
5491
+ expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(392), true, true);
5489
5492
let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
5490
5493
assert!(updates.update_add_htlcs.is_empty());
5491
5494
assert!(updates.update_fail_htlcs.is_empty());
0 commit comments