X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Ffeatures.rs;h=775e070ed76798d4082a77e097fb0d770568b3b0;hb=0017bc88a84fa7f253bede430fbb147f6e60c50b;hp=2580874640e438e611bea9b88ddda0384dc9db5d;hpb=132b07239784749dcadfc2959a9487107789df56;p=rust-lightning diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index 25808746..775e070e 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -19,7 +19,7 @@ //! supports a feature if it advertises the feature (as either required or optional) to its peers. //! And the implementation can interpret a feature if the feature is known to it. //! -//! [BOLT #9]: https://github.com/lightningnetwork/lightning-rfc/blob/master/09-features.md +//! [BOLT #9]: https://github.com/lightning/bolts/blob/master/09-features.md //! [messages]: crate::ln::msgs use {io, io_extras}; @@ -130,6 +130,8 @@ mod sealed { , // Byte 5 , + // Byte 6 + , ], optional_features: [ // Byte 0 @@ -144,6 +146,8 @@ mod sealed { , // Byte 5 ChannelType | SCIDPrivacy, + // Byte 6 + ZeroConf, ], }); define_context!(NodeContext { @@ -177,7 +181,7 @@ mod sealed { // Byte 5 ChannelType | SCIDPrivacy, // Byte 6 - Keysend, + ZeroConf | Keysend, ], }); define_context!(ChannelContext { @@ -218,6 +222,8 @@ mod sealed { , // Byte 5 SCIDPrivacy, + // Byte 6 + ZeroConf, ], optional_features: [ // Byte 0 @@ -232,6 +238,8 @@ mod sealed { , // Byte 5 , + // Byte 6 + , ], }); @@ -244,7 +252,7 @@ mod sealed { /// /// See [BOLT #9] for details. /// - /// [BOLT #9]: https://github.com/lightningnetwork/lightning-rfc/blob/master/09-features.md + /// [BOLT #9]: https://github.com/lightning/bolts/blob/master/09-features.md pub trait $feature: Context { /// The bit used to signify that the feature is required. const EVEN_BIT: usize = $odd_bit - 1; @@ -402,7 +410,9 @@ 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!(51, ZeroConf, [InitContext, NodeContext, ChannelTypeContext], + "Feature flags for accepting channels with zero confirmations. Called `option_zeroconf` in the BOLTs", + set_zero_conf_optional, set_zero_conf_required, supports_zero_conf, requires_zero_conf); define_feature!(55, Keysend, [NodeContext], "Feature flags for keysend payments.", set_keysend_optional, set_keysend_required, supports_keysend, requires_keysend); @@ -852,14 +862,23 @@ mod tests { assert!(InitFeatures::known().supports_scid_privacy()); assert!(NodeFeatures::known().supports_scid_privacy()); + assert!(ChannelTypeFeatures::known().supports_scid_privacy()); assert!(!InitFeatures::known().requires_scid_privacy()); assert!(!NodeFeatures::known().requires_scid_privacy()); + assert!(ChannelTypeFeatures::known().requires_scid_privacy()); assert!(InitFeatures::known().supports_wumbo()); assert!(NodeFeatures::known().supports_wumbo()); assert!(!InitFeatures::known().requires_wumbo()); assert!(!NodeFeatures::known().requires_wumbo()); + assert!(InitFeatures::known().supports_zero_conf()); + assert!(!InitFeatures::known().requires_zero_conf()); + assert!(NodeFeatures::known().supports_zero_conf()); + assert!(!NodeFeatures::known().requires_zero_conf()); + assert!(ChannelTypeFeatures::known().supports_zero_conf()); + assert!(ChannelTypeFeatures::known().requires_zero_conf()); + let mut init_features = InitFeatures::known(); assert!(init_features.initial_routing_sync()); init_features.clear_initial_routing_sync(); @@ -899,13 +918,15 @@ mod tests { // - opt_shutdown_anysegwit // - // - option_channel_type | option_scid_alias - assert_eq!(node_features.flags.len(), 6); + // - option_zeroconf + assert_eq!(node_features.flags.len(), 7); assert_eq!(node_features.flags[0], 0b00000010); assert_eq!(node_features.flags[1], 0b01010001); assert_eq!(node_features.flags[2], 0b00001010); assert_eq!(node_features.flags[3], 0b00001000); assert_eq!(node_features.flags[4], 0b00000000); assert_eq!(node_features.flags[5], 0b10100000); + assert_eq!(node_features.flags[6], 0b00001000); } // Check that cleared flags are kept blank when converting back: