Skip to content

Commit 3f92528

Browse files
authored
Merge pull request #7 from TheBlueMatt/main
Small tweaks to logging and printing + node_announcement
2 parents f00d6f7 + 5e92169 commit 3f92528

File tree

3 files changed

+73
-14
lines changed

3 files changed

+73
-14
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,18 @@ git clone [email protected]:lightningdevkit/ldk-sample.git
99
## Usage
1010
```
1111
cd ldk-sample
12-
cargo run <bitcoind-rpc-username>:<bitcoind-rpc-password>@<bitcoind-rpc-host>:<bitcoind-rpc-port> <ldk_storage_directory_path> [<ldk-peer-listening-port>] [bitcoin-network]
12+
cargo run <bitcoind-rpc-username>:<bitcoind-rpc-password>@<bitcoind-rpc-host>:<bitcoind-rpc-port> <ldk_storage_directory_path> [<ldk-peer-listening-port>] [bitcoin-network] [announced-listen-addr announced-node-name]
1313
```
1414
`bitcoind`'s RPC username and password likely can be found through `cat ~/.bitcoin/.cookie`.
1515

1616
`bitcoin-network`: defaults to `testnet`. Options: `testnet`, `regtest`.
1717

1818
`ldk-peer-listening-port`: defaults to 9735.
1919

20+
`announced-listen-addr` and `announced-node-name`: default to nothing, disabling any public announcements of this node.
21+
`announced-listen-addr` can be set to an IPv4 or IPv6 address to announce that as a publicly-connectable address for this node.
22+
`announced-node-name` can be any string up to 32 bytes in length, representing this node's alias.
23+
2024
## License
2125

2226
Licensed under either:

src/cli.rs

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use bitcoin::secp256k1::key::PublicKey;
99
use lightning::chain;
1010
use lightning::chain::keysinterface::KeysManager;
1111
use lightning::ln::features::InvoiceFeatures;
12+
use lightning::ln::msgs::NetAddress;
1213
use lightning::ln::{PaymentHash, PaymentSecret};
1314
use lightning::routing::network_graph::NetGraphMsgHandler;
1415
use lightning::routing::router;
@@ -18,7 +19,7 @@ use lightning_invoice::{utils, Currency, Invoice};
1819
use std::env;
1920
use std::io;
2021
use std::io::{BufRead, Write};
21-
use std::net::{SocketAddr, ToSocketAddrs};
22+
use std::net::{IpAddr, SocketAddr, ToSocketAddrs};
2223
use std::ops::Deref;
2324
use std::path::Path;
2425
use std::str::FromStr;
@@ -33,12 +34,14 @@ pub(crate) struct LdkUserInfo {
3334
pub(crate) bitcoind_rpc_host: String,
3435
pub(crate) ldk_storage_dir_path: String,
3536
pub(crate) ldk_peer_listening_port: u16,
37+
pub(crate) ldk_announced_listen_addr: Option<NetAddress>,
38+
pub(crate) ldk_announced_node_name: [u8; 32],
3639
pub(crate) network: Network,
3740
}
3841

3942
pub(crate) fn parse_startup_args() -> Result<LdkUserInfo, ()> {
4043
if env::args().len() < 3 {
41-
println!("ldk-tutorial-node requires 3 arguments: `cargo run <bitcoind-rpc-username>:<bitcoind-rpc-password>@<bitcoind-rpc-host>:<bitcoind-rpc-port> ldk_storage_directory_path [<ldk-incoming-peer-listening-port>] [bitcoin-network]`");
44+
println!("ldk-tutorial-node requires 3 arguments: `cargo run <bitcoind-rpc-username>:<bitcoind-rpc-password>@<bitcoind-rpc-host>:<bitcoind-rpc-port> ldk_storage_directory_path [<ldk-incoming-peer-listening-port>] [bitcoin-network] [announced-listen-addr announced-node-name]`");
4245
return Err(());
4346
}
4447
let bitcoind_rpc_info = env::args().skip(1).next().unwrap();
@@ -84,13 +87,41 @@ pub(crate) fn parse_startup_args() -> Result<LdkUserInfo, ()> {
8487
Some(_) => panic!("Unsupported network provided. Options are: `regtest`, `testnet`"),
8588
None => Network::Testnet,
8689
};
90+
91+
let ldk_announced_listen_addr = match env::args().skip(arg_idx + 1).next().as_ref() {
92+
Some(s) => match IpAddr::from_str(s) {
93+
Ok(IpAddr::V4(a)) => {
94+
Some(NetAddress::IPv4 { addr: a.octets(), port: ldk_peer_listening_port })
95+
}
96+
Ok(IpAddr::V6(a)) => {
97+
Some(NetAddress::IPv6 { addr: a.octets(), port: ldk_peer_listening_port })
98+
}
99+
Err(_) => panic!("Failed to parse announced-listen-addr into an IP address"),
100+
},
101+
None => None,
102+
};
103+
104+
let ldk_announced_node_name = match env::args().skip(arg_idx + 2).next().as_ref() {
105+
Some(s) => {
106+
if s.len() > 32 {
107+
panic!("Node Alias can not be longer than 32 bytes");
108+
}
109+
let mut bytes = [0; 32];
110+
bytes[..s.len()].copy_from_slice(s.as_bytes());
111+
bytes
112+
}
113+
None => [0; 32],
114+
};
115+
87116
Ok(LdkUserInfo {
88117
bitcoind_rpc_username,
89118
bitcoind_rpc_password,
90119
bitcoind_rpc_host,
91120
bitcoind_rpc_port,
92121
ldk_storage_dir_path,
93122
ldk_peer_listening_port,
123+
ldk_announced_listen_addr,
124+
ldk_announced_node_name,
94125
network,
95126
})
96127
}
@@ -393,19 +424,22 @@ fn list_channels(channel_manager: Arc<ChannelManager>) {
393424
println!("");
394425
println!("\t{{");
395426
println!("\t\tchannel_id: {},", hex_utils::hex_str(&chan_info.channel_id[..]));
427+
if let Some(funding_txo) = chan_info.funding_txo {
428+
println!("\t\tfunding_txid: {},", funding_txo.txid);
429+
}
396430
println!(
397431
"\t\tpeer_pubkey: {},",
398432
hex_utils::hex_str(&chan_info.remote_network_id.serialize())
399433
);
400-
let mut pending_channel = false;
401-
match chan_info.short_channel_id {
402-
Some(id) => println!("\t\tshort_channel_id: {},", id),
403-
None => {
404-
pending_channel = true;
405-
}
434+
if let Some(id) = chan_info.short_channel_id {
435+
println!("\t\tshort_channel_id: {},", id);
406436
}
407-
println!("\t\tpending_open: {},", pending_channel);
437+
println!("\t\tis_confirmed_onchain: {},", chan_info.is_funding_locked);
408438
println!("\t\tchannel_value_satoshis: {},", chan_info.channel_value_satoshis);
439+
if chan_info.is_usable {
440+
println!("\t\tavailable_balance_for_send_msat: {},", chan_info.outbound_capacity_msat);
441+
println!("\t\tavailable_balance_for_recv_msat: {},", chan_info.inbound_capacity_msat);
442+
}
409443
println!("\t\tchannel_can_send_payments: {},", chan_info.is_usable);
410444
println!("\t}},");
411445
}

src/main.rs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,9 @@ async fn handle_ldk_events(
220220
hex_utils::hex_str(&payment_hash.0)
221221
);
222222
if rejected_by_dest {
223-
println!("rejected by destination node");
223+
println!("re-attempting the payment will not succeed");
224224
} else {
225-
println!("route failed");
225+
println!("payment may be retried");
226226
}
227227
print!("> ");
228228
io::stdout().flush().unwrap();
@@ -569,14 +569,35 @@ async fn start_ldk() {
569569
peer_addr,
570570
peer_manager.clone(),
571571
event_ntfn_sender.clone(),
572-
);
572+
)
573+
.await;
573574
}
574575
}
575576
}
576577
}
577578
Err(e) => println!("ERROR: errored reading channel peer info from disk: {:?}", e),
578579
}
579580

581+
// Regularly broadcast our node_announcement. This is only required (or possible) if we have
582+
// some public channels, and is only useful if we have public listen address(es) to announce.
583+
// In a production environment, this should occur only after the announcement of new channels
584+
// to avoid churn in the global network graph.
585+
let chan_manager = Arc::clone(&channel_manager);
586+
let network = args.network;
587+
if args.ldk_announced_listen_addr.is_some() {
588+
tokio::spawn(async move {
589+
let mut interval = tokio::time::interval(Duration::from_secs(60));
590+
loop {
591+
interval.tick().await;
592+
chan_manager.broadcast_node_announcement(
593+
[0; 3],
594+
args.ldk_announced_node_name,
595+
vec![args.ldk_announced_listen_addr.as_ref().unwrap().clone()],
596+
);
597+
}
598+
});
599+
}
600+
580601
// Start the CLI.
581602
cli::poll_for_user_input(
582603
peer_manager.clone(),
@@ -588,7 +609,7 @@ async fn start_ldk() {
588609
event_ntfn_sender,
589610
ldk_data_dir.clone(),
590611
logger.clone(),
591-
args.network,
612+
network,
592613
)
593614
.await;
594615
}

0 commit comments

Comments
 (0)