X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Ffeatures.rs;h=4512ee8002996aced4ba6238c6d7a42233608955;hb=6b8ad4ec33eb4f90395aac21c56c804b0b6c9429;hp=0ccce88e9f5d71743530a441504ac7c18b1da6a2;hpb=b19c56b78a5b4d6dbafbd567a586816595dc427f;p=rust-lightning diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index 0ccce88e..4512ee80 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -143,7 +143,7 @@ mod sealed { // Byte 4 , // Byte 5 - ChannelType, + ChannelType | SCIDPrivacy, ], }); define_context!(NodeContext { @@ -175,7 +175,7 @@ mod sealed { // Byte 4 , // Byte 5 - ChannelType, + ChannelType | SCIDPrivacy, // Byte 6 Keysend, ], @@ -214,6 +214,10 @@ mod sealed { , // Byte 3 , + // Byte 4 + , + // Byte 5 + SCIDPrivacy, ], optional_features: [ // Byte 0 @@ -224,6 +228,10 @@ mod sealed { , // Byte 3 , + // Byte 4 + , + // Byte 5 + , ], }); @@ -318,15 +326,13 @@ mod sealed { impl Features { /// Set this feature as optional. - pub fn $optional_setter(mut self) -> Self { + pub fn $optional_setter(&mut self) { ::set_optional_bit(&mut self.flags); - self } /// Set this feature as required. - pub fn $required_setter(mut self) -> Self { + pub fn $required_setter(&mut self) { ::set_required_bit(&mut self.flags); - self } /// Checks if this feature is supported. @@ -390,6 +396,10 @@ mod sealed { define_feature!(45, ChannelType, [InitContext, NodeContext], "Feature flags for `option_channel_type`.", set_channel_type_optional, set_channel_type_required, supports_channel_type, requires_channel_type); + 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!(55, Keysend, [NodeContext], "Feature flags for keysend payments.", set_keysend_optional, set_keysend_required, supports_keysend, requires_keysend); @@ -506,7 +516,9 @@ impl InvoiceFeatures { /// [`PaymentParameters::for_keysend`]: crate::routing::router::PaymentParameters::for_keysend /// [`find_route`]: crate::routing::router::find_route pub(crate) fn for_keysend() -> InvoiceFeatures { - InvoiceFeatures::empty().set_variable_length_onion_optional() + let mut res = InvoiceFeatures::empty(); + res.set_variable_length_onion_optional(); + res } } @@ -826,6 +838,11 @@ mod tests { assert!(InitFeatures::known().supports_shutdown_anysegwit()); assert!(NodeFeatures::known().supports_shutdown_anysegwit()); + assert!(InitFeatures::known().supports_scid_privacy()); + assert!(NodeFeatures::known().supports_scid_privacy()); + assert!(!InitFeatures::known().requires_scid_privacy()); + assert!(!NodeFeatures::known().requires_scid_privacy()); + let mut init_features = InitFeatures::known(); assert!(init_features.initial_routing_sync()); init_features.clear_initial_routing_sync(); @@ -838,11 +855,13 @@ mod tests { assert!(!features.requires_unknown_bits()); assert!(!features.supports_unknown_bits()); - let features = ChannelFeatures::empty().set_unknown_feature_required(); + let mut features = ChannelFeatures::empty(); + features.set_unknown_feature_required(); assert!(features.requires_unknown_bits()); assert!(features.supports_unknown_bits()); - let features = ChannelFeatures::empty().set_unknown_feature_optional(); + let mut features = ChannelFeatures::empty(); + features.set_unknown_feature_optional(); assert!(!features.requires_unknown_bits()); assert!(features.supports_unknown_bits()); } @@ -862,14 +881,14 @@ mod tests { // - basic_mpp // - opt_shutdown_anysegwit // - - // - option_channel_type + // - option_channel_type | option_scid_alias assert_eq!(node_features.flags.len(), 6); assert_eq!(node_features.flags[0], 0b00000010); assert_eq!(node_features.flags[1], 0b01010001); assert_eq!(node_features.flags[2], 0b00000010); assert_eq!(node_features.flags[3], 0b00001000); assert_eq!(node_features.flags[4], 0b00000000); - assert_eq!(node_features.flags[5], 0b00100000); + assert_eq!(node_features.flags[5], 0b10100000); } // Check that cleared flags are kept blank when converting back: @@ -886,7 +905,8 @@ mod tests { fn convert_to_context_with_unknown_flags() { // Ensure the `from` context has fewer known feature bytes than the `to` context. assert!(InvoiceFeatures::known().flags.len() < NodeFeatures::known().flags.len()); - let invoice_features = InvoiceFeatures::known().set_unknown_feature_optional(); + let mut invoice_features = InvoiceFeatures::known(); + invoice_features.set_unknown_feature_optional(); assert!(invoice_features.supports_unknown_bits()); let node_features: NodeFeatures = invoice_features.to_context(); assert!(!node_features.supports_unknown_bits()); @@ -894,9 +914,9 @@ mod tests { #[test] fn set_feature_bits() { - let features = InvoiceFeatures::empty() - .set_basic_mpp_optional() - .set_payment_secret_required(); + let mut features = InvoiceFeatures::empty(); + features.set_basic_mpp_optional(); + features.set_payment_secret_required(); assert!(features.supports_basic_mpp()); assert!(!features.requires_basic_mpp()); assert!(features.requires_payment_secret()); @@ -938,7 +958,8 @@ mod tests { fn test_channel_type_mapping() { // If we map an InvoiceFeatures with StaticRemoteKey optional, it should map into a // required-StaticRemoteKey ChannelTypeFeatures. - let init_features = InitFeatures::empty().set_static_remote_key_optional(); + let mut init_features = InitFeatures::empty(); + init_features.set_static_remote_key_optional(); let converted_features = ChannelTypeFeatures::from_counterparty_init(&init_features); assert_eq!(converted_features, ChannelTypeFeatures::only_static_remote_key()); assert!(!converted_features.supports_any_optional_bits());