X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;ds=sidebyside;f=lightning%2Fsrc%2Fln%2Ffeatures.rs;h=d7e0299e8876143b09a2052d6380c842a257b827;hb=e325598e674022af82ef5f976e9b11f430fb71bf;hp=816bf1dff1465d578d4e0dae7ae0b962a62a7782;hpb=49f88eca28372f1a3b5b6f95049f9dad5946f718;p=rust-lightning diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index 816bf1dff..d7e0299e8 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -29,6 +29,10 @@ mod sealed { // You should just use the type aliases instead. pub trait UpfrontShutdownScript: Context {} impl UpfrontShutdownScript for InitContext {} impl UpfrontShutdownScript for NodeContext {} + + pub trait VariableLengthOnion: Context {} + impl VariableLengthOnion for InitContext {} + impl VariableLengthOnion for NodeContext {} } /// Tracks the set of features which a node implements, templated by the context in which it @@ -67,17 +71,9 @@ pub type ChannelFeatures = Features; impl InitFeatures { /// Create a Features with the features we support - #[cfg(not(feature = "fuzztarget"))] - pub(crate) fn supported() -> InitFeatures { - InitFeatures { - flags: vec![2 | 1 << 5], - mark: PhantomData, - } - } - #[cfg(feature = "fuzztarget")] pub fn supported() -> InitFeatures { InitFeatures { - flags: vec![2 | 1 << 5], + flags: vec![2 | 1 << 5, 1 << (9-8)], mark: PhantomData, } } @@ -126,6 +122,13 @@ impl ChannelFeatures { mark: PhantomData, } } + + /// Takes the flags that we know how to interpret in an init-context features that are also + /// relevant in a channel-context features and creates a channel-context features from them. + pub(crate) fn with_known_relevant_init_flags(_init_ctx: &InitFeatures) -> Self { + // There are currently no channel flags defined that we understand. + Self { flags: Vec::new(), mark: PhantomData, } + } } impl NodeFeatures { @@ -133,17 +136,28 @@ impl NodeFeatures { #[cfg(not(feature = "fuzztarget"))] pub(crate) fn supported() -> NodeFeatures { NodeFeatures { - flags: vec![2 | 1 << 5], + flags: vec![2 | 1 << 5, 1 << (9-8)], mark: PhantomData, } } #[cfg(feature = "fuzztarget")] pub fn supported() -> NodeFeatures { NodeFeatures { - flags: vec![2 | 1 << 5], + flags: vec![2 | 1 << 5, 1 << (9-8)], mark: PhantomData, } } + + /// Takes the flags that we know how to interpret in an init-context features that are also + /// relevant in a node-context features and creates a node-context features from them. + pub(crate) fn with_known_relevant_init_flags(init_ctx: &InitFeatures) -> Self { + let mut flags = Vec::new(); + if init_ctx.flags.len() > 0 { + // Pull out data_loss_protect and upfront_shutdown_script (bits 0, 1, 4, and 5) + flags.push(init_ctx.flags.last().unwrap() & 0b00110011); + } + Self { flags, mark: PhantomData, } + } } impl Features { @@ -172,13 +186,21 @@ impl Features { pub(crate) fn requires_unknown_bits(&self) -> bool { self.flags.iter().enumerate().any(|(idx, &byte)| { - ( idx != 0 && (byte & 0x55) != 0 ) || ( idx == 0 && (byte & 0x14) != 0 ) + (match idx { + 0 => (byte & 0b01000100), + 1 => (byte & 0b01010100), + _ => (byte & 0b01010101), + }) != 0 }) } pub(crate) fn supports_unknown_bits(&self) -> bool { self.flags.iter().enumerate().any(|(idx, &byte)| { - ( idx != 0 && byte != 0 ) || ( idx == 0 && (byte & 0xc4) != 0 ) + (match idx { + 0 => (byte & 0b11000100), + 1 => (byte & 0b11111100), + _ => byte, + }) != 0 }) } @@ -222,6 +244,12 @@ impl Features { } } +impl Features { + pub(crate) fn supports_variable_length_onion(&self) -> bool { + self.flags.len() > 1 && (self.flags[1] & 3) != 0 + } +} + impl Features { pub(crate) fn initial_routing_sync(&self) -> bool { self.flags.len() > 0 && (self.flags[0] & (1 << 3)) != 0