8
8
use crate :: payment:: SendingParameters ;
9
9
10
10
use lightning:: ln:: msgs:: SocketAddress ;
11
+ use lightning:: routing:: gossip:: NodeAlias ;
11
12
use lightning:: util:: config:: UserConfig ;
12
13
use lightning:: util:: logger:: Level as LogLevel ;
13
14
@@ -86,6 +87,7 @@ pub(crate) const WALLET_KEYS_SEED_LEN: usize = 64;
86
87
/// | `log_dir_path` | None |
87
88
/// | `network` | Bitcoin |
88
89
/// | `listening_addresses` | None |
90
+ /// | `node_alias` | None |
89
91
/// | `default_cltv_expiry_delta` | 144 |
90
92
/// | `onchain_wallet_sync_interval_secs` | 80 |
91
93
/// | `wallet_sync_interval_secs` | 30 |
@@ -110,7 +112,15 @@ pub struct Config {
110
112
/// The used Bitcoin network.
111
113
pub network : Network ,
112
114
/// The addresses on which the node will listen for incoming connections.
115
+ ///
116
+ /// **Note**: Node announcements will only be broadcast if the `node_alias` and the
117
+ /// `listening_addresses` are set.
113
118
pub listening_addresses : Option < Vec < SocketAddress > > ,
119
+ /// The node alias to be used in announcements.
120
+ ///
121
+ /// **Note**: Node announcements will only be broadcast if the `node_alias` and the
122
+ /// `listening_addresses` are set.
123
+ pub node_alias : Option < NodeAlias > ,
114
124
/// The time in-between background sync attempts of the onchain wallet, in seconds.
115
125
///
116
126
/// **Note:** A minimum of 10 seconds is always enforced.
@@ -180,6 +190,7 @@ impl Default for Config {
180
190
log_level : DEFAULT_LOG_LEVEL ,
181
191
anchor_channels_config : Some ( AnchorChannelsConfig :: default ( ) ) ,
182
192
sending_parameters : None ,
193
+ node_alias : None ,
183
194
}
184
195
}
185
196
}
@@ -265,17 +276,124 @@ pub fn default_config() -> Config {
265
276
Config :: default ( )
266
277
}
267
278
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
+ }
320
+ }
321
+
268
322
pub ( crate ) fn default_user_config ( config : & Config ) -> UserConfig {
269
323
// Initialize the default config values.
270
324
//
271
- // Note that methods such as Node::connect_open_channel might override some of the values set
272
- // here, e.g. the ChannelHandshakeConfig, meaning these default values will mostly be relevant
273
- // for inbound channels.
325
+ // Note that methods such as Node::open_channel and Node::open_announced_channel might override
326
+ // some of the values set here, e.g. the ChannelHandshakeConfig, meaning these default values
327
+ // will mostly be relevant for inbound channels.
274
328
let mut user_config = UserConfig :: default ( ) ;
275
329
user_config. channel_handshake_limits . force_announced_channel_preference = false ;
276
330
user_config. manually_accept_inbound_channels = true ;
277
331
user_config. channel_handshake_config . negotiate_anchors_zero_fee_htlc_tx =
278
332
config. anchor_channels_config . is_some ( ) ;
279
333
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
+ } ,
341
+ }
342
+
280
343
user_config
281
344
}
345
+
346
+ #[ cfg( test) ]
347
+ mod tests {
348
+ use std:: str:: FromStr ;
349
+
350
+ use crate :: config:: ChannelAnnouncementStatus ;
351
+
352
+ use super :: can_announce_channel;
353
+ use super :: Config ;
354
+ use super :: NodeAlias ;
355
+ use super :: SocketAddress ;
356
+
357
+ #[ test]
358
+ fn node_can_announce_channel ( ) {
359
+ // Default configuration with node alias and listening addresses unset
360
+ 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
+ ) ;
367
+
368
+ // Set node alias with listening addresses unset
369
+ let alias_frm_str = |alias : & str | {
370
+ let mut bytes = [ 0u8 ; 32 ] ;
371
+ bytes[ ..alias. as_bytes ( ) . len ( ) ] . copy_from_slice ( alias. as_bytes ( ) ) ;
372
+ NodeAlias ( bytes)
373
+ } ;
374
+ 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
+ ) ;
381
+
382
+ // Set node alias with an empty list of listening addresses
383
+ 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
+ ) ;
390
+
391
+ // Set node alias with a non-empty list of listening addresses
392
+ let socket_address =
393
+ SocketAddress :: from_str ( "localhost:8000" ) . expect ( "Socket address conversion failed." ) ;
394
+ if let Some ( ref mut addresses) = node_config. listening_addresses {
395
+ addresses. push ( socket_address) ;
396
+ }
397
+ assert_eq ! ( can_announce_channel( & node_config) , ChannelAnnouncementStatus :: Announceable ) ;
398
+ }
399
+ }
0 commit comments