X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Ffeatures.rs;h=3ce3d4fa7e604b9e0fb979dd8f4da0911adbdda2;hb=e885d0a7747cfc3b89a3c2765a8c0dd174e3889a;hp=c4a15fad0c716bd8768aa0da108818a3f149f905;hpb=babf0af30bfe766e6c3f1c3cf76b7b0fa0830dbc;p=rust-lightning diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index c4a15fad..3ce3d4fa 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -1,3 +1,12 @@ +// This file is Copyright its original authors, visible in version control +// history. +// +// This file is licensed under the Apache License, Version 2.0 or the MIT license +// , at your option. +// You may not use this file except in accordance with one or both of these +// licenses. + //! Feature flag definitions for the Lightning protocol according to [BOLT #9]. //! //! Lightning nodes advertise a supported set of operation through feature flags. Features are @@ -95,7 +104,7 @@ mod sealed { ], optional_features: [ // Byte 0 - DataLossProtect | InitialRoutingSync | UpfrontShutdownScript, + DataLossProtect | InitialRoutingSync | UpfrontShutdownScript | GossipQueries, // Byte 1 VariableLengthOnion | PaymentSecret, // Byte 2 @@ -113,7 +122,7 @@ mod sealed { ], optional_features: [ // Byte 0 - DataLossProtect | UpfrontShutdownScript, + DataLossProtect | UpfrontShutdownScript | GossipQueries, // Byte 1 VariableLengthOnion | PaymentSecret, // Byte 2 @@ -234,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], @@ -270,6 +281,8 @@ mod sealed { /// Tracks the set of features which a node implements, templated by the context in which it /// appears. +/// +/// (C-not exported) as we map the concrete feature types below directly instead pub struct Features { /// Note that, for convenience, flags is LITTLE endian (despite being big-endian on the wire) flags: Vec, @@ -462,6 +475,22 @@ 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) + } + #[cfg(test)] + 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 { @@ -486,6 +515,10 @@ impl Features { pub(crate) fn initial_routing_sync(&self) -> bool { ::supports_feature(&self.flags) } + // 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)] pub(crate) fn clear_initial_routing_sync(&mut self) { ::clear_bits(&mut self.flags) } @@ -557,6 +590,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()); @@ -609,9 +647,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(); { @@ -628,8 +667,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()); } }