@@ -2516,4 +2516,122 @@ mod tests {
2516
2516
let channels_with_announcements = router. get_next_channel_announcements ( channel_key + 1000 , 1 ) ;
2517
2517
assert_eq ! ( channels_with_announcements. len( ) , 0 ) ;
2518
2518
}
2519
+
2520
+ #[ test]
2521
+ fn getting_next_node_announcements ( ) {
2522
+ let ( secp_ctx, _, router) = create_router ( ) ;
2523
+ let node_1_privkey = & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ;
2524
+ let node_2_privkey = & SecretKey :: from_slice ( & [ 41 ; 32 ] ) . unwrap ( ) ;
2525
+ let node_id_1 = PublicKey :: from_secret_key ( & secp_ctx, node_1_privkey) ;
2526
+ let node_id_2 = PublicKey :: from_secret_key ( & secp_ctx, node_2_privkey) ;
2527
+ let node_1_btckey = & SecretKey :: from_slice ( & [ 40 ; 32 ] ) . unwrap ( ) ;
2528
+ let node_2_btckey = & SecretKey :: from_slice ( & [ 39 ; 32 ] ) . unwrap ( ) ;
2529
+
2530
+ let short_channel_id = 1 ;
2531
+ let chain_hash = genesis_block ( Network :: Testnet ) . header . bitcoin_hash ( ) ;
2532
+
2533
+ // No nodes yet.
2534
+ let next_announcements = router. get_next_node_announcements ( None , 10 ) ;
2535
+ assert_eq ! ( next_announcements. len( ) , 0 ) ;
2536
+
2537
+ {
2538
+ // Announce a channel to add 2 nodes
2539
+ let unsigned_announcement = UnsignedChannelAnnouncement {
2540
+ features : ChannelFeatures :: empty ( ) ,
2541
+ chain_hash,
2542
+ short_channel_id,
2543
+ node_id_1,
2544
+ node_id_2,
2545
+ bitcoin_key_1 : PublicKey :: from_secret_key ( & secp_ctx, node_1_btckey) ,
2546
+ bitcoin_key_2 : PublicKey :: from_secret_key ( & secp_ctx, node_2_btckey) ,
2547
+ excess_data : Vec :: new ( ) ,
2548
+ } ;
2549
+
2550
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2551
+ let valid_channel_announcement = ChannelAnnouncement {
2552
+ node_signature_1 : secp_ctx. sign ( & msghash, node_1_privkey) ,
2553
+ node_signature_2 : secp_ctx. sign ( & msghash, node_2_privkey) ,
2554
+ bitcoin_signature_1 : secp_ctx. sign ( & msghash, node_1_btckey) ,
2555
+ bitcoin_signature_2 : secp_ctx. sign ( & msghash, node_2_btckey) ,
2556
+ contents : unsigned_announcement. clone ( ) ,
2557
+ } ;
2558
+ match router. handle_channel_announcement ( & valid_channel_announcement) {
2559
+ Ok ( _) => ( ) ,
2560
+ Err ( _) => panic ! ( )
2561
+ } ;
2562
+ }
2563
+
2564
+
2565
+ // Nodes were never announced
2566
+ let next_announcements = router. get_next_node_announcements ( None , 3 ) ;
2567
+ assert_eq ! ( next_announcements. len( ) , 0 ) ;
2568
+
2569
+ {
2570
+ let mut unsigned_announcement = UnsignedNodeAnnouncement {
2571
+ features : NodeFeatures :: supported ( ) ,
2572
+ timestamp : 1000 ,
2573
+ node_id : node_id_1,
2574
+ rgb : [ 0 ; 3 ] ,
2575
+ alias : [ 0 ; 32 ] ,
2576
+ addresses : Vec :: new ( ) ,
2577
+ excess_address_data : Vec :: new ( ) ,
2578
+ excess_data : Vec :: new ( ) ,
2579
+ } ;
2580
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2581
+ let valid_announcement = NodeAnnouncement {
2582
+ signature : secp_ctx. sign ( & msghash, node_1_privkey) ,
2583
+ contents : unsigned_announcement. clone ( )
2584
+ } ;
2585
+ match router. handle_node_announcement ( & valid_announcement) {
2586
+ Ok ( _) => ( ) ,
2587
+ Err ( _) => panic ! ( )
2588
+ } ;
2589
+
2590
+ unsigned_announcement. node_id = node_id_2;
2591
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2592
+ let valid_announcement = NodeAnnouncement {
2593
+ signature : secp_ctx. sign ( & msghash, node_2_privkey) ,
2594
+ contents : unsigned_announcement. clone ( )
2595
+ } ;
2596
+
2597
+ match router. handle_node_announcement ( & valid_announcement) {
2598
+ Ok ( _) => ( ) ,
2599
+ Err ( _) => panic ! ( )
2600
+ } ;
2601
+ }
2602
+
2603
+ let next_announcements = router. get_next_node_announcements ( None , 3 ) ;
2604
+ assert_eq ! ( next_announcements. len( ) , 2 ) ;
2605
+
2606
+ // Skip the first node.
2607
+ let next_announcements = router. get_next_node_announcements ( Some ( & node_id_1) , 2 ) ;
2608
+ assert_eq ! ( next_announcements. len( ) , 1 ) ;
2609
+
2610
+ {
2611
+ // Later announcement which should not be relayed (excess data) prevent us from sharing a node
2612
+ let unsigned_announcement = UnsignedNodeAnnouncement {
2613
+ features : NodeFeatures :: supported ( ) ,
2614
+ timestamp : 1010 ,
2615
+ node_id : node_id_2,
2616
+ rgb : [ 0 ; 3 ] ,
2617
+ alias : [ 0 ; 32 ] ,
2618
+ addresses : Vec :: new ( ) ,
2619
+ excess_address_data : Vec :: new ( ) ,
2620
+ excess_data : [ 1 ; 3 ] . to_vec ( ) ,
2621
+ } ;
2622
+ let msghash = hash_to_message ! ( & Sha256dHash :: hash( & unsigned_announcement. encode( ) [ ..] ) [ ..] ) ;
2623
+ let valid_announcement = NodeAnnouncement {
2624
+ signature : secp_ctx. sign ( & msghash, node_2_privkey) ,
2625
+ contents : unsigned_announcement. clone ( )
2626
+ } ;
2627
+ match router. handle_node_announcement ( & valid_announcement) {
2628
+ Ok ( res) => assert ! ( !res) ,
2629
+ Err ( _) => panic ! ( )
2630
+ } ;
2631
+ }
2632
+
2633
+ let next_announcements = router. get_next_node_announcements ( Some ( & node_id_1) , 2 ) ;
2634
+ assert_eq ! ( next_announcements. len( ) , 0 ) ;
2635
+
2636
+ }
2519
2637
}
0 commit comments