@@ -1056,7 +1056,7 @@ mod tests {
1056
1056
use ln:: router:: { Router , NodeInfo , NetworkMap , ChannelInfo , DirectionalChannelInfo , RouteHint } ;
1057
1057
use ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
1058
1058
use ln:: msgs:: { ErrorAction , LightningError , RoutingMessageHandler , UnsignedNodeAnnouncement , NodeAnnouncement ,
1059
- UnsignedChannelAnnouncement , ChannelAnnouncement } ;
1059
+ UnsignedChannelAnnouncement , ChannelAnnouncement , UnsignedChannelUpdate , ChannelUpdate } ;
1060
1060
use util:: test_utils;
1061
1061
use util:: test_utils:: TestVecWriter ;
1062
1062
use util:: logger:: Logger ;
@@ -2163,4 +2163,136 @@ 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
+ }
2243
+
2244
+ unsigned_channel_update. timestamp += 100 ;
2245
+ unsigned_channel_update. excess_data . push ( 1 ) ;
2246
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2247
+ let valid_channel_update = ChannelUpdate {
2248
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2249
+ contents : unsigned_channel_update. clone ( )
2250
+ } ;
2251
+ // Return false because contains excess data
2252
+ match router. handle_channel_update ( & valid_channel_update) {
2253
+ Ok ( res) => assert ! ( !res) ,
2254
+ _ => panic ! ( )
2255
+ } ;
2256
+
2257
+ unsigned_channel_update. short_channel_id += 1 ;
2258
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2259
+ let valid_channel_update = ChannelUpdate {
2260
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2261
+ contents : unsigned_channel_update. clone ( )
2262
+ } ;
2263
+
2264
+ match router. handle_channel_update ( & valid_channel_update) {
2265
+ Ok ( _) => panic ! ( ) ,
2266
+ Err ( e) => assert_eq ! ( e. err, "Couldn't find channel for update" )
2267
+ } ;
2268
+ unsigned_channel_update. short_channel_id = short_channel_id;
2269
+
2270
+
2271
+ // Even though previous update was not relayed further, we still accepted it,
2272
+ // so we now won't accept update before the previous one.
2273
+ unsigned_channel_update. timestamp -= 10 ;
2274
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_channel_update. encode( ) [ ..] ) [ ..] ) ;
2275
+ let valid_channel_update = ChannelUpdate {
2276
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2277
+ contents : unsigned_channel_update. clone ( )
2278
+ } ;
2279
+
2280
+ match router. handle_channel_update ( & valid_channel_update) {
2281
+ Ok ( _) => panic ! ( ) ,
2282
+ Err ( e) => assert_eq ! ( e. err, "Update older than last processed update" )
2283
+ } ;
2284
+ unsigned_channel_update. timestamp += 500 ;
2285
+
2286
+ let fake_msghash = hash_to_message ! ( & zero_hash) ;
2287
+ let invalid_sig_channel_update = ChannelUpdate {
2288
+ signature : secp_ctx. sign ( & fake_msghash, node_1_privkey) ,
2289
+ contents : unsigned_channel_update. clone ( )
2290
+ } ;
2291
+
2292
+ match router. handle_channel_update ( & invalid_sig_channel_update) {
2293
+ Ok ( _) => panic ! ( ) ,
2294
+ Err ( e) => assert_eq ! ( e. err, "Invalid signature from remote node" )
2295
+ } ;
2296
+
2297
+ }
2166
2298
}
0 commit comments