@@ -180,11 +180,6 @@ fn run_onion_failure_test_with_fail_intercept<F1,F2,F3>(
180
180
if expected_channel_update. is_some ( ) {
181
181
match network_update {
182
182
Some ( update) => match update {
183
- & NetworkUpdate :: ChannelUpdateMessage { .. } => {
184
- if let NetworkUpdate :: ChannelUpdateMessage { .. } = expected_channel_update. unwrap ( ) { } else {
185
- panic ! ( "channel_update not found!" ) ;
186
- }
187
- } ,
188
183
& NetworkUpdate :: ChannelFailure { ref short_channel_id, ref is_permanent } => {
189
184
if let NetworkUpdate :: ChannelFailure { short_channel_id : ref expected_short_channel_id, is_permanent : ref expected_is_permanent } = expected_channel_update. unwrap ( ) {
190
185
assert ! ( * short_channel_id == * expected_short_channel_id) ;
@@ -300,12 +295,13 @@ fn test_fee_failures() {
300
295
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , payment_preimage_success) ;
301
296
302
297
// If the hop gives fee_insufficient but enough fees were provided, then the previous hop
303
- // malleated the payment before forwarding, taking funds when they shouldn't have.
298
+ // malleated the payment before forwarding, taking funds when they shouldn't have. However,
299
+ // because we ignore channel update contents, we will still blame the 2nd channel.
304
300
let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ! ( nodes[ 2 ] ) ;
305
- let short_channel_id = channels[ 0 ] . 0 . contents . short_channel_id ;
301
+ let short_channel_id = channels[ 1 ] . 0 . contents . short_channel_id ;
306
302
run_onion_failure_test ( "fee_insufficient" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
307
303
msg. amount_msat -= 1 ;
308
- } , || { } , true , Some ( UPDATE |12 ) , Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : true } ) , Some ( short_channel_id) ) ;
304
+ } , || { } , true , Some ( UPDATE |12 ) , Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) , Some ( short_channel_id) ) ;
309
305
310
306
// In an earlier version, we spuriously failed to forward payments if the expected feerate
311
307
// changed between the channel open and the payment.
@@ -478,7 +474,9 @@ fn test_onion_failure() {
478
474
let session_priv = SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ;
479
475
let onion_keys = onion_utils:: construct_onion_keys ( & Secp256k1 :: new ( ) , & route. paths [ 0 ] , & session_priv) . unwrap ( ) ;
480
476
msg. reason = onion_utils:: build_first_hop_failure_packet ( onion_keys[ 0 ] . shared_secret . as_ref ( ) , UPDATE |7 , & err_data) ;
481
- } , ||{ } , true , Some ( UPDATE |7 ) , Some ( NetworkUpdate :: ChannelUpdateMessage { msg : chan_update. clone ( ) } ) , Some ( short_channel_id) ) ;
477
+ } , ||{ } , true , Some ( UPDATE |7 ) ,
478
+ Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) ,
479
+ Some ( short_channel_id) ) ;
482
480
483
481
// Check we can still handle onion failures that include channel updates without a type prefix
484
482
let err_data_without_type = chan_update. encode_with_len ( ) ;
@@ -488,7 +486,9 @@ fn test_onion_failure() {
488
486
let session_priv = SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ;
489
487
let onion_keys = onion_utils:: construct_onion_keys ( & Secp256k1 :: new ( ) , & route. paths [ 0 ] , & session_priv) . unwrap ( ) ;
490
488
msg. reason = onion_utils:: build_first_hop_failure_packet ( onion_keys[ 0 ] . shared_secret . as_ref ( ) , UPDATE |7 , & err_data_without_type) ;
491
- } , ||{ } , true , Some ( UPDATE |7 ) , Some ( NetworkUpdate :: ChannelUpdateMessage { msg : chan_update} ) , Some ( short_channel_id) ) ;
489
+ } , ||{ } , true , Some ( UPDATE |7 ) ,
490
+ Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) ,
491
+ Some ( short_channel_id) ) ;
492
492
493
493
let short_channel_id = channels[ 1 ] . 0 . contents . short_channel_id ;
494
494
run_onion_failure_test_with_fail_intercept ( "permanent_channel_failure" , 100 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
@@ -523,7 +523,9 @@ fn test_onion_failure() {
523
523
let mut bogus_route = route. clone ( ) ;
524
524
let route_len = bogus_route. paths [ 0 ] . hops . len ( ) ;
525
525
bogus_route. paths [ 0 ] . hops [ route_len-1 ] . fee_msat = amt_to_forward;
526
- run_onion_failure_test ( "amount_below_minimum" , 0 , & nodes, & bogus_route, & payment_hash, & payment_secret, |_| { } , ||{ } , true , Some ( UPDATE |11 ) , Some ( NetworkUpdate :: ChannelUpdateMessage { msg : ChannelUpdate :: dummy ( short_channel_id) } ) , Some ( short_channel_id) ) ;
526
+ run_onion_failure_test ( "amount_below_minimum" , 0 , & nodes, & bogus_route, & payment_hash, & payment_secret, |_| { } , ||{ } , true , Some ( UPDATE |11 ) ,
527
+ Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) ,
528
+ Some ( short_channel_id) ) ;
527
529
528
530
// Clear pending payments so that the following positive test has the correct payment hash.
529
531
for node in nodes. iter ( ) {
@@ -535,24 +537,28 @@ fn test_onion_failure() {
535
537
let preimage = send_along_route ( & nodes[ 0 ] , bogus_route, & [ & nodes[ 1 ] , & nodes[ 2 ] ] , amt_to_forward+1 ) . 0 ;
536
538
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , preimage) ;
537
539
538
- let short_channel_id = channels[ 0 ] . 0 . contents . short_channel_id ;
540
+ // We ignore channel update contents in onion errors, so will blame the 2nd channel even though
541
+ // the first node is the one that messed up.
542
+ let short_channel_id = channels[ 1 ] . 0 . contents . short_channel_id ;
539
543
run_onion_failure_test ( "fee_insufficient" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
540
544
msg. amount_msat -= 1 ;
541
- } , || { } , true , Some ( UPDATE |12 ) , Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : true } ) , Some ( short_channel_id) ) ;
545
+ } , || { } , true , Some ( UPDATE |12 ) , Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) , Some ( short_channel_id) ) ;
542
546
543
- let short_channel_id = channels[ 0 ] . 0 . contents . short_channel_id ;
547
+ let short_channel_id = channels[ 1 ] . 0 . contents . short_channel_id ;
544
548
run_onion_failure_test ( "incorrect_cltv_expiry" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
545
549
// need to violate: cltv_expiry - cltv_expiry_delta >= outgoing_cltv_value
546
550
msg. cltv_expiry -= 1 ;
547
- } , || { } , true , Some ( UPDATE |13 ) , Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : true } ) , Some ( short_channel_id) ) ;
551
+ } , || { } , true , Some ( UPDATE |13 ) , Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) , Some ( short_channel_id) ) ;
548
552
549
553
let short_channel_id = channels[ 1 ] . 0 . contents . short_channel_id ;
550
554
run_onion_failure_test ( "expiry_too_soon" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
551
555
let height = msg. cltv_expiry - CLTV_CLAIM_BUFFER - LATENCY_GRACE_PERIOD_BLOCKS + 1 ;
552
556
connect_blocks ( & nodes[ 0 ] , height - nodes[ 0 ] . best_block_info ( ) . 1 ) ;
553
557
connect_blocks ( & nodes[ 1 ] , height - nodes[ 1 ] . best_block_info ( ) . 1 ) ;
554
558
connect_blocks ( & nodes[ 2 ] , height - nodes[ 2 ] . best_block_info ( ) . 1 ) ;
555
- } , ||{ } , true , Some ( UPDATE |14 ) , Some ( NetworkUpdate :: ChannelUpdateMessage { msg : ChannelUpdate :: dummy ( short_channel_id) } ) , Some ( short_channel_id) ) ;
559
+ } , ||{ } , true , Some ( UPDATE |14 ) ,
560
+ Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) ,
561
+ Some ( short_channel_id) ) ;
556
562
557
563
run_onion_failure_test ( "unknown_payment_hash" , 2 , & nodes, & route, & payment_hash, & payment_secret, |_| { } , || {
558
564
nodes[ 2 ] . node . fail_htlc_backwards ( & payment_hash) ;
@@ -596,7 +602,9 @@ fn test_onion_failure() {
596
602
// disconnect event to the channel between nodes[1] ~ nodes[2]
597
603
nodes[ 1 ] . node . peer_disconnected ( & nodes[ 2 ] . node . get_our_node_id ( ) ) ;
598
604
nodes[ 2 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) ) ;
599
- } , true , Some ( UPDATE |7 ) , Some ( NetworkUpdate :: ChannelUpdateMessage { msg : ChannelUpdate :: dummy ( short_channel_id) } ) , Some ( short_channel_id) ) ;
605
+ } , true , Some ( UPDATE |7 ) ,
606
+ Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) ,
607
+ Some ( short_channel_id) ) ;
600
608
run_onion_failure_test ( "channel_disabled" , 0 , & nodes, & route, & payment_hash, & payment_secret, |_| { } , || {
601
609
// disconnect event to the channel between nodes[1] ~ nodes[2]
602
610
for _ in 0 ..DISABLE_GOSSIP_TICKS + 1 {
@@ -605,7 +613,9 @@ fn test_onion_failure() {
605
613
}
606
614
nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
607
615
nodes[ 2 ] . node . get_and_clear_pending_msg_events ( ) ;
608
- } , true , Some ( UPDATE |20 ) , Some ( NetworkUpdate :: ChannelUpdateMessage { msg : ChannelUpdate :: dummy ( short_channel_id) } ) , Some ( short_channel_id) ) ;
616
+ } , true , Some ( UPDATE |20 ) ,
617
+ Some ( NetworkUpdate :: ChannelFailure { short_channel_id, is_permanent : false } ) ,
618
+ Some ( short_channel_id) ) ;
609
619
reconnect_nodes ( ReconnectArgs :: new ( & nodes[ 1 ] , & nodes[ 2 ] ) ) ;
610
620
611
621
run_onion_failure_test ( "expiry_too_far" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
@@ -844,9 +854,9 @@ fn do_test_onion_failure_stale_channel_update(announced_channel: bool) {
844
854
// We'll be attempting to route payments using the default ChannelUpdate for channels. This will
845
855
// lead to onion failures at the first hop once we update the ChannelConfig for the
846
856
// second hop.
847
- let expect_onion_failure = |name : & str , error_code : u16 , channel_update : & msgs :: ChannelUpdate | {
857
+ let expect_onion_failure = |name : & str , error_code : u16 | {
848
858
let short_channel_id = channel_to_update. 1 ;
849
- let network_update = NetworkUpdate :: ChannelUpdateMessage { msg : channel_update . clone ( ) } ;
859
+ let network_update = NetworkUpdate :: ChannelFailure { short_channel_id , is_permanent : false } ;
850
860
run_onion_failure_test (
851
861
name, 0 , & nodes, & route, & payment_hash, & payment_secret, |_| { } , || { } , true ,
852
862
Some ( error_code) , Some ( network_update) , Some ( short_channel_id) ,
@@ -878,7 +888,7 @@ fn do_test_onion_failure_stale_channel_update(announced_channel: bool) {
878
888
// Connect a block, which should expire the previous config, leading to a failure when
879
889
// forwarding the HTLC.
880
890
expire_prev_config ( ) ;
881
- expect_onion_failure ( "fee_insufficient" , UPDATE |12 , & msg ) ;
891
+ expect_onion_failure ( "fee_insufficient" , UPDATE |12 ) ;
882
892
883
893
// Redundant updates should not trigger a new ChannelUpdate.
884
894
assert ! ( update_and_get_channel_update( & config, false , None , false ) . is_none( ) ) ;
@@ -891,15 +901,15 @@ fn do_test_onion_failure_stale_channel_update(announced_channel: bool) {
891
901
// new ChannelUpdate.
892
902
config. forwarding_fee_base_msat = default_config. forwarding_fee_base_msat ;
893
903
config. cltv_expiry_delta = u16:: max_value ( ) ;
894
- let msg = update_and_get_channel_update ( & config, true , Some ( & msg) , true ) . unwrap ( ) ;
895
- expect_onion_failure ( "incorrect_cltv_expiry" , UPDATE |13 , & msg ) ;
904
+ assert ! ( update_and_get_channel_update( & config, true , Some ( & msg) , true ) . is_some ( ) ) ;
905
+ expect_onion_failure ( "incorrect_cltv_expiry" , UPDATE |13 ) ;
896
906
897
907
// Reset the proportional fee and increase the CLTV expiry delta which should trigger a new
898
908
// ChannelUpdate.
899
909
config. cltv_expiry_delta = default_config. cltv_expiry_delta ;
900
910
config. forwarding_fee_proportional_millionths = u32:: max_value ( ) ;
901
- let msg = update_and_get_channel_update ( & config, true , Some ( & msg) , true ) . unwrap ( ) ;
902
- expect_onion_failure ( "fee_insufficient" , UPDATE |12 , & msg ) ;
911
+ assert ! ( update_and_get_channel_update( & config, true , Some ( & msg) , true ) . is_some ( ) ) ;
912
+ expect_onion_failure ( "fee_insufficient" , UPDATE |12 ) ;
903
913
904
914
// To test persistence of the updated config, we'll re-initialize the ChannelManager.
905
915
let config_after_restart = {
@@ -1530,10 +1540,10 @@ fn do_test_phantom_dust_exposure_failure(multiplier_dust_limit: bool) {
1530
1540
err_data. extend_from_slice ( & channel. 1 . encode ( ) ) ;
1531
1541
1532
1542
let mut fail_conditions = PaymentFailedConditions :: new ( )
1533
- . blamed_scid ( channel . 0 . contents . short_channel_id )
1543
+ . blamed_scid ( route . paths [ 0 ] . hops . last ( ) . as_ref ( ) . unwrap ( ) . short_channel_id )
1534
1544
. blamed_chan_closed ( false )
1535
1545
. expected_htlc_error_data ( 0x1000 | 7 , & err_data) ;
1536
- expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false , fail_conditions) ;
1546
+ expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false , fail_conditions) ;
1537
1547
}
1538
1548
1539
1549
#[ test]
0 commit comments