@@ -180,11 +180,6 @@ fn run_onion_failure_test_with_fail_intercept<F1,F2,F3>(
180180 if expected_channel_update. is_some ( ) {
181181 match network_update {
182182 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- } ,
188183 & NetworkUpdate :: ChannelFailure { ref short_channel_id, ref is_permanent } => {
189184 if let NetworkUpdate :: ChannelFailure { short_channel_id : ref expected_short_channel_id, is_permanent : ref expected_is_permanent } = expected_channel_update. unwrap ( ) {
190185 assert ! ( * short_channel_id == * expected_short_channel_id) ;
@@ -300,12 +295,13 @@ fn test_fee_failures() {
300295 claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , payment_preimage_success) ;
301296
302297 // 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.
304300 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 ;
306302 run_onion_failure_test ( "fee_insufficient" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
307303 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) ) ;
309305
310306 // In an earlier version, we spuriously failed to forward payments if the expected feerate
311307 // changed between the channel open and the payment.
@@ -478,7 +474,9 @@ fn test_onion_failure() {
478474 let session_priv = SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ;
479475 let onion_keys = onion_utils:: construct_onion_keys ( & Secp256k1 :: new ( ) , & route. paths [ 0 ] , & session_priv) . unwrap ( ) ;
480476 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) ) ;
482480
483481 // Check we can still handle onion failures that include channel updates without a type prefix
484482 let err_data_without_type = chan_update. encode_with_len ( ) ;
@@ -488,7 +486,9 @@ fn test_onion_failure() {
488486 let session_priv = SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ;
489487 let onion_keys = onion_utils:: construct_onion_keys ( & Secp256k1 :: new ( ) , & route. paths [ 0 ] , & session_priv) . unwrap ( ) ;
490488 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) ) ;
492492
493493 let short_channel_id = channels[ 1 ] . 0 . contents . short_channel_id ;
494494 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() {
523523 let mut bogus_route = route. clone ( ) ;
524524 let route_len = bogus_route. paths [ 0 ] . hops . len ( ) ;
525525 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) ) ;
527529
528530 // Clear pending payments so that the following positive test has the correct payment hash.
529531 for node in nodes. iter ( ) {
@@ -535,24 +537,28 @@ fn test_onion_failure() {
535537 let preimage = send_along_route ( & nodes[ 0 ] , bogus_route, & [ & nodes[ 1 ] , & nodes[ 2 ] ] , amt_to_forward+1 ) . 0 ;
536538 claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , preimage) ;
537539
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 ;
539543 run_onion_failure_test ( "fee_insufficient" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
540544 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) ) ;
542546
543- let short_channel_id = channels[ 0 ] . 0 . contents . short_channel_id ;
547+ let short_channel_id = channels[ 1 ] . 0 . contents . short_channel_id ;
544548 run_onion_failure_test ( "incorrect_cltv_expiry" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
545549 // need to violate: cltv_expiry - cltv_expiry_delta >= outgoing_cltv_value
546550 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) ) ;
548552
549553 let short_channel_id = channels[ 1 ] . 0 . contents . short_channel_id ;
550554 run_onion_failure_test ( "expiry_too_soon" , 0 , & nodes, & route, & payment_hash, & payment_secret, |msg| {
551555 let height = msg. cltv_expiry - CLTV_CLAIM_BUFFER - LATENCY_GRACE_PERIOD_BLOCKS + 1 ;
552556 connect_blocks ( & nodes[ 0 ] , height - nodes[ 0 ] . best_block_info ( ) . 1 ) ;
553557 connect_blocks ( & nodes[ 1 ] , height - nodes[ 1 ] . best_block_info ( ) . 1 ) ;
554558 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) ) ;
556562
557563 run_onion_failure_test ( "unknown_payment_hash" , 2 , & nodes, & route, & payment_hash, & payment_secret, |_| { } , || {
558564 nodes[ 2 ] . node . fail_htlc_backwards ( & payment_hash) ;
@@ -596,7 +602,9 @@ fn test_onion_failure() {
596602 // disconnect event to the channel between nodes[1] ~ nodes[2]
597603 nodes[ 1 ] . node . peer_disconnected ( & nodes[ 2 ] . node . get_our_node_id ( ) ) ;
598604 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) ) ;
600608 run_onion_failure_test ( "channel_disabled" , 0 , & nodes, & route, & payment_hash, & payment_secret, |_| { } , || {
601609 // disconnect event to the channel between nodes[1] ~ nodes[2]
602610 for _ in 0 ..DISABLE_GOSSIP_TICKS + 1 {
@@ -605,7 +613,9 @@ fn test_onion_failure() {
605613 }
606614 nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
607615 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) ) ;
609619 reconnect_nodes ( ReconnectArgs :: new ( & nodes[ 1 ] , & nodes[ 2 ] ) ) ;
610620
611621 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) {
844854 // We'll be attempting to route payments using the default ChannelUpdate for channels. This will
845855 // lead to onion failures at the first hop once we update the ChannelConfig for the
846856 // 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 | {
848858 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 } ;
850860 run_onion_failure_test (
851861 name, 0 , & nodes, & route, & payment_hash, & payment_secret, |_| { } , || { } , true ,
852862 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) {
878888 // Connect a block, which should expire the previous config, leading to a failure when
879889 // forwarding the HTLC.
880890 expire_prev_config ( ) ;
881- expect_onion_failure ( "fee_insufficient" , UPDATE |12 , & msg ) ;
891+ expect_onion_failure ( "fee_insufficient" , UPDATE |12 ) ;
882892
883893 // Redundant updates should not trigger a new ChannelUpdate.
884894 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) {
891901 // new ChannelUpdate.
892902 config. forwarding_fee_base_msat = default_config. forwarding_fee_base_msat ;
893903 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 ) ;
896906
897907 // Reset the proportional fee and increase the CLTV expiry delta which should trigger a new
898908 // ChannelUpdate.
899909 config. cltv_expiry_delta = default_config. cltv_expiry_delta ;
900910 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 ) ;
903913
904914 // To test persistence of the updated config, we'll re-initialize the ChannelManager.
905915 let config_after_restart = {
@@ -1530,10 +1540,10 @@ fn do_test_phantom_dust_exposure_failure(multiplier_dust_limit: bool) {
15301540 err_data. extend_from_slice ( & channel. 1 . encode ( ) ) ;
15311541
15321542 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 )
15341544 . blamed_chan_closed ( false )
15351545 . 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) ;
15371547}
15381548
15391549#[ test]
0 commit comments