@@ -75,14 +75,12 @@ fn generate_node_announcement(private_key: Option<SecretKey>) -> NodeAnnouncemen
7575}
7676
7777
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 {
7979 let secp_context = Secp256k1 :: new ( ) ;
8080
81- let random_private_key_1 = SecretKey :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
8281 let random_public_key_1 = random_private_key_1. public_key ( & secp_context) ;
8382 let node_id_1 = NodeId :: from_pubkey ( & random_public_key_1) ;
8483
85- let random_private_key_2 = SecretKey :: from_slice ( & [ 2 ; 32 ] ) . unwrap ( ) ;
8684 let random_public_key_2 = random_private_key_2. public_key ( & secp_context) ;
8785 let node_id_2 = NodeId :: from_pubkey ( & random_public_key_2) ;
8886
@@ -98,8 +96,8 @@ fn generate_channel_announcement(short_channel_id: u64) -> ChannelAnnouncement {
9896 } ;
9997
10098 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) ;
103101
104102 ChannelAnnouncement {
105103 node_signature_1,
@@ -110,6 +108,12 @@ fn generate_channel_announcement(short_channel_id: u64) -> ChannelAnnouncement {
110108 }
111109}
112110
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+
113117fn generate_update ( scid : u64 , direction : bool , timestamp : u32 , expiry_delta : u16 , min_msat : u64 , max_msat : u64 , base_msat : u32 , fee_rate : u32 ) -> ChannelUpdate {
114118 let flag_mask = if direction { 1 } else { 0 } ;
115119 ChannelUpdate {
@@ -360,30 +364,59 @@ async fn test_node_announcement_delta_detection() {
360364 let timestamp = current_time ( ) - 10 ;
361365
362366 { // seed the db
367+ let third_node = SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ;
368+ let fourth_node = SecretKey :: from_slice ( & [ 4 ; 32 ] ) . unwrap ( ) ;
363369
364370 { // necessary for the node announcements to be considered relevant
365371 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 ) ;
368374
369375 network_graph_arc. update_channel_from_announcement_no_lookup ( & announcement) . unwrap ( ) ;
370376 network_graph_arc. update_channel_unsigned ( & update_1. contents ) . unwrap ( ) ;
371377 network_graph_arc. update_channel_unsigned ( & update_2. contents ) . unwrap ( ) ;
372378
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 ( ) ;
376382 }
377383
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+ }
385416
386417 {
418+ // Add current announcement for node two, which should be included in its entirety as
419+ // its new since the last sync time
387420 let mut current_announcement = generate_node_announcement ( Some ( SecretKey :: from_slice ( & [ 2 ; 32 ] ) . unwrap ( ) ) ) ;
388421 current_announcement. contents . features = NodeFeatures :: from_be_bytes ( vec ! [ 23 , 48 ] ) ;
389422 current_announcement. contents . timestamp = timestamp;
@@ -392,19 +425,22 @@ async fn test_node_announcement_delta_detection() {
392425 }
393426
394427 {
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) ) ;
396432 current_announcement. contents . features = NodeFeatures :: from_be_bytes ( vec ! [ 22 , 49 ] ) ;
397433 current_announcement. contents . timestamp = timestamp;
398434 receiver. send ( GossipMessage :: NodeAnnouncement ( current_announcement, Some ( timestamp) ) ) . await . unwrap ( ) ;
399435 }
400436
401437 {
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 ) ;
403440 announcement. contents . addresses . push ( SocketAddress :: Hostname {
404441 hostname : "google.com" . to_string ( ) . try_into ( ) . unwrap ( ) ,
405442 port : 443 ,
406443 } ) ;
407- announcement. contents . features = NodeFeatures :: from_be_bytes ( vec ! [ 23 , 48 ] ) ;
408444 announcement. contents . addresses . push ( SocketAddress :: TcpIpV4 { addr : [ 127 , 0 , 0 , 1 ] , port : 9635 } ) ;
409445 announcement. contents . addresses . push ( SocketAddress :: TcpIpV6 { addr : [ 1 ; 16 ] , port : 1337 } ) ;
410446 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() {
415451 port : 4 ,
416452 } ) ;
417453 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 ( ) ;
418456 }
419- network_graph_arc. update_node_from_unsigned_announcement ( & announcement. contents ) . unwrap ( ) ;
420- receiver. send ( GossipMessage :: NodeAnnouncement ( announcement, Some ( timestamp) ) ) . await . unwrap ( ) ;
421457
422458 drop ( receiver) ;
423459 persister. persist_gossip ( ) . await ;
@@ -431,11 +467,14 @@ async fn test_node_announcement_delta_detection() {
431467 let serialization = serialize_delta ( & delta, 2 , logger. clone ( ) ) ;
432468 clean_test_db ( ) . await ;
433469
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.
435474 assert_eq ! ( serialization. node_announcement_count, 2 ) ;
436- assert_eq ! ( serialization. node_update_count, 1 ) ;
475+ assert_eq ! ( serialization. node_update_count, 2 ) ;
437476 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 ) ;
439478}
440479
441480/// If a channel has only seen updates in one direction, it should not be announced
0 commit comments