@@ -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 ;
@@ -2163,4 +2163,135 @@ mod tests {
2163
2163
Err ( e) => assert_eq ! ( e. err, "Channel announcement node had a channel with itself" )
2164
2164
} ;
2165
2165
}
2166
+
2167
+ #[ test]
2168
+ fn handling_channel_update ( ) {
2169
+ let ( secp_ctx, _, router) = create_router ( ) ;
2170
+ let node_1_privkey = & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ;
2171
+ let node_2_privkey = & SecretKey :: from_slice ( & [ 41 ; 32 ] ) . unwrap ( ) ;
2172
+ let node_id_1 = PublicKey :: from_secret_key ( & secp_ctx, node_1_privkey) ;
2173
+ let node_id_2 = PublicKey :: from_secret_key ( & secp_ctx, node_2_privkey) ;
2174
+ let node_1_btckey = & SecretKey :: from_slice ( & [ 40 ; 32 ] ) . unwrap ( ) ;
2175
+ let node_2_btckey = & SecretKey :: from_slice ( & [ 39 ; 32 ] ) . unwrap ( ) ;
2176
+
2177
+ let zero_hash = Sha256dHash :: hash ( & [ 0 ; 32 ] ) ;
2178
+ let short_channel_id = 0 ;
2179
+ let chain_hash = genesis_block ( Network :: Testnet ) . header . bitcoin_hash ( ) ;
2180
+ let channel_key = NetworkMap :: get_key ( short_channel_id, chain_hash) ;
2181
+
2182
+
2183
+ {
2184
+ // Announce a channel we will update
2185
+ let unsigned_announcement = UnsignedChannelAnnouncement {
2186
+ features : ChannelFeatures :: empty ( ) ,
2187
+ chain_hash,
2188
+ short_channel_id,
2189
+ node_id_1,
2190
+ node_id_2,
2191
+ bitcoin_key_1 : PublicKey :: from_secret_key ( & secp_ctx, node_1_btckey) ,
2192
+ bitcoin_key_2 : PublicKey :: from_secret_key ( & secp_ctx, node_2_btckey) ,
2193
+ excess_data : Vec :: new ( ) ,
2194
+ } ;
2195
+
2196
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2197
+ let valid_channel_announcement = ChannelAnnouncement {
2198
+ node_signature_1 : secp_ctx. sign ( & msghash, node_1_privkey) ,
2199
+ node_signature_2 : secp_ctx. sign ( & msghash, node_2_privkey) ,
2200
+ bitcoin_signature_1 : secp_ctx. sign ( & msghash, node_1_btckey) ,
2201
+ bitcoin_signature_2 : secp_ctx. sign ( & msghash, node_2_btckey) ,
2202
+ contents : unsigned_announcement. clone ( ) ,
2203
+ } ;
2204
+ match router. handle_channel_announcement ( & valid_channel_announcement) {
2205
+ Ok ( _) => ( ) ,
2206
+ Err ( _) => panic ! ( )
2207
+ } ;
2208
+
2209
+ }
2210
+
2211
+ let mut unsigned_channel_update = UnsignedChannelUpdate {
2212
+ chain_hash,
2213
+ short_channel_id,
2214
+ timestamp : 100 ,
2215
+ flags : 0 ,
2216
+ cltv_expiry_delta : 144 ,
2217
+ htlc_minimum_msat : 1000000 ,
2218
+ fee_base_msat : 10000 ,
2219
+ fee_proportional_millionths : 20 ,
2220
+ excess_data : Vec :: new ( )
2221
+ } ;
2222
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2223
+ let valid_channel_update = ChannelUpdate {
2224
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2225
+ contents : unsigned_channel_update. clone ( )
2226
+ } ;
2227
+
2228
+ match router. handle_channel_update ( & valid_channel_update) {
2229
+ Ok ( res) => assert ! ( res) ,
2230
+ _ => panic ! ( )
2231
+ } ;
2232
+
2233
+ {
2234
+ let network = router. network_map . write ( ) . unwrap ( ) ;
2235
+ match network. channels . get ( & channel_key) {
2236
+ None => panic ! ( ) ,
2237
+ Some ( channel_info) => {
2238
+ assert_eq ! ( channel_info. one_to_two. cltv_expiry_delta, 144 ) ;
2239
+ assert_eq ! ( channel_info. two_to_one. cltv_expiry_delta, u16 :: max_value( ) ) ;
2240
+ }
2241
+ }
2242
+ let node = network. nodes . get ( & node_id_1) . unwrap ( ) ;
2243
+ assert_eq ! ( node. lowest_inbound_channel_fee_base_msat, u32 :: max_value( ) ) ;
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
+ unsigned_channel_update. timestamp = 0 ;
2273
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2274
+ let valid_channel_update = ChannelUpdate {
2275
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2276
+ contents : unsigned_channel_update. clone ( )
2277
+ } ;
2278
+
2279
+ match router. handle_channel_update ( & valid_channel_update) {
2280
+ Ok ( _) => panic ! ( ) ,
2281
+ Err ( e) => assert_eq ! ( e. err, "Update older than last processed update" )
2282
+ } ;
2283
+ unsigned_channel_update. timestamp = 100 ;
2284
+
2285
+ let fake_msghash = hash_to_message ! ( & zero_hash) ;
2286
+ let invalid_sig_channel_update = ChannelUpdate {
2287
+ signature : secp_ctx. sign ( & fake_msghash, node_1_privkey) ,
2288
+ contents : unsigned_channel_update. clone ( )
2289
+ } ;
2290
+
2291
+ match router. handle_channel_update ( & invalid_sig_channel_update) {
2292
+ Ok ( _) => panic ! ( ) ,
2293
+ Err ( e) => assert_eq ! ( e. err, "Invalid signature from remote node" )
2294
+ } ;
2295
+
2296
+ }
2166
2297
}
0 commit comments