X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Ffeatures.rs;h=5de383b1f4469273207441892a90d1d2c063494d;hb=131560e08fa4f66b8ce9302cde637f87602c86b0;hp=3e3484e7372fc4a9ee59adaa01eb35badec11416;hpb=bf2218260ec3934efb13f953c5a8141c6978be0a;p=rust-lightning diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index 3e3484e7..5de383b1 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -168,7 +168,7 @@ mod sealed { ZeroConf | Keysend, ]); define_context!(ChannelContext, []); - define_context!(InvoiceContext, [ + define_context!(Bolt11InvoiceContext, [ // Byte 0 , // Byte 1 @@ -369,17 +369,17 @@ mod sealed { define_feature!(7, GossipQueries, [InitContext, NodeContext], "Feature flags for `gossip_queries`.", set_gossip_queries_optional, set_gossip_queries_required, supports_gossip_queries, requires_gossip_queries); - define_feature!(9, VariableLengthOnion, [InitContext, NodeContext, InvoiceContext], + define_feature!(9, VariableLengthOnion, [InitContext, NodeContext, Bolt11InvoiceContext], "Feature flags for `var_onion_optin`.", set_variable_length_onion_optional, set_variable_length_onion_required, supports_variable_length_onion, requires_variable_length_onion); define_feature!(13, StaticRemoteKey, [InitContext, NodeContext, ChannelTypeContext], "Feature flags for `option_static_remotekey`.", set_static_remote_key_optional, set_static_remote_key_required, supports_static_remote_key, requires_static_remote_key); - define_feature!(15, PaymentSecret, [InitContext, NodeContext, InvoiceContext], + define_feature!(15, PaymentSecret, [InitContext, NodeContext, Bolt11InvoiceContext], "Feature flags for `payment_secret`.", set_payment_secret_optional, set_payment_secret_required, supports_payment_secret, requires_payment_secret); - define_feature!(17, BasicMPP, [InitContext, NodeContext, InvoiceContext, Bolt12InvoiceContext], + define_feature!(17, BasicMPP, [InitContext, NodeContext, Bolt11InvoiceContext, Bolt12InvoiceContext], "Feature flags for `basic_mpp`.", set_basic_mpp_optional, set_basic_mpp_required, supports_basic_mpp, requires_basic_mpp); define_feature!(19, Wumbo, [InitContext, NodeContext], @@ -403,7 +403,7 @@ mod sealed { define_feature!(47, SCIDPrivacy, [InitContext, NodeContext, ChannelTypeContext], "Feature flags for only forwarding with SCID aliasing. Called `option_scid_alias` in the BOLTs", set_scid_privacy_optional, set_scid_privacy_required, supports_scid_privacy, requires_scid_privacy); - define_feature!(49, PaymentMetadata, [InvoiceContext], + define_feature!(49, PaymentMetadata, [Bolt11InvoiceContext], "Feature flags for payment metadata in invoices.", set_payment_metadata_optional, set_payment_metadata_required, supports_payment_metadata, requires_payment_metadata); define_feature!(51, ZeroConf, [InitContext, NodeContext, ChannelTypeContext], @@ -416,7 +416,7 @@ mod sealed { #[cfg(test)] define_feature!(123456789, UnknownFeature, - [NodeContext, ChannelContext, InvoiceContext, OfferContext, InvoiceRequestContext, Bolt12InvoiceContext, BlindedHopContext], + [NodeContext, ChannelContext, Bolt11InvoiceContext, OfferContext, InvoiceRequestContext, Bolt12InvoiceContext, BlindedHopContext], "Feature flags for an unknown feature used in testing.", set_unknown_feature_optional, set_unknown_feature_required, supports_unknown_test_feature, requires_unknown_test_feature); } @@ -492,7 +492,7 @@ pub type NodeFeatures = Features; /// Features used within a `channel_announcement` message. pub type ChannelFeatures = Features; /// Features used within an invoice. -pub type InvoiceFeatures = Features; +pub type Bolt11InvoiceFeatures = Features; /// Features used within an `offer`. pub type OfferFeatures = Features; /// Features used within an `invoice_request`. @@ -538,8 +538,8 @@ impl InitFeatures { } } -impl InvoiceFeatures { - /// Converts `InvoiceFeatures` to `Features`. Only known `InvoiceFeatures` relevant to +impl Bolt11InvoiceFeatures { + /// Converts `Bolt11InvoiceFeatures` to `Features`. Only known `Bolt11InvoiceFeatures` relevant to /// context `C` are included in the result. pub(crate) fn to_context(&self) -> Features { self.to_context_internal() @@ -549,15 +549,15 @@ impl InvoiceFeatures { /// features (since they were not announced in a node announcement). However, keysend payments /// don't have an invoice to pull the payee's features from, so this method is provided for use in /// [`PaymentParameters::for_keysend`], thus omitting the need for payers to manually construct an - /// `InvoiceFeatures` for [`find_route`]. + /// `Bolt11InvoiceFeatures` for [`find_route`]. /// /// MPP keysend is not widely supported yet, so we parameterize support to allow the user to /// choose whether their router should find multi-part routes. /// /// [`PaymentParameters::for_keysend`]: crate::routing::router::PaymentParameters::for_keysend /// [`find_route`]: crate::routing::router::find_route - pub(crate) fn for_keysend(allow_mpp: bool) -> InvoiceFeatures { - let mut res = InvoiceFeatures::empty(); + pub(crate) fn for_keysend(allow_mpp: bool) -> Bolt11InvoiceFeatures { + let mut res = Bolt11InvoiceFeatures::empty(); res.set_variable_length_onion_optional(); if allow_mpp { res.set_basic_mpp_optional(); @@ -567,8 +567,8 @@ impl InvoiceFeatures { } impl Bolt12InvoiceFeatures { - /// Converts `Bolt12InvoiceFeatures` to `Features`. Only known `Bolt12InvoiceFeatures` relevant - /// to context `C` are included in the result. + /// Converts [`Bolt12InvoiceFeatures`] to [`Features`]. Only known [`Bolt12InvoiceFeatures`] + /// relevant to context `C` are included in the result. pub(crate) fn to_context(&self) -> Features { self.to_context_internal() } @@ -594,9 +594,17 @@ impl ChannelTypeFeatures { ::set_required_bit(&mut ret.flags); ret } + + /// Constructs a ChannelTypeFeatures with anchors support + pub(crate) fn anchors_zero_htlc_fee_and_dependencies() -> Self { + let mut ret = Self::empty(); + ::set_required_bit(&mut ret.flags); + ::set_required_bit(&mut ret.flags); + ret + } } -impl ToBase32 for InvoiceFeatures { +impl ToBase32 for Bolt11InvoiceFeatures { fn write_base32(&self, writer: &mut W) -> Result<(), ::Err> { // Explanation for the "4": the normal way to round up when dividing is to add the divisor // minus one before dividing @@ -626,16 +634,16 @@ impl ToBase32 for InvoiceFeatures { } } -impl Base32Len for InvoiceFeatures { +impl Base32Len for Bolt11InvoiceFeatures { fn base32_len(&self) -> usize { self.to_base32().len() } } -impl FromBase32 for InvoiceFeatures { +impl FromBase32 for Bolt11InvoiceFeatures { type Err = bech32::Error; - fn from_base32(field_data: &[u5]) -> Result { + fn from_base32(field_data: &[u5]) -> Result { // Explanation for the "7": the normal way to round up when dividing is to add the divisor // minus one before dividing let length_bytes = (field_data.len() * 5 + 7) / 8 as usize; @@ -654,7 +662,7 @@ impl FromBase32 for InvoiceFeatures { while !res_bytes.is_empty() && res_bytes[res_bytes.len() - 1] == 0 { res_bytes.pop(); } - Ok(InvoiceFeatures::from_le_bytes(res_bytes)) + Ok(Bolt11InvoiceFeatures::from_le_bytes(res_bytes)) } } @@ -720,7 +728,7 @@ impl Features { } /// Returns true if this `Features` object contains required features unknown by `other`. - pub fn requires_unknown_bits_from(&self, other: &Features) -> bool { + pub fn requires_unknown_bits_from(&self, other: &Self) -> bool { // Bitwise AND-ing with all even bits set except for known features will select required // unknown features. self.flags.iter().enumerate().any(|(i, &byte)| { @@ -895,7 +903,7 @@ macro_rules! impl_feature_len_prefixed_write { impl_feature_len_prefixed_write!(InitFeatures); impl_feature_len_prefixed_write!(ChannelFeatures); impl_feature_len_prefixed_write!(NodeFeatures); -impl_feature_len_prefixed_write!(InvoiceFeatures); +impl_feature_len_prefixed_write!(Bolt11InvoiceFeatures); impl_feature_len_prefixed_write!(Bolt12InvoiceFeatures); impl_feature_len_prefixed_write!(BlindedHopFeatures); @@ -935,7 +943,7 @@ impl Readable for WithoutLength> { #[cfg(test)] mod tests { - use super::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, InvoiceFeatures, NodeFeatures, OfferFeatures, sealed}; + use super::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, Bolt11InvoiceFeatures, NodeFeatures, OfferFeatures, sealed}; use bitcoin::bech32::{Base32Len, FromBase32, ToBase32, u5}; use crate::util::ser::{Readable, WithoutLength, Writeable}; @@ -1050,17 +1058,17 @@ mod tests { fn convert_to_context_with_unknown_flags() { // Ensure the `from` context has fewer known feature bytes than the `to` context. assert!(::KNOWN_FEATURE_MASK.len() < - ::KNOWN_FEATURE_MASK.len()); + ::KNOWN_FEATURE_MASK.len()); let mut channel_features = ChannelFeatures::empty(); channel_features.set_unknown_feature_optional(); assert!(channel_features.supports_unknown_bits()); - let invoice_features: InvoiceFeatures = channel_features.to_context_internal(); + let invoice_features: Bolt11InvoiceFeatures = channel_features.to_context_internal(); assert!(!invoice_features.supports_unknown_bits()); } #[test] fn set_feature_bits() { - let mut features = InvoiceFeatures::empty(); + let mut features = Bolt11InvoiceFeatures::empty(); features.set_basic_mpp_optional(); features.set_payment_secret_required(); assert!(features.supports_basic_mpp()); @@ -1071,7 +1079,7 @@ mod tests { #[test] fn set_custom_bits() { - let mut features = InvoiceFeatures::empty(); + let mut features = Bolt11InvoiceFeatures::empty(); features.set_variable_length_onion_optional(); assert_eq!(features.flags[1], 0b00000010); @@ -1081,19 +1089,19 @@ mod tests { assert_eq!(features.flags[31], 0b00000000); assert_eq!(features.flags[32], 0b00000101); - let known_bit = ::EVEN_BIT; - let byte_offset = ::BYTE_OFFSET; + let known_bit = ::EVEN_BIT; + let byte_offset = ::BYTE_OFFSET; assert_eq!(byte_offset, 1); assert_eq!(features.flags[byte_offset], 0b00000010); assert!(features.set_required_custom_bit(known_bit).is_err()); assert_eq!(features.flags[byte_offset], 0b00000010); - let mut features = InvoiceFeatures::empty(); + let mut features = Bolt11InvoiceFeatures::empty(); assert!(features.set_optional_custom_bit(256).is_ok()); assert!(features.set_optional_custom_bit(259).is_ok()); assert_eq!(features.flags[32], 0b00001010); - let mut features = InvoiceFeatures::empty(); + let mut features = Bolt11InvoiceFeatures::empty(); assert!(features.set_required_custom_bit(257).is_ok()); assert!(features.set_required_custom_bit(258).is_ok()); assert_eq!(features.flags[32], 0b00000101); @@ -1130,7 +1138,7 @@ mod tests { u5::try_from_u8(16).unwrap(), u5::try_from_u8(1).unwrap(), ]; - let features = InvoiceFeatures::from_le_bytes(vec![1, 2, 3, 4, 5, 42, 100, 101]); + let features = Bolt11InvoiceFeatures::from_le_bytes(vec![1, 2, 3, 4, 5, 42, 100, 101]); // Test length calculation. assert_eq!(features.base32_len(), 13); @@ -1140,13 +1148,13 @@ mod tests { assert_eq!(features_as_u5s, features_serialized); // Test deserialization. - let features_deserialized = InvoiceFeatures::from_base32(&features_as_u5s).unwrap(); + let features_deserialized = Bolt11InvoiceFeatures::from_base32(&features_as_u5s).unwrap(); assert_eq!(features, features_deserialized); } #[test] fn test_channel_type_mapping() { - // If we map an InvoiceFeatures with StaticRemoteKey optional, it should map into a + // If we map an Bolt11InvoiceFeatures with StaticRemoteKey optional, it should map into a // required-StaticRemoteKey ChannelTypeFeatures. let mut init_features = InitFeatures::empty(); init_features.set_static_remote_key_optional();