@@ -1058,7 +1058,7 @@ mod tests {
1058
1058
use ln:: router:: { Router , NodeInfo , NetworkMap , ChannelInfo , DirectionalChannelInfo , RouteHint } ;
1059
1059
use ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
1060
1060
use ln:: msgs:: { ErrorAction , LightningError , RoutingMessageHandler , UnsignedNodeAnnouncement , NodeAnnouncement ,
1061
- UnsignedChannelAnnouncement , ChannelAnnouncement } ;
1061
+ UnsignedChannelAnnouncement , ChannelAnnouncement , UnsignedChannelUpdate , ChannelUpdate } ;
1062
1062
use util:: test_utils;
1063
1063
use util:: test_utils:: TestVecWriter ;
1064
1064
use util:: logger:: Logger ;
@@ -2165,4 +2165,136 @@ mod tests {
2165
2165
Err ( e) => assert_eq ! ( e. err, "Channel announcement node had a channel with itself" )
2166
2166
} ;
2167
2167
}
2168
+
2169
+ #[ test]
2170
+ fn handling_channel_update ( ) {
2171
+ let ( secp_ctx, _, router) = create_router ( ) ;
2172
+ let node_1_privkey = & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ;
2173
+ let node_2_privkey = & SecretKey :: from_slice ( & [ 41 ; 32 ] ) . unwrap ( ) ;
2174
+ let node_id_1 = PublicKey :: from_secret_key ( & secp_ctx, node_1_privkey) ;
2175
+ let node_id_2 = PublicKey :: from_secret_key ( & secp_ctx, node_2_privkey) ;
2176
+ let node_1_btckey = & SecretKey :: from_slice ( & [ 40 ; 32 ] ) . unwrap ( ) ;
2177
+ let node_2_btckey = & SecretKey :: from_slice ( & [ 39 ; 32 ] ) . unwrap ( ) ;
2178
+
2179
+ let zero_hash = Sha256dHash :: hash ( & [ 0 ; 32 ] ) ;
2180
+ let short_channel_id = 0 ;
2181
+ let chain_hash = genesis_block ( Network :: Testnet ) . header . bitcoin_hash ( ) ;
2182
+ let channel_key = NetworkMap :: get_key ( short_channel_id, chain_hash) ;
2183
+
2184
+
2185
+ {
2186
+ // Announce a channel we will update
2187
+ let unsigned_announcement = UnsignedChannelAnnouncement {
2188
+ features : ChannelFeatures :: empty ( ) ,
2189
+ chain_hash,
2190
+ short_channel_id,
2191
+ node_id_1,
2192
+ node_id_2,
2193
+ bitcoin_key_1 : PublicKey :: from_secret_key ( & secp_ctx, node_1_btckey) ,
2194
+ bitcoin_key_2 : PublicKey :: from_secret_key ( & secp_ctx, node_2_btckey) ,
2195
+ excess_data : Vec :: new ( ) ,
2196
+ } ;
2197
+
2198
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2199
+ let valid_channel_announcement = ChannelAnnouncement {
2200
+ node_signature_1 : secp_ctx. sign ( & msghash, node_1_privkey) ,
2201
+ node_signature_2 : secp_ctx. sign ( & msghash, node_2_privkey) ,
2202
+ bitcoin_signature_1 : secp_ctx. sign ( & msghash, node_1_btckey) ,
2203
+ bitcoin_signature_2 : secp_ctx. sign ( & msghash, node_2_btckey) ,
2204
+ contents : unsigned_announcement. clone ( ) ,
2205
+ } ;
2206
+ match router. handle_channel_announcement ( & valid_channel_announcement) {
2207
+ Ok ( _) => ( ) ,
2208
+ Err ( _) => panic ! ( )
2209
+ } ;
2210
+
2211
+ }
2212
+
2213
+ let mut unsigned_channel_update = UnsignedChannelUpdate {
2214
+ chain_hash,
2215
+ short_channel_id,
2216
+ timestamp : 100 ,
2217
+ flags : 0 ,
2218
+ cltv_expiry_delta : 144 ,
2219
+ htlc_minimum_msat : 1000000 ,
2220
+ fee_base_msat : 10000 ,
2221
+ fee_proportional_millionths : 20 ,
2222
+ excess_data : Vec :: new ( )
2223
+ } ;
2224
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2225
+ let valid_channel_update = ChannelUpdate {
2226
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2227
+ contents : unsigned_channel_update. clone ( )
2228
+ } ;
2229
+
2230
+ match router. handle_channel_update ( & valid_channel_update) {
2231
+ Ok ( res) => assert ! ( res) ,
2232
+ _ => panic ! ( )
2233
+ } ;
2234
+
2235
+ {
2236
+ let network = router. network_map . write ( ) . unwrap ( ) ;
2237
+ match network. channels . get ( & channel_key) {
2238
+ None => panic ! ( ) ,
2239
+ Some ( channel_info) => {
2240
+ assert_eq ! ( channel_info. one_to_two. cltv_expiry_delta, 144 ) ;
2241
+ assert_eq ! ( channel_info. two_to_one. cltv_expiry_delta, u16 :: max_value( ) ) ;
2242
+ }
2243
+ }
2244
+ }
2245
+
2246
+ unsigned_channel_update. timestamp += 100 ;
2247
+ unsigned_channel_update. excess_data . push ( 1 ) ;
2248
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2249
+ let valid_channel_update = ChannelUpdate {
2250
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2251
+ contents : unsigned_channel_update. clone ( )
2252
+ } ;
2253
+ // Return false because contains excess data
2254
+ match router. handle_channel_update ( & valid_channel_update) {
2255
+ Ok ( res) => assert ! ( !res) ,
2256
+ _ => panic ! ( )
2257
+ } ;
2258
+
2259
+ unsigned_channel_update. short_channel_id += 1 ;
2260
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2261
+ let valid_channel_update = ChannelUpdate {
2262
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2263
+ contents : unsigned_channel_update. clone ( )
2264
+ } ;
2265
+
2266
+ match router. handle_channel_update ( & valid_channel_update) {
2267
+ Ok ( _) => panic ! ( ) ,
2268
+ Err ( e) => assert_eq ! ( e. err, "Couldn't find channel for update" )
2269
+ } ;
2270
+ unsigned_channel_update. short_channel_id = short_channel_id;
2271
+
2272
+
2273
+ // Even though previous update was not relayed further, we still accepted it,
2274
+ // so we now won't accept update before the previous one.
2275
+ unsigned_channel_update. timestamp -= 10 ;
2276
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2277
+ let valid_channel_update = ChannelUpdate {
2278
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2279
+ contents : unsigned_channel_update. clone ( )
2280
+ } ;
2281
+
2282
+ match router. handle_channel_update ( & valid_channel_update) {
2283
+ Ok ( _) => panic ! ( ) ,
2284
+ Err ( e) => assert_eq ! ( e. err, "Update older than last processed update" )
2285
+ } ;
2286
+ unsigned_channel_update. timestamp += 500 ;
2287
+
2288
+ let fake_msghash = hash_to_message ! ( & zero_hash) ;
2289
+ let invalid_sig_channel_update = ChannelUpdate {
2290
+ signature : secp_ctx. sign ( & fake_msghash, node_1_privkey) ,
2291
+ contents : unsigned_channel_update. clone ( )
2292
+ } ;
2293
+
2294
+ match router. handle_channel_update ( & invalid_sig_channel_update) {
2295
+ Ok ( _) => panic ! ( ) ,
2296
+ Err ( e) => assert_eq ! ( e. err, "Invalid signature from remote node" )
2297
+ } ;
2298
+
2299
+ }
2168
2300
}
0 commit comments