Skip to content

Commit 258b301

Browse files
committed
Allow explicit specification of Blinded Path type in create_offer_builder
1. This commit introduces flexibility for the user to specify the type of Blinded Path they want, rather than relying on the Offers' absolute expiry to determine the Blinded Path type. 2. It also adds support for creating an Offer without a Blinded Path, using its signing public key for responding to the offer instead.
1 parent 2c80391 commit 258b301

File tree

2 files changed

+43
-38
lines changed

2 files changed

+43
-38
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1872,14 +1872,14 @@ where
18721872
///
18731873
/// ```
18741874
/// # use lightning::events::{Event, EventsProvider, PaymentPurpose};
1875-
/// # use lightning::ln::channelmanager::AChannelManager;
1875+
/// # use lightning::ln::channelmanager::{AChannelManager, BlindedPathType};
18761876
/// # use lightning::offers::parse::Bolt12SemanticError;
18771877
/// #
18781878
/// # fn example<T: AChannelManager>(channel_manager: T) -> Result<(), Bolt12SemanticError> {
18791879
/// # let channel_manager = channel_manager.get_cm();
1880-
/// # let absolute_expiry = None;
1880+
/// # let blinded_path = BlindedPathType::Full;
18811881
/// let offer = channel_manager
1882-
/// .create_offer_builder(absolute_expiry)?
1882+
/// .create_offer_builder(Some(blinded_path))?
18831883
/// # ;
18841884
/// # // Needed for compiling for c_bindings
18851885
/// # let builder: lightning::offers::offer::OfferBuilder<_, _> = offer.into();
@@ -9140,7 +9140,7 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => {
91409140
/// [`Offer`]: crate::offers::offer::Offer
91419141
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
91429142
pub fn create_offer_builder(
9143-
&$self, absolute_expiry: Option<Duration>
9143+
&$self, blinded_path: Option<BlindedPathType>,
91449144
) -> Result<$builder, Bolt12SemanticError> {
91459145
let node_id = $self.get_our_node_id();
91469146
let expanded_key = &$self.inbound_payment_key;
@@ -9149,17 +9149,20 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => {
91499149

91509150
let nonce = Nonce::from_entropy_source(entropy);
91519151
let context = OffersContext::InvoiceRequest { nonce };
9152-
let path = $self.create_blinded_paths_using_absolute_expiry(context, absolute_expiry)
9152+
9153+
let builder = OfferBuilder::deriving_signing_pubkey(node_id, expanded_key, nonce, secp_ctx)
9154+
.chain_hash($self.chain_hash);
9155+
9156+
if let Some(path_type) = blinded_path {
9157+
let path = match path_type {
9158+
BlindedPathType::Compact => $self.create_compact_blinded_paths(context),
9159+
BlindedPathType::Full => $self.create_blinded_paths(MessageContext::Offers(context)),
9160+
}
91539161
.and_then(|paths| paths.into_iter().next().ok_or(()))
91549162
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
9155-
let builder = OfferBuilder::deriving_signing_pubkey(node_id, expanded_key, nonce, secp_ctx)
9156-
.chain_hash($self.chain_hash)
9157-
.path(path);
91589163

9159-
let builder = match absolute_expiry {
9160-
None => builder,
9161-
Some(absolute_expiry) => builder.absolute_expiry(absolute_expiry),
9162-
};
9164+
return Ok(builder.path(path));
9165+
}
91639166

91649167
Ok(builder.into())
91659168
}

lightning/src/ln/offers_tests.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use crate::blinded_path::message::BlindedMessagePath;
4848
use crate::blinded_path::payment::{Bolt12OfferContext, Bolt12RefundContext, PaymentContext};
4949
use crate::blinded_path::message::{MessageContext, OffersContext};
5050
use crate::events::{ClosureReason, Event, MessageSendEventsProvider, PaymentFailureReason, PaymentPurpose};
51-
use crate::ln::channelmanager::{Bolt12PaymentError, MAX_SHORT_LIVED_RELATIVE_EXPIRY, PaymentId, RecentPaymentDetails, Retry, self};
51+
use crate::ln::channelmanager::{BlindedPathType, Bolt12PaymentError, MAX_SHORT_LIVED_RELATIVE_EXPIRY, PaymentId, RecentPaymentDetails, Retry, self};
5252
use crate::ln::features::Bolt12InvoiceFeatures;
5353
use crate::ln::functional_test_utils::*;
5454
use crate::ln::inbound_payment::ExpandedKey;
@@ -59,7 +59,7 @@ use crate::offers::invoice_error::InvoiceError;
5959
use crate::offers::invoice_request::{InvoiceRequest, InvoiceRequestFields};
6060
use crate::offers::nonce::Nonce;
6161
use crate::offers::parse::Bolt12SemanticError;
62-
use crate::onion_message::messenger::{Destination, PeeledOnion, MessageSendInstructions};
62+
use crate::onion_message::messenger::{Destination, MessageSendInstructions, PeeledOnion};
6363
use crate::onion_message::offers::OffersMessage;
6464
use crate::onion_message::packet::ParsedOnionMessageContents;
6565
use crate::routing::gossip::{NodeAlias, NodeId};
@@ -297,7 +297,7 @@ fn prefers_non_tor_nodes_in_blinded_paths() {
297297
announce_node_address(charlie, &[alice, bob, david, &nodes[4], &nodes[5]], tor.clone());
298298

299299
let offer = bob.node
300-
.create_offer_builder(None).unwrap()
300+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
301301
.amount_msats(10_000_000)
302302
.build().unwrap();
303303
assert_ne!(offer.issuer_signing_pubkey(), Some(bob_id));
@@ -313,7 +313,7 @@ fn prefers_non_tor_nodes_in_blinded_paths() {
313313
announce_node_address(&nodes[5], &[alice, bob, charlie, david, &nodes[4]], tor.clone());
314314

315315
let offer = bob.node
316-
.create_offer_builder(None).unwrap()
316+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
317317
.amount_msats(10_000_000)
318318
.build().unwrap();
319319
assert_ne!(offer.issuer_signing_pubkey(), Some(bob_id));
@@ -364,7 +364,7 @@ fn prefers_more_connected_nodes_in_blinded_paths() {
364364
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
365365

366366
let offer = bob.node
367-
.create_offer_builder(None).unwrap()
367+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
368368
.amount_msats(10_000_000)
369369
.build().unwrap();
370370
assert_ne!(offer.issuer_signing_pubkey(), Some(bob_id));
@@ -391,7 +391,8 @@ fn creates_short_lived_offer() {
391391

392392
let absolute_expiry = alice.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY;
393393
let offer = alice.node
394-
.create_offer_builder(Some(absolute_expiry)).unwrap()
394+
.create_offer_builder(Some(BlindedPathType::Compact)).unwrap()
395+
.absolute_expiry(absolute_expiry)
395396
.build().unwrap();
396397
assert_eq!(offer.absolute_expiry(), Some(absolute_expiry));
397398
assert!(!offer.paths().is_empty());
@@ -418,8 +419,8 @@ fn creates_long_lived_offer() {
418419
let absolute_expiry = alice.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY
419420
+ Duration::from_secs(1);
420421
let offer = alice.node
421-
.create_offer_builder(Some(absolute_expiry))
422-
.unwrap()
422+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
423+
.absolute_expiry(absolute_expiry)
423424
.build().unwrap();
424425
assert_eq!(offer.absolute_expiry(), Some(absolute_expiry));
425426
assert!(!offer.paths().is_empty());
@@ -428,7 +429,7 @@ fn creates_long_lived_offer() {
428429
}
429430

430431
let offer = alice.node
431-
.create_offer_builder(None).unwrap()
432+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
432433
.build().unwrap();
433434
assert_eq!(offer.absolute_expiry(), None);
434435
assert!(!offer.paths().is_empty());
@@ -532,7 +533,7 @@ fn creates_and_pays_for_offer_using_two_hop_blinded_path() {
532533
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
533534

534535
let offer = alice.node
535-
.create_offer_builder(None)
536+
.create_offer_builder(Some(BlindedPathType::Full))
536537
.unwrap()
537538
.amount_msats(10_000_000)
538539
.build().unwrap();
@@ -701,7 +702,7 @@ fn creates_and_pays_for_offer_using_one_hop_blinded_path() {
701702
let bob_id = bob.node.get_our_node_id();
702703

703704
let offer = alice.node
704-
.create_offer_builder(None).unwrap()
705+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
705706
.amount_msats(10_000_000)
706707
.build().unwrap();
707708
assert_ne!(offer.issuer_signing_pubkey(), Some(alice_id));
@@ -823,7 +824,7 @@ fn pays_for_offer_without_blinded_paths() {
823824
let bob_id = bob.node.get_our_node_id();
824825

825826
let offer = alice.node
826-
.create_offer_builder(None).unwrap()
827+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
827828
.clear_paths()
828829
.amount_msats(10_000_000)
829830
.build().unwrap();
@@ -946,7 +947,7 @@ fn send_invoice_requests_with_distinct_reply_path() {
946947
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
947948

948949
let offer = alice.node
949-
.create_offer_builder(None)
950+
.create_offer_builder(Some(BlindedPathType::Full))
950951
.unwrap()
951952
.amount_msats(10_000_000)
952953
.build().unwrap();
@@ -1082,7 +1083,7 @@ fn creates_and_pays_for_offer_with_retry() {
10821083
let bob_id = bob.node.get_our_node_id();
10831084

10841085
let offer = alice.node
1085-
.create_offer_builder(None).unwrap()
1086+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
10861087
.amount_msats(10_000_000)
10871088
.build().unwrap();
10881089
assert_ne!(offer.issuer_signing_pubkey(), Some(alice_id));
@@ -1157,7 +1158,7 @@ fn pays_bolt12_invoice_asynchronously() {
11571158
let bob_id = bob.node.get_our_node_id();
11581159

11591160
let offer = alice.node
1160-
.create_offer_builder(None).unwrap()
1161+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
11611162
.amount_msats(10_000_000)
11621163
.build().unwrap();
11631164

@@ -1241,7 +1242,7 @@ fn creates_offer_with_blinded_path_using_unannounced_introduction_node() {
12411242
let bob_id = bob.node.get_our_node_id();
12421243

12431244
let offer = alice.node
1244-
.create_offer_builder(None).unwrap()
1245+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
12451246
.amount_msats(10_000_000)
12461247
.build().unwrap();
12471248
assert_ne!(offer.issuer_signing_pubkey(), Some(alice_id));
@@ -1370,7 +1371,7 @@ fn fails_authentication_when_handling_invoice_request() {
13701371
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
13711372

13721373
let offer = alice.node
1373-
.create_offer_builder(None)
1374+
.create_offer_builder(Some(BlindedPathType::Full))
13741375
.unwrap()
13751376
.amount_msats(10_000_000)
13761377
.build().unwrap();
@@ -1382,7 +1383,7 @@ fn fails_authentication_when_handling_invoice_request() {
13821383
}
13831384

13841385
let invalid_path = alice.node
1385-
.create_offer_builder(None)
1386+
.create_offer_builder(Some(BlindedPathType::Full))
13861387
.unwrap()
13871388
.build().unwrap()
13881389
.paths().first().unwrap()
@@ -1482,7 +1483,7 @@ fn fails_authentication_when_handling_invoice_for_offer() {
14821483
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
14831484

14841485
let offer = alice.node
1485-
.create_offer_builder(None)
1486+
.create_offer_builder(Some(BlindedPathType::Full))
14861487
.unwrap()
14871488
.amount_msats(10_000_000)
14881489
.build().unwrap();
@@ -1679,7 +1680,7 @@ fn fails_creating_or_paying_for_offer_without_connected_peers() {
16791680
disconnect_peers(david, &[bob, charlie, &nodes[4], &nodes[5]]);
16801681

16811682
let absolute_expiry = alice.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY;
1682-
match alice.node.create_offer_builder(Some(absolute_expiry)) {
1683+
match alice.node.create_offer_builder(Some(BlindedPathType::Full)) {
16831684
Ok(_) => panic!("Expected error"),
16841685
Err(e) => assert_eq!(e, Bolt12SemanticError::MissingPaths),
16851686
}
@@ -1689,7 +1690,8 @@ fn fails_creating_or_paying_for_offer_without_connected_peers() {
16891690
reconnect_nodes(args);
16901691

16911692
let offer = alice.node
1692-
.create_offer_builder(Some(absolute_expiry)).unwrap()
1693+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
1694+
.absolute_expiry(absolute_expiry)
16931695
.amount_msats(10_000_000)
16941696
.build().unwrap();
16951697

@@ -1793,7 +1795,7 @@ fn fails_creating_invoice_request_for_unsupported_chain() {
17931795
let bob = &nodes[1];
17941796

17951797
let offer = alice.node
1796-
.create_offer_builder(None).unwrap()
1798+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
17971799
.clear_chains()
17981800
.chain(Network::Signet)
17991801
.build().unwrap();
@@ -1852,7 +1854,7 @@ fn fails_creating_invoice_request_without_blinded_reply_path() {
18521854
disconnect_peers(david, &[bob, charlie, &nodes[4], &nodes[5]]);
18531855

18541856
let offer = alice.node
1855-
.create_offer_builder(None).unwrap()
1857+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
18561858
.amount_msats(10_000_000)
18571859
.build().unwrap();
18581860

@@ -1886,7 +1888,7 @@ fn fails_creating_invoice_request_with_duplicate_payment_id() {
18861888
disconnect_peers(alice, &[charlie, david, &nodes[4], &nodes[5]]);
18871889

18881890
let offer = alice.node
1889-
.create_offer_builder(None).unwrap()
1891+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
18901892
.amount_msats(10_000_000)
18911893
.build().unwrap();
18921894

@@ -1972,7 +1974,7 @@ fn fails_sending_invoice_without_blinded_payment_paths_for_offer() {
19721974
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
19731975

19741976
let offer = alice.node
1975-
.create_offer_builder(None).unwrap()
1977+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
19761978
.amount_msats(10_000_000)
19771979
.build().unwrap();
19781980

@@ -2181,7 +2183,7 @@ fn fails_paying_invoice_with_unknown_required_features() {
21812183
disconnect_peers(david, &[bob, &nodes[4], &nodes[5]]);
21822184

21832185
let offer = alice.node
2184-
.create_offer_builder(None).unwrap()
2186+
.create_offer_builder(Some(BlindedPathType::Full)).unwrap()
21852187
.amount_msats(10_000_000)
21862188
.build().unwrap();
21872189

0 commit comments

Comments
 (0)