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