@@ -2052,6 +2052,98 @@ fn test_path_paused_mpp() {
2052
2052
claim_payment_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] , false , payment_preimage) ;
2053
2053
}
2054
2054
2055
+ #[ test]
2056
+ fn test_pending_update_fee_ack_on_reconnect ( ) {
2057
+ // In early versions of our automated fee update patch, nodes did not correctly use the
2058
+ // previous channel feerate after sending an undelivered revoke_and_ack when re-sending an
2059
+ // undelivered commitment_signed.
2060
+ //
2061
+ // B sends A new HTLC + CS, not delivered
2062
+ // A sends B update_fee + CS
2063
+ // B sends RAA, making B think the fee is locked
2064
+ // reconnect
2065
+ // B resends initial CS, using the original fee
2066
+
2067
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
2068
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
2069
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
2070
+ let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
2071
+
2072
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
2073
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 100_000_00 ) ;
2074
+
2075
+ let ( payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash ! ( & nodes[ 0 ] ) ;
2076
+ let route = get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , & nodes[ 1 ] . net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) ,
2077
+ & nodes[ 0 ] . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None , & Vec :: new ( ) , 1_000_000 , TEST_FINAL_CLTV , nodes[ 1 ] . logger ) . unwrap ( ) ;
2078
+ nodes[ 1 ] . node . send_payment ( & route, payment_hash, & Some ( payment_secret) ) . unwrap ( ) ;
2079
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2080
+ let bs_initial_send_msgs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2081
+ // bs_initial_send_msgs are not delivered until they are re-generated after reconnect
2082
+
2083
+ {
2084
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
2085
+ * feerate_lock *= 2 ;
2086
+ }
2087
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
2088
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2089
+ let as_update_fee_msgs = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2090
+ assert ! ( as_update_fee_msgs. update_fee. is_some( ) ) ;
2091
+
2092
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , as_update_fee_msgs. update_fee . as_ref ( ) . unwrap ( ) ) ;
2093
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update_fee_msgs. commitment_signed ) ;
2094
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2095
+ let bs_first_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2096
+ // bs_first_raa is not delivered until it is re-generated after reconnect
2097
+
2098
+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
2099
+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
2100
+
2101
+ nodes[ 0 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
2102
+ let as_connect_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2103
+ nodes[ 1 ] . node . peer_connected ( & nodes[ 0 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
2104
+ let bs_connect_msg = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2105
+
2106
+ nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_connect_msg) ;
2107
+ let bs_resend_msgs = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
2108
+ assert_eq ! ( bs_resend_msgs. len( ) , 3 ) ;
2109
+ if let MessageSendEvent :: UpdateHTLCs { ref updates, .. } = bs_resend_msgs[ 0 ] {
2110
+ assert_eq ! ( * updates, bs_initial_send_msgs) ;
2111
+ } else { panic ! ( ) ; }
2112
+ if let MessageSendEvent :: SendRevokeAndACK { ref msg, .. } = bs_resend_msgs[ 1 ] {
2113
+ assert_eq ! ( * msg, bs_first_raa) ;
2114
+ } else { panic ! ( ) ; }
2115
+ if let MessageSendEvent :: SendChannelUpdate { .. } = bs_resend_msgs[ 2 ] { } else { panic ! ( ) ; }
2116
+
2117
+ nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_connect_msg) ;
2118
+ get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2119
+
2120
+ nodes[ 0 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_initial_send_msgs. update_add_htlcs [ 0 ] ) ;
2121
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_initial_send_msgs. commitment_signed ) ;
2122
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2123
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ) ;
2124
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2125
+ let bs_second_cs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) . commitment_signed ;
2126
+
2127
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_raa) ;
2128
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2129
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) . commitment_signed ) ;
2130
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2131
+ let bs_third_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2132
+
2133
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_cs) ;
2134
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2135
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_third_raa) ;
2136
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2137
+
2138
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ) ;
2139
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2140
+
2141
+ expect_pending_htlcs_forwardable ! ( nodes[ 0 ] ) ;
2142
+ expect_payment_received ! ( nodes[ 0 ] , payment_hash, payment_secret, 1_000_000 ) ;
2143
+
2144
+ claim_payment ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] , payment_preimage) ;
2145
+ }
2146
+
2055
2147
fn do_update_fee_resend_test ( deliver_update : bool , parallel_updates : bool ) {
2056
2148
// In early versions we did not handle resending of update_fee on reconnect correctly. The
2057
2149
// chanmon_consistency fuzz target, of course, immediately found it, but we test a few cases
@@ -2094,10 +2186,15 @@ fn do_update_fee_resend_test(deliver_update: bool, parallel_updates: bool) {
2094
2186
let bs_connect_msg = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2095
2187
2096
2188
nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_connect_msg) ;
2189
+ get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2097
2190
assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
2098
2191
2099
2192
nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_connect_msg) ;
2100
- let update_msgs = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2193
+ let mut as_reconnect_msgs = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
2194
+ assert_eq ! ( as_reconnect_msgs. len( ) , 2 ) ;
2195
+ if let MessageSendEvent :: SendChannelUpdate { .. } = as_reconnect_msgs. pop ( ) . unwrap ( ) { } else { panic ! ( ) ; }
2196
+ let update_msgs = if let MessageSendEvent :: UpdateHTLCs { updates, .. } = as_reconnect_msgs. pop ( ) . unwrap ( )
2197
+ { updates } else { panic ! ( ) ; } ;
2101
2198
assert ! ( update_msgs. update_fee. is_some( ) ) ;
2102
2199
nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msgs. update_fee . as_ref ( ) . unwrap ( ) ) ;
2103
2200
if parallel_updates {
0 commit comments