@@ -5093,14 +5093,20 @@ impl<'a, Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
5093
5093
5094
5094
#[ cfg( test) ]
5095
5095
mod tests {
5096
- use ln :: channelmanager :: PersistenceNotifier ;
5097
- use std :: sync :: Arc ;
5096
+ use bitcoin :: hashes :: Hash ;
5097
+ use bitcoin :: hashes :: sha256 :: Hash as Sha256 ;
5098
5098
use core:: sync:: atomic:: { AtomicBool , Ordering } ;
5099
- use std:: thread;
5100
5099
use core:: time:: Duration ;
5100
+ use ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
5101
+ use ln:: channelmanager:: PersistenceNotifier ;
5102
+ use ln:: features:: { InitFeatures , InvoiceFeatures } ;
5101
5103
use ln:: functional_test_utils:: * ;
5102
- use ln:: features:: InitFeatures ;
5103
5104
use ln:: msgs:: ChannelMessageHandler ;
5105
+ use routing:: router:: get_route;
5106
+ use util:: events:: { Event , MessageSendEvent , MessageSendEventsProvider } ;
5107
+ use util:: test_utils;
5108
+ use std:: sync:: Arc ;
5109
+ use std:: thread;
5104
5110
5105
5111
#[ test]
5106
5112
fn test_wait_timeout ( ) {
@@ -5215,6 +5221,191 @@ mod tests {
5215
5221
assert_ne ! ( nodes[ 0 ] . node. list_channels( ) [ 0 ] , node_a_chan_info) ;
5216
5222
assert_ne ! ( nodes[ 1 ] . node. list_channels( ) [ 0 ] , node_b_chan_info) ;
5217
5223
}
5224
+
5225
+ #[ test]
5226
+ fn test_keysend_dup_hash_partial_mpp ( ) {
5227
+ // Test that a keysend payment with a duplicate hash to an existing partial MPP payment fails as
5228
+ // expected.
5229
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
5230
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
5231
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
5232
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
5233
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
5234
+ let logger = test_utils:: TestLogger :: new ( ) ;
5235
+
5236
+ // First, send a partial MPP payment.
5237
+ let net_graph_msg_handler = & nodes[ 0 ] . net_graph_msg_handler ;
5238
+ let route = get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , & net_graph_msg_handler. network_graph . read ( ) . unwrap ( ) , & nodes[ 1 ] . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None , & Vec :: new ( ) , 100_000 , TEST_FINAL_CLTV , & logger) . unwrap ( ) ;
5239
+ let ( payment_preimage, our_payment_hash, payment_secret) = get_payment_preimage_hash ! ( & nodes[ 1 ] ) ;
5240
+ // Use the utility function send_payment_along_path to send the payment with MPP data which
5241
+ // indicates there are more HTLCs coming.
5242
+ let cur_height = CHAN_CONFIRM_DEPTH + 1 ; // route_payment calls send_payment, which adds 1 to the current height. So we do the same here to match.
5243
+ nodes[ 0 ] . node . send_payment_along_path ( & route. paths [ 0 ] , & our_payment_hash, & Some ( payment_secret) , 200_000 , cur_height, & None ) . unwrap ( ) ;
5244
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5245
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
5246
+ assert_eq ! ( events. len( ) , 1 ) ;
5247
+ pass_along_path ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 200_000 , our_payment_hash, Some ( payment_secret) , events. drain ( ..) . next ( ) . unwrap ( ) , false , None ) ;
5248
+
5249
+ // Next, send a keysend payment with the same payment_hash and make sure it fails.
5250
+ nodes[ 0 ] . node . send_spontaneous_payment ( & route, Some ( payment_preimage) ) . unwrap ( ) ;
5251
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5252
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
5253
+ assert_eq ! ( events. len( ) , 1 ) ;
5254
+ let ev = events. drain ( ..) . next ( ) . unwrap ( ) ;
5255
+ let payment_event = SendEvent :: from_event ( ev) ;
5256
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
5257
+ check_added_monitors ! ( nodes[ 1 ] , 0 ) ;
5258
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , payment_event. commitment_msg, false ) ;
5259
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
5260
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
5261
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5262
+ let updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
5263
+ assert ! ( updates. update_add_htlcs. is_empty( ) ) ;
5264
+ assert ! ( updates. update_fulfill_htlcs. is_empty( ) ) ;
5265
+ assert_eq ! ( updates. update_fail_htlcs. len( ) , 1 ) ;
5266
+ assert ! ( updates. update_fail_malformed_htlcs. is_empty( ) ) ;
5267
+ assert ! ( updates. update_fee. is_none( ) ) ;
5268
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & updates. update_fail_htlcs [ 0 ] ) ;
5269
+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , updates. commitment_signed, true , true ) ;
5270
+ expect_payment_failed ! ( nodes[ 0 ] , our_payment_hash, true ) ;
5271
+
5272
+ // Send the second half of the original MPP payment.
5273
+ nodes[ 0 ] . node . send_payment_along_path ( & route. paths [ 0 ] , & our_payment_hash, & Some ( payment_secret) , 200_000 , cur_height, & None ) . unwrap ( ) ;
5274
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5275
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
5276
+ assert_eq ! ( events. len( ) , 1 ) ;
5277
+ pass_along_path ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 200_000 , our_payment_hash, Some ( payment_secret) , events. drain ( ..) . next ( ) . unwrap ( ) , true , None ) ;
5278
+
5279
+ // Claim the full MPP payment. Note that we can't use a test utility like
5280
+ // claim_funds_along_route because the ordering of the messages causes the second half of the
5281
+ // payment to be put in the holding cell, which confuses the test utilities. So we exchange the
5282
+ // lightning messages manually.
5283
+ assert ! ( nodes[ 1 ] . node. claim_funds( payment_preimage) ) ;
5284
+ check_added_monitors ! ( nodes[ 1 ] , 2 ) ;
5285
+ let bs_first_updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
5286
+ nodes[ 0 ] . node . handle_update_fulfill_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_updates. update_fulfill_htlcs [ 0 ] ) ;
5287
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_updates. commitment_signed ) ;
5288
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5289
+ let ( as_first_raa, as_first_cs) = get_revoke_commit_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
5290
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_first_raa) ;
5291
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5292
+ let bs_second_updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
5293
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_first_cs) ;
5294
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5295
+ let bs_first_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
5296
+ nodes[ 0 ] . node . handle_update_fulfill_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_updates. update_fulfill_htlcs [ 0 ] ) ;
5297
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_updates. commitment_signed ) ;
5298
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5299
+ let as_second_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
5300
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_raa) ;
5301
+ let as_second_updates = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
5302
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5303
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_raa) ;
5304
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5305
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_updates. commitment_signed ) ;
5306
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5307
+ let bs_third_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
5308
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_third_raa) ;
5309
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5310
+
5311
+ // There's an existing bug that generates a PaymentSent event for each MPP path, so handle that here.
5312
+ let events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
5313
+ match events[ 0 ] {
5314
+ Event :: PaymentSent { payment_preimage : ref preimage } => {
5315
+ assert_eq ! ( payment_preimage, * preimage) ;
5316
+ } ,
5317
+ _ => panic ! ( "Unexpected event" ) ,
5318
+ }
5319
+ match events[ 1 ] {
5320
+ Event :: PaymentSent { payment_preimage : ref preimage } => {
5321
+ assert_eq ! ( payment_preimage, * preimage) ;
5322
+ } ,
5323
+ _ => panic ! ( "Unexpected event" ) ,
5324
+ }
5325
+ }
5326
+
5327
+ #[ test]
5328
+ fn test_keysend_dup_payment_hash ( ) {
5329
+ // (1): Test that a keysend payment with a duplicate payment hash to an existing pending
5330
+ // outbound regular payment fails as expected.
5331
+ // (2): Test that a regular payment with a duplicate payment hash to an existing keysend payment
5332
+ // fails as expected.
5333
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
5334
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
5335
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
5336
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
5337
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
5338
+ let logger = test_utils:: TestLogger :: new ( ) ;
5339
+
5340
+ // To start (1), send a regular payment but don't claim it.
5341
+ let expected_route = [ & nodes[ 1 ] ] ;
5342
+ let ( payment_preimage, payment_hash, _) = route_payment ( & nodes[ 0 ] , & expected_route, 100_000 ) ;
5343
+
5344
+ // Next, attempt a keysend payment and make sure it fails.
5345
+ let route = get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , & nodes[ 0 ] . net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) , & expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None , & Vec :: new ( ) , 100_000 , TEST_FINAL_CLTV , & logger) . unwrap ( ) ;
5346
+ nodes[ 0 ] . node . send_spontaneous_payment ( & route, Some ( payment_preimage) ) . unwrap ( ) ;
5347
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5348
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
5349
+ assert_eq ! ( events. len( ) , 1 ) ;
5350
+ let ev = events. drain ( ..) . next ( ) . unwrap ( ) ;
5351
+ let payment_event = SendEvent :: from_event ( ev) ;
5352
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
5353
+ check_added_monitors ! ( nodes[ 1 ] , 0 ) ;
5354
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , payment_event. commitment_msg, false ) ;
5355
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
5356
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
5357
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5358
+ let updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
5359
+ assert ! ( updates. update_add_htlcs. is_empty( ) ) ;
5360
+ assert ! ( updates. update_fulfill_htlcs. is_empty( ) ) ;
5361
+ assert_eq ! ( updates. update_fail_htlcs. len( ) , 1 ) ;
5362
+ assert ! ( updates. update_fail_malformed_htlcs. is_empty( ) ) ;
5363
+ assert ! ( updates. update_fee. is_none( ) ) ;
5364
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & updates. update_fail_htlcs [ 0 ] ) ;
5365
+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , updates. commitment_signed, true , true ) ;
5366
+ expect_payment_failed ! ( nodes[ 0 ] , payment_hash, true ) ;
5367
+
5368
+ // Finally, claim the original payment.
5369
+ claim_payment ( & nodes[ 0 ] , & expected_route, payment_preimage) ;
5370
+
5371
+ // To start (2), send a keysend payment but don't claim it.
5372
+ let payment_preimage = PaymentPreimage ( [ 42 ; 32 ] ) ;
5373
+ let route = get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , & nodes[ 0 ] . net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) , & expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None , & Vec :: new ( ) , 100_000 , TEST_FINAL_CLTV , & logger) . unwrap ( ) ;
5374
+ let payment_hash = nodes[ 0 ] . node . send_spontaneous_payment ( & route, Some ( payment_preimage) ) . unwrap ( ) ;
5375
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5376
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
5377
+ assert_eq ! ( events. len( ) , 1 ) ;
5378
+ let event = events. pop ( ) . unwrap ( ) ;
5379
+ let path = vec ! [ & nodes[ 1 ] ] ;
5380
+ pass_along_path ( & nodes[ 0 ] , & path, 100_000 , payment_hash, None , event, true , Some ( payment_preimage) ) ;
5381
+
5382
+ // Next, attempt a regular payment and make sure it fails.
5383
+ let payment_secret = PaymentSecret ( [ 43 ; 32 ] ) ;
5384
+ nodes[ 0 ] . node . send_payment ( & route, payment_hash, & Some ( payment_secret) ) . unwrap ( ) ;
5385
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5386
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
5387
+ assert_eq ! ( events. len( ) , 1 ) ;
5388
+ let ev = events. drain ( ..) . next ( ) . unwrap ( ) ;
5389
+ let payment_event = SendEvent :: from_event ( ev) ;
5390
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
5391
+ check_added_monitors ! ( nodes[ 1 ] , 0 ) ;
5392
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , payment_event. commitment_msg, false ) ;
5393
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
5394
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
5395
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5396
+ let updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
5397
+ assert ! ( updates. update_add_htlcs. is_empty( ) ) ;
5398
+ assert ! ( updates. update_fulfill_htlcs. is_empty( ) ) ;
5399
+ assert_eq ! ( updates. update_fail_htlcs. len( ) , 1 ) ;
5400
+ assert ! ( updates. update_fail_malformed_htlcs. is_empty( ) ) ;
5401
+ assert ! ( updates. update_fee. is_none( ) ) ;
5402
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & updates. update_fail_htlcs [ 0 ] ) ;
5403
+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , updates. commitment_signed, true , true ) ;
5404
+ expect_payment_failed ! ( nodes[ 0 ] , payment_hash, true ) ;
5405
+
5406
+ // Finally, succeed the keysend payment.
5407
+ claim_payment ( & nodes[ 0 ] , & expected_route, payment_preimage) ;
5408
+ }
5218
5409
}
5219
5410
5220
5411
#[ cfg( all( any( test, feature = "_test_utils" ) , feature = "unstable" ) ) ]
0 commit comments