@@ -75,14 +75,12 @@ fn generate_node_announcement(private_key: Option<SecretKey>) -> NodeAnnouncemen
75
75
}
76
76
77
77
78
- fn generate_channel_announcement ( short_channel_id : u64 ) -> ChannelAnnouncement {
78
+ fn generate_channel_announcement_between_nodes ( short_channel_id : u64 , random_private_key_1 : & SecretKey , random_private_key_2 : & SecretKey ) -> ChannelAnnouncement {
79
79
let secp_context = Secp256k1 :: new ( ) ;
80
80
81
- let random_private_key_1 = SecretKey :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
82
81
let random_public_key_1 = random_private_key_1. public_key ( & secp_context) ;
83
82
let node_id_1 = NodeId :: from_pubkey ( & random_public_key_1) ;
84
83
85
- let random_private_key_2 = SecretKey :: from_slice ( & [ 2 ; 32 ] ) . unwrap ( ) ;
86
84
let random_public_key_2 = random_private_key_2. public_key ( & secp_context) ;
87
85
let node_id_2 = NodeId :: from_pubkey ( & random_public_key_2) ;
88
86
@@ -98,8 +96,8 @@ fn generate_channel_announcement(short_channel_id: u64) -> ChannelAnnouncement {
98
96
} ;
99
97
100
98
let msg_hash = bitcoin:: secp256k1:: Message :: from_slice ( & Sha256dHash :: hash ( & announcement. encode ( ) [ ..] ) [ ..] ) . unwrap ( ) ;
101
- let node_signature_1 = secp_context. sign_ecdsa ( & msg_hash, & random_private_key_1) ;
102
- let node_signature_2 = secp_context. sign_ecdsa ( & msg_hash, & random_private_key_2) ;
99
+ let node_signature_1 = secp_context. sign_ecdsa ( & msg_hash, random_private_key_1) ;
100
+ let node_signature_2 = secp_context. sign_ecdsa ( & msg_hash, random_private_key_2) ;
103
101
104
102
ChannelAnnouncement {
105
103
node_signature_1,
@@ -110,6 +108,12 @@ fn generate_channel_announcement(short_channel_id: u64) -> ChannelAnnouncement {
110
108
}
111
109
}
112
110
111
+ fn generate_channel_announcement ( short_channel_id : u64 ) -> ChannelAnnouncement {
112
+ let random_private_key_1 = SecretKey :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
113
+ let random_private_key_2 = SecretKey :: from_slice ( & [ 2 ; 32 ] ) . unwrap ( ) ;
114
+ generate_channel_announcement_between_nodes ( short_channel_id, & random_private_key_1, & random_private_key_2)
115
+ }
116
+
113
117
fn generate_update ( scid : u64 , direction : bool , timestamp : u32 , expiry_delta : u16 , min_msat : u64 , max_msat : u64 , base_msat : u32 , fee_rate : u32 ) -> ChannelUpdate {
114
118
let flag_mask = if direction { 1 } else { 0 } ;
115
119
ChannelUpdate {
@@ -360,30 +364,59 @@ async fn test_node_announcement_delta_detection() {
360
364
let timestamp = current_time ( ) - 10 ;
361
365
362
366
{ // seed the db
367
+ let third_node = SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ;
368
+ let fourth_node = SecretKey :: from_slice ( & [ 4 ; 32 ] ) . unwrap ( ) ;
363
369
364
370
{ // necessary for the node announcements to be considered relevant
365
371
let announcement = generate_channel_announcement ( 1 ) ;
366
- let update_1 = generate_update ( 1 , false , timestamp, 0 , 0 , 0 , 6 , 0 ) ;
367
- let update_2 = generate_update ( 1 , true , timestamp, 0 , 0 , 0 , 6 , 0 ) ;
372
+ let update_1 = generate_update ( 1 , false , timestamp - 10 , 0 , 0 , 0 , 6 , 0 ) ;
373
+ let update_2 = generate_update ( 1 , true , timestamp - 10 , 0 , 0 , 0 , 6 , 0 ) ;
368
374
369
375
network_graph_arc. update_channel_from_announcement_no_lookup ( & announcement) . unwrap ( ) ;
370
376
network_graph_arc. update_channel_unsigned ( & update_1. contents ) . unwrap ( ) ;
371
377
network_graph_arc. update_channel_unsigned ( & update_2. contents ) . unwrap ( ) ;
372
378
373
- receiver. send ( GossipMessage :: ChannelAnnouncement ( announcement, 100 , Some ( timestamp) ) ) . await . unwrap ( ) ;
374
- receiver. send ( GossipMessage :: ChannelUpdate ( update_1, Some ( timestamp) ) ) . await . unwrap ( ) ;
375
- receiver. send ( GossipMessage :: ChannelUpdate ( update_2, Some ( timestamp) ) ) . await . unwrap ( ) ;
379
+ receiver. send ( GossipMessage :: ChannelAnnouncement ( announcement, 100 , Some ( timestamp - 10 ) ) ) . await . unwrap ( ) ;
380
+ receiver. send ( GossipMessage :: ChannelUpdate ( update_1, Some ( timestamp - 10 ) ) ) . await . unwrap ( ) ;
381
+ receiver. send ( GossipMessage :: ChannelUpdate ( update_2, Some ( timestamp - 10 ) ) ) . await . unwrap ( ) ;
376
382
}
377
383
378
- let mut announcement = generate_node_announcement ( None ) ;
379
- announcement. contents . timestamp = timestamp - 10 ;
380
- network_graph_arc. update_node_from_unsigned_announcement ( & announcement. contents ) . unwrap ( ) ;
381
- receiver. send ( GossipMessage :: NodeAnnouncement ( announcement. clone ( ) , Some ( announcement. contents . timestamp ) ) ) . await . unwrap ( ) ;
382
- announcement. contents . timestamp = timestamp - 8 ;
383
- network_graph_arc. update_node_from_unsigned_announcement ( & announcement. contents ) . unwrap ( ) ;
384
- receiver. send ( GossipMessage :: NodeAnnouncement ( announcement. clone ( ) , Some ( announcement. contents . timestamp ) ) ) . await . unwrap ( ) ;
384
+ { // necessary for the second node announcements to be considered relevant
385
+ let announcement = generate_channel_announcement_between_nodes ( 2 , & third_node, & fourth_node) ;
386
+ let update_1 = generate_update ( 2 , false , timestamp - 10 , 0 , 0 , 0 , 6 , 0 ) ;
387
+ let update_2 = generate_update ( 2 , true , timestamp - 10 , 0 , 0 , 0 , 6 , 0 ) ;
388
+
389
+ network_graph_arc. update_channel_from_announcement_no_lookup ( & announcement) . unwrap ( ) ;
390
+ network_graph_arc. update_channel_unsigned ( & update_1. contents ) . unwrap ( ) ;
391
+ network_graph_arc. update_channel_unsigned ( & update_2. contents ) . unwrap ( ) ;
392
+
393
+ receiver. send ( GossipMessage :: ChannelAnnouncement ( announcement, 100 , Some ( timestamp - 10 ) ) ) . await . unwrap ( ) ;
394
+ receiver. send ( GossipMessage :: ChannelUpdate ( update_1, Some ( timestamp - 10 ) ) ) . await . unwrap ( ) ;
395
+ receiver. send ( GossipMessage :: ChannelUpdate ( update_2, Some ( timestamp - 10 ) ) ) . await . unwrap ( ) ;
396
+ }
397
+
398
+ {
399
+ // Add some node announcements from before the last sync for node 1.
400
+ let mut announcement = generate_node_announcement ( None ) ;
401
+ announcement. contents . timestamp = timestamp - 10 ;
402
+ network_graph_arc. update_node_from_unsigned_announcement ( & announcement. contents ) . unwrap ( ) ;
403
+ receiver. send ( GossipMessage :: NodeAnnouncement ( announcement. clone ( ) , Some ( announcement. contents . timestamp ) ) ) . await . unwrap ( ) ;
404
+ announcement. contents . timestamp = timestamp - 8 ;
405
+ network_graph_arc. update_node_from_unsigned_announcement ( & announcement. contents ) . unwrap ( ) ;
406
+ receiver. send ( GossipMessage :: NodeAnnouncement ( announcement. clone ( ) , Some ( announcement. contents . timestamp ) ) ) . await . unwrap ( ) ;
407
+ }
408
+
409
+ {
410
+ // Add a node announcement from before the last sync for node 4.
411
+ let mut announcement = generate_node_announcement ( Some ( fourth_node. clone ( ) ) ) ;
412
+ announcement. contents . timestamp = timestamp - 10 ;
413
+ network_graph_arc. update_node_from_unsigned_announcement ( & announcement. contents ) . unwrap ( ) ;
414
+ receiver. send ( GossipMessage :: NodeAnnouncement ( announcement. clone ( ) , Some ( announcement. contents . timestamp ) ) ) . await . unwrap ( ) ;
415
+ }
385
416
386
417
{
418
+ // Add current announcement for node two, which should be included in its entirety as
419
+ // its new since the last sync time
387
420
let mut current_announcement = generate_node_announcement ( Some ( SecretKey :: from_slice ( & [ 2 ; 32 ] ) . unwrap ( ) ) ) ;
388
421
current_announcement. contents . features = NodeFeatures :: from_be_bytes ( vec ! [ 23 , 48 ] ) ;
389
422
current_announcement. contents . timestamp = timestamp;
@@ -392,19 +425,22 @@ async fn test_node_announcement_delta_detection() {
392
425
}
393
426
394
427
{
395
- let mut current_announcement = generate_node_announcement ( Some ( SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ) ) ;
428
+ // Note that we do *not* add the node announcement for node three to the network graph,
429
+ // simulating its channels having timed out, and thus the node announcement (which is
430
+ // new) will not be included.
431
+ let mut current_announcement = generate_node_announcement ( Some ( third_node) ) ;
396
432
current_announcement. contents . features = NodeFeatures :: from_be_bytes ( vec ! [ 22 , 49 ] ) ;
397
433
current_announcement. contents . timestamp = timestamp;
398
434
receiver. send ( GossipMessage :: NodeAnnouncement ( current_announcement, Some ( timestamp) ) ) . await . unwrap ( ) ;
399
435
}
400
436
401
437
{
402
- // modify announcement to contain a bunch of addresses
438
+ // modify announcement of node 1 to contain a bunch of addresses
439
+ let mut announcement = generate_node_announcement ( None ) ;
403
440
announcement. contents . addresses . push ( SocketAddress :: Hostname {
404
441
hostname : "google.com" . to_string ( ) . try_into ( ) . unwrap ( ) ,
405
442
port : 443 ,
406
443
} ) ;
407
- announcement. contents . features = NodeFeatures :: from_be_bytes ( vec ! [ 23 , 48 ] ) ;
408
444
announcement. contents . addresses . push ( SocketAddress :: TcpIpV4 { addr : [ 127 , 0 , 0 , 1 ] , port : 9635 } ) ;
409
445
announcement. contents . addresses . push ( SocketAddress :: TcpIpV6 { addr : [ 1 ; 16 ] , port : 1337 } ) ;
410
446
announcement. contents . addresses . push ( SocketAddress :: OnionV2 ( [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ] ) ) ;
@@ -415,9 +451,9 @@ async fn test_node_announcement_delta_detection() {
415
451
port : 4 ,
416
452
} ) ;
417
453
announcement. contents . timestamp = timestamp;
454
+ network_graph_arc. update_node_from_unsigned_announcement ( & announcement. contents ) . unwrap ( ) ;
455
+ receiver. send ( GossipMessage :: NodeAnnouncement ( announcement, Some ( timestamp) ) ) . await . unwrap ( ) ;
418
456
}
419
- network_graph_arc. update_node_from_unsigned_announcement ( & announcement. contents ) . unwrap ( ) ;
420
- receiver. send ( GossipMessage :: NodeAnnouncement ( announcement, Some ( timestamp) ) ) . await . unwrap ( ) ;
421
457
422
458
drop ( receiver) ;
423
459
persister. persist_gossip ( ) . await ;
@@ -431,11 +467,14 @@ async fn test_node_announcement_delta_detection() {
431
467
let serialization = serialize_delta ( & delta, 2 , logger. clone ( ) ) ;
432
468
clean_test_db ( ) . await ;
433
469
434
- assert_eq ! ( serialization. message_count, 3 ) ;
470
+ // All channel updates completed prior to the last sync timestamp, so none are included.
471
+ assert_eq ! ( serialization. message_count, 0 ) ;
472
+ // We should have updated addresses for node 1, full announcements for node 2 and 3, and no
473
+ // announcement for node 4.
435
474
assert_eq ! ( serialization. node_announcement_count, 2 ) ;
436
- assert_eq ! ( serialization. node_update_count, 1 ) ;
475
+ assert_eq ! ( serialization. node_update_count, 2 ) ;
437
476
assert_eq ! ( serialization. node_feature_update_count, 1 ) ;
438
- assert_eq ! ( serialization. node_address_update_count, 1 ) ;
477
+ assert_eq ! ( serialization. node_address_update_count, 2 ) ;
439
478
}
440
479
441
480
/// If a channel has only seen updates in one direction, it should not be announced
0 commit comments