From 5af299e7d8e1d67302d0eb967b94938f5eec5003 Mon Sep 17 00:00:00 2001 From: bmancini55 Date: Wed, 21 Oct 2020 16:31:22 -0400 Subject: [PATCH] Add gossip_queries feature flag Support for the gossip_queries feature flag (bits 6/7) is added to the Features struct. This feature is available in the Init and Node contexts. The gossip_queries feature is not fully implemented so this feature is disabled when sent to peers in the Init message. --- lightning/src/ln/features.rs | 31 ++++++++++++++++++++++++++++--- lightning/src/ln/peer_handler.rs | 7 ++++--- lightning/src/ln/wire.rs | 11 ++++++----- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index f573ac4c4..0c3c36018 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -104,7 +104,7 @@ mod sealed { ], optional_features: [ // Byte 0 - DataLossProtect | InitialRoutingSync | UpfrontShutdownScript, + DataLossProtect | InitialRoutingSync | UpfrontShutdownScript | GossipQueries, // Byte 1 VariableLengthOnion | PaymentSecret, // Byte 2 @@ -122,7 +122,7 @@ mod sealed { ], optional_features: [ // Byte 0 - DataLossProtect | UpfrontShutdownScript, + DataLossProtect | UpfrontShutdownScript | GossipQueries, // Byte 1 VariableLengthOnion | PaymentSecret, // Byte 2 @@ -243,6 +243,8 @@ mod sealed { "Feature flags for `initial_routing_sync`."); define_feature!(5, UpfrontShutdownScript, [InitContext, NodeContext], "Feature flags for `option_upfront_shutdown_script`."); + define_feature!(7, GossipQueries, [InitContext, NodeContext], + "Feature flags for `gossip_queries`."); define_feature!(9, VariableLengthOnion, [InitContext, NodeContext], "Feature flags for `var_onion_optin`."); define_feature!(13, StaticRemoteKey, [InitContext, NodeContext], @@ -473,6 +475,21 @@ impl Features { } } + +impl Features { + #[cfg(test)] + pub(crate) fn requires_gossip_queries(&self) -> bool { + ::requires_feature(&self.flags) + } + pub(crate) fn supports_gossip_queries(&self) -> bool { + ::supports_feature(&self.flags) + } + pub(crate) fn clear_gossip_queries(mut self) -> Self { + ::clear_bits(&mut self.flags); + self + } +} + impl Features { #[cfg(test)] pub(crate) fn requires_variable_length_onion(&self) -> bool { @@ -568,6 +585,11 @@ mod tests { assert!(!InitFeatures::known().requires_upfront_shutdown_script()); assert!(!NodeFeatures::known().requires_upfront_shutdown_script()); + assert!(InitFeatures::known().supports_gossip_queries()); + assert!(NodeFeatures::known().supports_gossip_queries()); + assert!(!InitFeatures::known().requires_gossip_queries()); + assert!(!NodeFeatures::known().requires_gossip_queries()); + assert!(InitFeatures::known().supports_data_loss_protect()); assert!(NodeFeatures::known().supports_data_loss_protect()); assert!(!InitFeatures::known().requires_data_loss_protect()); @@ -620,9 +642,10 @@ mod tests { #[test] fn convert_to_context_with_relevant_flags() { - let init_features = InitFeatures::known().clear_upfront_shutdown_script(); + let init_features = InitFeatures::known().clear_upfront_shutdown_script().clear_gossip_queries(); assert!(init_features.initial_routing_sync()); assert!(!init_features.supports_upfront_shutdown_script()); + assert!(!init_features.supports_gossip_queries()); let node_features: NodeFeatures = init_features.to_context(); { @@ -639,8 +662,10 @@ mod tests { // Check that cleared flags are kept blank when converting back: // - initial_routing_sync was not applicable to NodeContext // - upfront_shutdown_script was cleared before converting + // - gossip_queries was cleared before converting let features: InitFeatures = node_features.to_context_internal(); assert!(!features.initial_routing_sync()); assert!(!features.supports_upfront_shutdown_script()); + assert!(!init_features.supports_gossip_queries()); } } diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 6e997e53b..1e57177a0 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -584,7 +584,7 @@ impl PeerManager PeerManager PeerManager) { + fn check_init_msg(buffer: Vec, expect_unknown: bool) { let mut reader = ::std::io::Cursor::new(buffer); let decoded_msg = read(&mut reader).unwrap(); match decoded_msg { Message::Init(msgs::Init { features }) => { assert!(features.supports_variable_length_onion()); assert!(features.supports_upfront_shutdown_script()); - assert!(features.supports_unknown_bits()); + assert!(features.supports_gossip_queries()); + assert_eq!(expect_unknown, features.supports_unknown_bits()); assert!(!features.requires_unknown_bits()); assert!(!features.initial_routing_sync()); }, @@ -450,7 +451,7 @@ mod tests { Message::NodeAnnouncement(msgs::NodeAnnouncement { contents: msgs::UnsignedNodeAnnouncement { features, ..}, ..}) => { assert!(features.supports_variable_length_onion()); assert!(features.supports_upfront_shutdown_script()); - assert!(features.supports_unknown_bits()); + assert!(features.supports_gossip_queries()); assert!(!features.requires_unknown_bits()); }, _ => panic!("Expected node announcement, found message type: {}", decoded_msg.type_id()) -- 2.39.5