Define blinded hop features for use in BOLT 12
authorJeffrey Czyz <jkczyz@gmail.com>
Fri, 16 Dec 2022 20:06:33 +0000 (14:06 -0600)
committerJeffrey Czyz <jkczyz@gmail.com>
Fri, 6 Jan 2023 04:39:24 +0000 (22:39 -0600)
BOLT 12 invoices may contain blinded_payinfo for each hop in a blinded
path. Each blinded_payinfo contains features, whose length must be
encoded since there may be multiple hops.

Note these features are also needed in the BOLT 4 encrypted_data_tlv
stream. But since they are a single TLV record, the length must *not* be
encoded there.

lightning/src/ln/features.rs

index 4cfe5d8d57d96b960c34690d54d15beabaf483e0..a3c1b7f623d1f2a355516638e75432e61a04fa71 100644 (file)
@@ -167,6 +167,7 @@ mod sealed {
                // Byte 2
                BasicMPP,
        ]);
+       define_context!(BlindedHopContext, []);
        // This isn't a "real" feature context, and is only used in the channel_type field in an
        // `OpenChannel` message.
        define_context!(ChannelTypeContext, [
@@ -377,7 +378,7 @@ mod sealed {
 
        #[cfg(test)]
        define_feature!(123456789, UnknownFeature,
-               [NodeContext, ChannelContext, InvoiceContext, OfferContext, InvoiceRequestContext, Bolt12InvoiceContext],
+               [NodeContext, ChannelContext, InvoiceContext, 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);
 }
@@ -442,6 +443,8 @@ pub type OfferFeatures = Features<sealed::OfferContext>;
 pub type InvoiceRequestFeatures = Features<sealed::InvoiceRequestContext>;
 /// Features used within an `invoice`.
 pub type Bolt12InvoiceFeatures = Features<sealed::Bolt12InvoiceContext>;
+/// Features used within BOLT 4 encrypted_data_tlv and BOLT 12 blinded_payinfo
+pub type BlindedHopFeatures = Features<sealed::BlindedHopContext>;
 
 /// Features used within the channel_type field in an OpenChannel message.
 ///
@@ -729,6 +732,7 @@ 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!(BlindedHopFeatures);
 
 // Some features only appear inside of TLVs, so they don't have a length prefix when serialized.
 macro_rules! impl_feature_tlv_write {