From: Matt Corallo Date: Wed, 7 Sep 2022 17:55:01 +0000 (+0000) Subject: Add a new InitFeatures constructor to capture the types of flags X-Git-Tag: v0.0.111~9^2~1 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=e34a2bc722a998376576eb5f2e60bbafefaed7f4;p=rust-lightning Add a new InitFeatures constructor to capture the types of flags When `ChannelMessageHandler` implementations wish to return an `InitFeatures` which contain all the known flags that are relevant to channel handling, but not gossip handling, they currently need to do so by manually constructing an InitFeatures with all known flags and then clearing the ones they dont want. Instead of spreading this logic out across the codebase, this consolidates such construction to one place in features.rs. --- diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 20fd5a38b..7d09a5b81 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -6126,7 +6126,7 @@ impl } fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures { - InitFeatures::known() + InitFeatures::known_channel_features() } } diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index c978c61a3..e5e9db035 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -163,6 +163,8 @@ mod sealed { , ], optional_features: [ + // Note that if new "non-channel-related" flags are added here they should be + // explicitly cleared in InitFeatures::known_channel_features. // Byte 0 DataLossProtect | InitialRoutingSync | UpfrontShutdownScript | GossipQueries, // Byte 1 @@ -545,6 +547,14 @@ impl InitFeatures { pub(crate) fn to_context(&self) -> Features { self.to_context_internal() } + + /// Returns the set of known init features that are related to channels. At least some of + /// these features are likely required for peers to talk to us. + pub fn known_channel_features() -> InitFeatures { + let mut features = Self::known().clear_gossip_queries(); + features.clear_initial_routing_sync(); + features + } } impl InvoiceFeatures { @@ -763,7 +773,6 @@ impl Features { impl Features { - #[cfg(test)] pub(crate) fn clear_gossip_queries(mut self) -> Self { ::clear_bits(&mut self.flags); self @@ -771,10 +780,7 @@ impl Features { } impl Features { - // We are no longer setting initial_routing_sync now that gossip_queries - // is enabled. This feature is ignored by a peer when gossip_queries has - // been negotiated. - #[cfg(test)] + // Note that initial_routing_sync is ignored if gossip_queries is set. pub(crate) fn clear_initial_routing_sync(&mut self) { ::clear_bits(&mut self.flags) } diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 4c83c8cf4..417b14d15 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -206,7 +206,11 @@ impl ChannelMessageHandler for ErroringMessageHandler { fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {} fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {} fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() } - fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { InitFeatures::known() } + fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { + // Use our known channel feature set as peers may otherwise not be willing to talk to us at + // all. + InitFeatures::known_channel_features() + } } impl Deref for ErroringMessageHandler { type Target = ErroringMessageHandler; diff --git a/lightning/src/util/test_utils.rs b/lightning/src/util/test_utils.rs index a5389f92b..7c7aeb5d4 100644 --- a/lightning/src/util/test_utils.rs +++ b/lightning/src/util/test_utils.rs @@ -361,7 +361,7 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler { NodeFeatures::empty() } fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures { - InitFeatures::known() + InitFeatures::known_channel_features() } }