From 4901136cfe2e50e66b3e999c1fbcec5e618ba4b5 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 5 May 2021 02:47:42 +0000 Subject: [PATCH] Broadcast node_announcements regularly. --- README.md | 6 +++++- src/cli.rs | 35 +++++++++++++++++++++++++++++++++-- src/main.rs | 22 +++++++++++++++++++++- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5dda263..5b42054 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ git clone git@github.com:lightningdevkit/ldk-sample.git ## Usage ``` cd ldk-sample -cargo run :@: [] [bitcoin-network] +cargo run :@: [] [bitcoin-network] [announced-listen-addr announced-node-name] ``` `bitcoind`'s RPC username and password likely can be found through `cat ~/.bitcoin/.cookie`. @@ -17,6 +17,10 @@ cargo run :@:, + pub(crate) ldk_announced_node_name: [u8; 32], pub(crate) network: Network, } pub(crate) fn parse_startup_args() -> Result { if env::args().len() < 3 { - println!("ldk-tutorial-node requires 3 arguments: `cargo run :@: ldk_storage_directory_path [] [bitcoin-network]`"); + println!("ldk-tutorial-node requires 3 arguments: `cargo run :@: ldk_storage_directory_path [] [bitcoin-network] [announced-listen-addr announced-node-name]`"); return Err(()); } let bitcoind_rpc_info = env::args().skip(1).next().unwrap(); @@ -84,6 +87,32 @@ pub(crate) fn parse_startup_args() -> Result { Some(_) => panic!("Unsupported network provided. Options are: `regtest`, `testnet`"), None => Network::Testnet, }; + + let ldk_announced_listen_addr = match env::args().skip(arg_idx + 1).next().as_ref() { + Some(s) => match IpAddr::from_str(s) { + Ok(IpAddr::V4(a)) => { + Some(NetAddress::IPv4 { addr: a.octets(), port: ldk_peer_listening_port }) + } + Ok(IpAddr::V6(a)) => { + Some(NetAddress::IPv6 { addr: a.octets(), port: ldk_peer_listening_port }) + } + Err(_) => panic!("Failed to parse announced-listen-addr into an IP address"), + }, + None => None, + }; + + let ldk_announced_node_name = match env::args().skip(arg_idx + 2).next().as_ref() { + Some(s) => { + if s.len() > 32 { + panic!("Node Alias can not be longer than 32 bytes"); + } + let mut bytes = [0; 32]; + bytes[..s.len()].copy_from_slice(s.as_bytes()); + bytes + } + None => [0; 32], + }; + Ok(LdkUserInfo { bitcoind_rpc_username, bitcoind_rpc_password, @@ -91,6 +120,8 @@ pub(crate) fn parse_startup_args() -> Result { bitcoind_rpc_port, ldk_storage_dir_path, ldk_peer_listening_port, + ldk_announced_listen_addr, + ldk_announced_node_name, network, }) } diff --git a/src/main.rs b/src/main.rs index f51528b..31fb84e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -577,6 +577,26 @@ async fn start_ldk() { Err(e) => println!("ERROR: errored reading channel peer info from disk: {:?}", e), } + // Regularly broadcast our node_announcement. This is only required (or possible) if we have + // some public channels, and is only useful if we have public listen address(es) to announce. + // In a production environment, this should occur only after the announcement of new channels + // to avoid churn in the global network graph. + let chan_manager = Arc::clone(&channel_manager); + let network = args.network; + if args.ldk_announced_listen_addr.is_some() { + tokio::spawn(async move { + let mut interval = tokio::time::interval(Duration::from_secs(60)); + loop { + interval.tick().await; + chan_manager.broadcast_node_announcement( + [0; 3], + args.ldk_announced_node_name, + vec![args.ldk_announced_listen_addr.as_ref().unwrap().clone()], + ); + } + }); + } + // Start the CLI. cli::poll_for_user_input( peer_manager.clone(), @@ -588,7 +608,7 @@ async fn start_ldk() { event_ntfn_sender, ldk_data_dir.clone(), logger.clone(), - args.network, + network, ) .await; } -- 2.39.5