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