@@ -11,8 +11,9 @@ use common::{
11
11
do_channel_full_cycle, expect_channel_pending_event, expect_channel_ready_event, expect_event,
12
12
expect_payment_received_event, expect_payment_successful_event, generate_blocks_and_wait,
13
13
logging:: { init_log_logger, validate_log_entry, TestLogWriter } ,
14
- open_channel, premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd,
15
- setup_builder, setup_node, setup_two_nodes, wait_for_tx, TestChainSource , TestSyncStore ,
14
+ open_channel, premine_and_distribute_funds, random_config, random_listening_addresses,
15
+ setup_bitcoind_and_electrsd, setup_builder, setup_node, setup_two_nodes, wait_for_tx,
16
+ TestChainSource , TestSyncStore ,
16
17
} ;
17
18
18
19
use ldk_node:: config:: EsploraSyncConfig ;
@@ -24,6 +25,7 @@ use ldk_node::payment::{
24
25
use ldk_node:: { Builder , Event , NodeError } ;
25
26
26
27
use lightning:: ln:: channelmanager:: PaymentId ;
28
+ use lightning:: routing:: gossip:: { NodeAlias , NodeId } ;
27
29
use lightning:: util:: persist:: KVStore ;
28
30
29
31
use bitcoincore_rpc:: RpcApi ;
@@ -885,6 +887,97 @@ fn simple_bolt12_send_receive() {
885
887
assert_eq ! ( node_a_payments. first( ) . unwrap( ) . amount_msat, Some ( overpaid_amount) ) ;
886
888
}
887
889
890
+ #[ test]
891
+ fn test_node_announcement_propagation ( ) {
892
+ let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
893
+ let chain_source = TestChainSource :: Esplora ( & electrsd) ;
894
+
895
+ // Node A will use both listening and announcement addresses
896
+ let mut config_a = random_config ( true ) ;
897
+ let node_a_alias_string = "ldk-node-a" . to_string ( ) ;
898
+ let mut node_a_alias_bytes = [ 0u8 ; 32 ] ;
899
+ node_a_alias_bytes[ ..node_a_alias_string. as_bytes ( ) . len ( ) ]
900
+ . copy_from_slice ( node_a_alias_string. as_bytes ( ) ) ;
901
+ let node_a_node_alias = Some ( NodeAlias ( node_a_alias_bytes) ) ;
902
+ let node_a_announcement_addresses = random_listening_addresses ( ) ;
903
+ config_a. node_config . node_alias = node_a_node_alias. clone ( ) ;
904
+ config_a. node_config . listening_addresses = Some ( random_listening_addresses ( ) ) ;
905
+ config_a. node_config . announcement_addresses = Some ( node_a_announcement_addresses. clone ( ) ) ;
906
+
907
+ // Node B will only use listening addresses
908
+ let mut config_b = random_config ( true ) ;
909
+ let node_b_alias_string = "ldk-node-b" . to_string ( ) ;
910
+ let mut node_b_alias_bytes = [ 0u8 ; 32 ] ;
911
+ node_b_alias_bytes[ ..node_b_alias_string. as_bytes ( ) . len ( ) ]
912
+ . copy_from_slice ( node_b_alias_string. as_bytes ( ) ) ;
913
+ let node_b_node_alias = Some ( NodeAlias ( node_b_alias_bytes) ) ;
914
+ let node_b_listening_addresses = random_listening_addresses ( ) ;
915
+ config_b. node_config . node_alias = node_b_node_alias. clone ( ) ;
916
+ config_b. node_config . listening_addresses = Some ( node_b_listening_addresses. clone ( ) ) ;
917
+ config_b. node_config . announcement_addresses = None ;
918
+
919
+ let node_a = setup_node ( & chain_source, config_a, None ) ;
920
+ let node_b = setup_node ( & chain_source, config_b, None ) ;
921
+
922
+ let address_a = node_a. onchain_payment ( ) . new_address ( ) . unwrap ( ) ;
923
+ let premine_amount_sat = 5_000_000 ;
924
+ premine_and_distribute_funds (
925
+ & bitcoind. client ,
926
+ & electrsd. client ,
927
+ vec ! [ address_a] ,
928
+ Amount :: from_sat ( premine_amount_sat) ,
929
+ ) ;
930
+
931
+ node_a. sync_wallets ( ) . unwrap ( ) ;
932
+
933
+ // Open an announced channel from node_a to node_b
934
+ open_channel ( & node_a, & node_b, 4_000_000 , true , & electrsd) ;
935
+
936
+ generate_blocks_and_wait ( & bitcoind. client , & electrsd. client , 6 ) ;
937
+
938
+ node_a. sync_wallets ( ) . unwrap ( ) ;
939
+ node_b. sync_wallets ( ) . unwrap ( ) ;
940
+
941
+ expect_channel_ready_event ! ( node_a, node_b. node_id( ) ) ;
942
+ expect_channel_ready_event ! ( node_b, node_a. node_id( ) ) ;
943
+
944
+ // Wait until node_b broadcasts a node announcement
945
+ while node_b. status ( ) . latest_node_announcement_broadcast_timestamp . is_none ( ) {
946
+ std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 10 ) ) ;
947
+ }
948
+
949
+ // Sleep to make sure the node announcement propagates
950
+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) ;
951
+
952
+ // Get node info from the other node's perspective
953
+ let node_a_info = node_b. network_graph ( ) . node ( & NodeId :: from_pubkey ( & node_a. node_id ( ) ) ) . unwrap ( ) ;
954
+ let node_a_announcement_info = node_a_info. announcement_info . as_ref ( ) . unwrap ( ) ;
955
+
956
+ let node_b_info = node_a. network_graph ( ) . node ( & NodeId :: from_pubkey ( & node_b. node_id ( ) ) ) . unwrap ( ) ;
957
+ let node_b_announcement_info = node_b_info. announcement_info . as_ref ( ) . unwrap ( ) ;
958
+
959
+ // Assert that the aliases and addresses match the expected values
960
+ #[ cfg( not( feature = "uniffi" ) ) ]
961
+ assert_eq ! ( node_a_announcement_info. alias( ) , & node_a_node_alias. unwrap( ) ) ;
962
+ #[ cfg( feature = "uniffi" ) ]
963
+ assert_eq ! ( node_a_announcement_info. alias, node_a_alias_string) ;
964
+
965
+ #[ cfg( not( feature = "uniffi" ) ) ]
966
+ assert_eq ! ( node_a_announcement_info. addresses( ) , & node_a_announcement_addresses) ;
967
+ #[ cfg( feature = "uniffi" ) ]
968
+ assert_eq ! ( node_a_announcement_info. addresses, node_a_announcement_addresses) ;
969
+
970
+ #[ cfg( not( feature = "uniffi" ) ) ]
971
+ assert_eq ! ( node_b_announcement_info. alias( ) , & node_b_node_alias. unwrap( ) ) ;
972
+ #[ cfg( feature = "uniffi" ) ]
973
+ assert_eq ! ( node_b_announcement_info. alias, node_b_alias_string) ;
974
+
975
+ #[ cfg( not( feature = "uniffi" ) ) ]
976
+ assert_eq ! ( node_b_announcement_info. addresses( ) , & node_b_listening_addresses) ;
977
+ #[ cfg( feature = "uniffi" ) ]
978
+ assert_eq ! ( node_b_announcement_info. addresses, node_b_listening_addresses) ;
979
+ }
980
+
888
981
#[ test]
889
982
fn generate_bip21_uri ( ) {
890
983
let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
0 commit comments