X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Ffeatures.rs;h=51c608c1a6b47231762bbb35627032dcf33d19bc;hb=642913c586fc71b0e413532e7dedcd19cfd4815c;hp=6b4834edf67efdec993aadacfee17376adb65237;hpb=446c007939089d2e9bfd3e055149c85204d841b4;p=rust-lightning diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index 6b4834ed..51c608c1 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -87,8 +87,7 @@ use core::borrow::Borrow; use core::hash::{Hash, Hasher}; use core::marker::PhantomData; -use bitcoin::bech32; -use bitcoin::bech32::{Base32Len, FromBase32, ToBase32, u5, WriteBase32}; +use bech32::{Base32Len, FromBase32, ToBase32, u5, WriteBase32}; use crate::ln::msgs::DecodeError; use crate::util::ser::{Readable, WithoutLength, Writeable, Writer}; @@ -443,6 +442,9 @@ mod sealed { set_unknown_feature_required, supports_unknown_test_feature, requires_unknown_test_feature); } +const ANY_REQUIRED_FEATURES_MASK: u8 = 0b01_01_01_01; +const ANY_OPTIONAL_FEATURES_MASK: u8 = 0b10_10_10_10; + /// Tracks the set of features which a node implements, templated by the context in which it /// appears. /// @@ -616,8 +618,8 @@ impl ChannelTypeFeatures { // ChannelTypeFeatures must only contain required bits, so we OR the required forms of all // optional bits and then AND out the optional ones. for byte in ret.flags.iter_mut() { - *byte |= (*byte & 0b10_10_10_10) >> 1; - *byte &= 0b01_01_01_01; + *byte |= (*byte & ANY_OPTIONAL_FEATURES_MASK) >> 1; + *byte &= ANY_REQUIRED_FEATURES_MASK; } ret } @@ -762,7 +764,7 @@ impl Features { } pub(crate) fn supports_any_optional_bits(&self) -> bool { - self.flags.iter().any(|&byte| (byte & 0b10_10_10_10) != 0) + self.flags.iter().any(|&byte| (byte & ANY_OPTIONAL_FEATURES_MASK) != 0) } /// Returns true if this `Features` object contains required features unknown by `other`. @@ -770,9 +772,8 @@ impl Features { // Bitwise AND-ing with all even bits set except for known features will select required // unknown features. self.flags.iter().enumerate().any(|(i, &byte)| { - const REQUIRED_FEATURES: u8 = 0b01_01_01_01; let unknown_features = unset_features_mask_at_position(other, i); - (byte & (REQUIRED_FEATURES & unknown_features)) != 0 + (byte & (ANY_REQUIRED_FEATURES_MASK & unknown_features)) != 0 }) } @@ -802,13 +803,12 @@ impl Features { // unknown features. let byte_count = T::KNOWN_FEATURE_MASK.len(); self.flags.iter().enumerate().any(|(i, &byte)| { - let required_features = 0b01_01_01_01; let unknown_features = if i < byte_count { !T::KNOWN_FEATURE_MASK[i] } else { 0b11_11_11_11 }; - (byte & (required_features & unknown_features)) != 0 + (byte & (ANY_REQUIRED_FEATURES_MASK & unknown_features)) != 0 }) } @@ -1030,13 +1030,11 @@ impl Readable for WithoutLength> { } pub(crate) fn unset_features_mask_at_position(other: &Features, index: usize) -> u8 { - const REQUIRED_FEATURES: u8 = 0b01_01_01_01; - const OPTIONAL_FEATURES: u8 = 0b10_10_10_10; if index < other.flags.len() { // Form a mask similar to !T::KNOWN_FEATURE_MASK only for `other` !(other.flags[index] - | ((other.flags[index] >> 1) & REQUIRED_FEATURES) - | ((other.flags[index] << 1) & OPTIONAL_FEATURES)) + | ((other.flags[index] >> 1) & ANY_REQUIRED_FEATURES_MASK) + | ((other.flags[index] << 1) & ANY_OPTIONAL_FEATURES_MASK)) } else { 0b11_11_11_11 } @@ -1045,7 +1043,7 @@ pub(crate) fn unset_features_mask_at_position(other: &Featur #[cfg(test)] mod tests { use super::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, Bolt11InvoiceFeatures, NodeFeatures, OfferFeatures, sealed}; - use bitcoin::bech32::{Base32Len, FromBase32, ToBase32, u5}; + use bech32::{Base32Len, FromBase32, ToBase32, u5}; use crate::util::ser::{Readable, WithoutLength, Writeable}; #[test]