Skip to content

Commit 58188b8

Browse files
authored
Merge pull request #366 from tnull/2024-10-330-followups
2 parents c9ebeb6 + 85862f5 commit 58188b8

8 files changed

+395
-555
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ A ready-to-go Lightning node library built using [LDK][ldk] and [BDK][bdk].
1111
LDK Node is a self-custodial Lightning node in library form. Its central goal is to provide a small, simple, and straightforward interface that enables users to easily set up and run a Lightning node with an integrated on-chain wallet. While minimalism is at its core, LDK Node aims to be sufficiently modular and configurable to be useful for a variety of use cases.
1212

1313
## Getting Started
14-
The primary abstraction of the library is the [`Node`][api_docs_node], which can be retrieved by setting up and configuring a [`Builder`][api_docs_builder] to your liking and calling one of the `build` methods. `Node` can then be controlled via commands such as `start`, `stop`, `open_channel`, `open_announced_channel`, `send`, etc.
14+
The primary abstraction of the library is the [`Node`][api_docs_node], which can be retrieved by setting up and configuring a [`Builder`][api_docs_builder] to your liking and calling one of the `build` methods. `Node` can then be controlled via commands such as `start`, `stop`, `open_channel`, `send`, etc.
1515

1616
```rust
1717
use ldk_node::Builder;

src/builder.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -307,9 +307,10 @@ impl NodeBuilder {
307307
Ok(self)
308308
}
309309

310-
/// Sets the alias the [`Node`] will use in its announcement.
310+
/// Sets the node alias that will be used when broadcasting announcements to the gossip
311+
/// network.
311312
///
312-
/// The provided alias must be a valid UTF-8 string.
313+
/// The provided alias must be a valid UTF-8 string and no longer than 32 bytes in total.
313314
pub fn set_node_alias(&mut self, node_alias: String) -> Result<&mut Self, BuildError> {
314315
let node_alias = sanitize_alias(&node_alias)?;
315316

@@ -515,7 +516,10 @@ impl ArcedNodeBuilder {
515516
self.inner.write().unwrap().set_listening_addresses(listening_addresses).map(|_| ())
516517
}
517518

518-
/// Sets the node alias.
519+
/// Sets the node alias that will be used when broadcasting announcements to the gossip
520+
/// network.
521+
///
522+
/// The provided alias must be a valid UTF-8 string and no longer than 32 bytes in total.
519523
pub fn set_node_alias(&self, node_alias: String) -> Result<(), BuildError> {
520524
self.inner.write().unwrap().set_node_alias(node_alias).map(|_| ())
521525
}

src/config.rs

+19-75
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ pub(crate) const WALLET_KEYS_SEED_LEN: usize = 64;
8787
/// | `log_dir_path` | None |
8888
/// | `network` | Bitcoin |
8989
/// | `listening_addresses` | None |
90-
/// | `node_alias` | None |
90+
/// | `node_alias` | None |
9191
/// | `default_cltv_expiry_delta` | 144 |
9292
/// | `onchain_wallet_sync_interval_secs` | 80 |
9393
/// | `wallet_sync_interval_secs` | 30 |
@@ -113,12 +113,14 @@ pub struct Config {
113113
pub network: Network,
114114
/// The addresses on which the node will listen for incoming connections.
115115
///
116-
/// **Note**: Node announcements will only be broadcast if the `node_alias` and the
116+
/// **Note**: We will only allow opening and accepting public channels if the `node_alias` and the
117117
/// `listening_addresses` are set.
118118
pub listening_addresses: Option<Vec<SocketAddress>>,
119-
/// The node alias to be used in announcements.
119+
/// The node alias that will be used when broadcasting announcements to the gossip network.
120120
///
121-
/// **Note**: Node announcements will only be broadcast if the `node_alias` and the
121+
/// The provided alias must be a valid UTF-8 string and no longer than 32 bytes in total.
122+
///
123+
/// **Note**: We will only allow opening and accepting public channels if the `node_alias` and the
122124
/// `listening_addresses` are set.
123125
pub node_alias: Option<NodeAlias>,
124126
/// The time in-between background sync attempts of the onchain wallet, in seconds.
@@ -276,47 +278,9 @@ pub fn default_config() -> Config {
276278
Config::default()
277279
}
278280

279-
/// Specifies reasons why a channel cannot be announced.
280-
#[derive(Debug, PartialEq)]
281-
pub(crate) enum ChannelAnnouncementBlocker {
282-
/// The node alias is not set.
283-
MissingNodeAlias,
284-
/// The listening addresses are not set.
285-
MissingListeningAddresses,
286-
// This listening addresses is set but the vector is empty.
287-
EmptyListeningAddresses,
288-
}
289-
290-
/// Enumeration defining the announcement status of a channel.
291-
#[derive(Debug, PartialEq)]
292-
pub(crate) enum ChannelAnnouncementStatus {
293-
/// The channel is announceable.
294-
Announceable,
295-
/// The channel is not announceable.
296-
Unannounceable(ChannelAnnouncementBlocker),
297-
}
298-
299-
/// Checks if a node is can announce a channel based on the configured values of both the node's
300-
/// alias and its listening addresses.
301-
///
302-
/// If either of them is unset, the node cannot announce the channel. This ability to announce/
303-
/// unannounce a channel is codified with `ChannelAnnouncementStatus`
304-
pub(crate) fn can_announce_channel(config: &Config) -> ChannelAnnouncementStatus {
305-
if config.node_alias.is_none() {
306-
return ChannelAnnouncementStatus::Unannounceable(
307-
ChannelAnnouncementBlocker::MissingNodeAlias,
308-
);
309-
}
310-
311-
match &config.listening_addresses {
312-
None => ChannelAnnouncementStatus::Unannounceable(
313-
ChannelAnnouncementBlocker::MissingListeningAddresses,
314-
),
315-
Some(addresses) if addresses.is_empty() => ChannelAnnouncementStatus::Unannounceable(
316-
ChannelAnnouncementBlocker::EmptyListeningAddresses,
317-
),
318-
Some(_) => ChannelAnnouncementStatus::Announceable,
319-
}
281+
pub(crate) fn may_announce_channel(config: &Config) -> bool {
282+
config.node_alias.is_some()
283+
&& config.listening_addresses.as_ref().map_or(false, |addrs| !addrs.is_empty())
320284
}
321285

322286
pub(crate) fn default_user_config(config: &Config) -> UserConfig {
@@ -331,13 +295,10 @@ pub(crate) fn default_user_config(config: &Config) -> UserConfig {
331295
user_config.channel_handshake_config.negotiate_anchors_zero_fee_htlc_tx =
332296
config.anchor_channels_config.is_some();
333297

334-
match can_announce_channel(config) {
335-
ChannelAnnouncementStatus::Announceable => (),
336-
ChannelAnnouncementStatus::Unannounceable(_) => {
337-
user_config.accept_forwards_to_priv_channels = false;
338-
user_config.channel_handshake_config.announced_channel = false;
339-
user_config.channel_handshake_limits.force_announced_channel_preference = true;
340-
},
298+
if !may_announce_channel(config) {
299+
user_config.accept_forwards_to_priv_channels = false;
300+
user_config.channel_handshake_config.announced_channel = false;
301+
user_config.channel_handshake_limits.force_announced_channel_preference = true;
341302
}
342303

343304
user_config
@@ -347,23 +308,16 @@ pub(crate) fn default_user_config(config: &Config) -> UserConfig {
347308
mod tests {
348309
use std::str::FromStr;
349310

350-
use crate::config::ChannelAnnouncementStatus;
351-
352-
use super::can_announce_channel;
311+
use super::may_announce_channel;
353312
use super::Config;
354313
use super::NodeAlias;
355314
use super::SocketAddress;
356315

357316
#[test]
358-
fn node_can_announce_channel() {
317+
fn node_announce_channel() {
359318
// Default configuration with node alias and listening addresses unset
360319
let mut node_config = Config::default();
361-
assert_eq!(
362-
can_announce_channel(&node_config),
363-
ChannelAnnouncementStatus::Unannounceable(
364-
crate::config::ChannelAnnouncementBlocker::MissingNodeAlias
365-
)
366-
);
320+
assert!(!may_announce_channel(&node_config));
367321

368322
// Set node alias with listening addresses unset
369323
let alias_frm_str = |alias: &str| {
@@ -372,28 +326,18 @@ mod tests {
372326
NodeAlias(bytes)
373327
};
374328
node_config.node_alias = Some(alias_frm_str("LDK_Node"));
375-
assert_eq!(
376-
can_announce_channel(&node_config),
377-
ChannelAnnouncementStatus::Unannounceable(
378-
crate::config::ChannelAnnouncementBlocker::MissingListeningAddresses
379-
)
380-
);
329+
assert!(!may_announce_channel(&node_config));
381330

382331
// Set node alias with an empty list of listening addresses
383332
node_config.listening_addresses = Some(vec![]);
384-
assert_eq!(
385-
can_announce_channel(&node_config),
386-
ChannelAnnouncementStatus::Unannounceable(
387-
crate::config::ChannelAnnouncementBlocker::EmptyListeningAddresses
388-
)
389-
);
333+
assert!(!may_announce_channel(&node_config));
390334

391335
// Set node alias with a non-empty list of listening addresses
392336
let socket_address =
393337
SocketAddress::from_str("localhost:8000").expect("Socket address conversion failed.");
394338
if let Some(ref mut addresses) = node_config.listening_addresses {
395339
addresses.push(socket_address);
396340
}
397-
assert_eq!(can_announce_channel(&node_config), ChannelAnnouncementStatus::Announceable);
341+
assert!(may_announce_channel(&node_config));
398342
}
399343
}

0 commit comments

Comments
 (0)