Skip to content

Commit de16f74

Browse files
committed
Allow Explicit Specification of Blinded Path Type in Refund
Similar to the offer case, this commit introduces the ability to explicitly specify the Blinded Path type.
1 parent 8d0ba4a commit de16f74

File tree

2 files changed

+58
-44
lines changed

2 files changed

+58
-44
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1830,16 +1830,18 @@ where
18301830
/// # use lightning::events::{Event, EventsProvider};
18311831
/// # use lightning::ln::channelmanager::{AChannelManager, PaymentId, RecentPaymentDetails, Retry};
18321832
/// # use lightning::offers::parse::Bolt12SemanticError;
1833+
/// # use lightning::onion_message::messenger::BlindedPathType;
18331834
/// #
18341835
/// # fn example<T: AChannelManager>(
18351836
/// # channel_manager: T, amount_msats: u64, absolute_expiry: Duration, retry: Retry,
18361837
/// # max_total_routing_fee_msat: Option<u64>
18371838
/// # ) -> Result<(), Bolt12SemanticError> {
18381839
/// # let channel_manager = channel_manager.get_cm();
18391840
/// let payment_id = PaymentId([42; 32]);
1841+
/// let blinded_path = Some(BlindedPathType::Full);
18401842
/// let refund = channel_manager
18411843
/// .create_refund_builder(
1842-
/// amount_msats, absolute_expiry, payment_id, retry, max_total_routing_fee_msat
1844+
/// amount_msats, absolute_expiry, payment_id, retry, max_total_routing_fee_msat, blinded_path
18431845
/// )?
18441846
/// # ;
18451847
/// # // Needed for compiling for c_bindings
@@ -8957,7 +8959,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
89578959
/// [Avoiding Duplicate Payments]: #avoiding-duplicate-payments
89588960
pub fn create_refund_builder(
89598961
&$self, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId,
8960-
retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>
8962+
retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>, blinded_path: Option<BlindedPathType>
89618963
) -> Result<$builder, Bolt12SemanticError> {
89628964
let node_id = $self.get_our_node_id();
89638965
let expanded_key = &$self.inbound_payment_key;
@@ -8966,16 +8968,46 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
89668968

89678969
let nonce = Nonce::from_entropy_source(entropy);
89688970
let context = OffersContext::OutboundPayment { payment_id, nonce, hmac: None };
8969-
let path = $self.create_blinded_paths_using_absolute_expiry(context, Some(absolute_expiry))
8970-
.and_then(|paths| paths.into_iter().next().ok_or(()))
8971-
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
89728971

8973-
let builder = RefundBuilder::deriving_payer_id(
8974-
node_id, expanded_key, nonce, secp_ctx, amount_msats, payment_id
8975-
)?
8972+
let builder = match blinded_path {
8973+
Some(BlindedPathType::Compact) => {
8974+
let path = $self
8975+
.create_compact_blinded_paths(context)
8976+
.and_then(|paths| paths.into_iter().next().ok_or(()))
8977+
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
8978+
8979+
RefundBuilder::deriving_payer_id(
8980+
node_id, expanded_key, nonce, secp_ctx,
8981+
amount_msats, payment_id,
8982+
)?
8983+
.chain_hash($self.chain_hash)
8984+
.absolute_expiry(absolute_expiry)
8985+
.path(path)
8986+
}
8987+
8988+
Some(BlindedPathType::Full) => {
8989+
let path = $self
8990+
.create_blinded_paths(context)
8991+
.and_then(|paths| paths.into_iter().next().ok_or(()))
8992+
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
8993+
8994+
RefundBuilder::deriving_payer_id(
8995+
node_id, expanded_key, nonce, secp_ctx,
8996+
amount_msats, payment_id,
8997+
)?
8998+
.chain_hash($self.chain_hash)
8999+
.absolute_expiry(absolute_expiry)
9000+
.path(path)
9001+
}
9002+
9003+
None => RefundBuilder::deriving_payer_id(
9004+
node_id, expanded_key, nonce, secp_ctx,
9005+
amount_msats, payment_id,
9006+
)?
89769007
.chain_hash($self.chain_hash)
89779008
.absolute_expiry(absolute_expiry)
8978-
.path(path);
9009+
.absolute_expiry(absolute_expiry),
9010+
};
89799011

89809012
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop($self);
89819013

@@ -9341,25 +9373,7 @@ where
93419373
inbound_payment::get_payment_preimage(payment_hash, payment_secret, &self.inbound_payment_key)
93429374
}
93439375

9344-
/// Creates a collection of blinded paths by delegating to [`MessageRouter`] based on
9345-
/// the path's intended lifetime.
9346-
///
9347-
/// Whether or not the path is compact depends on whether the path is short-lived or long-lived,
9348-
/// respectively, based on the given `absolute_expiry` as seconds since the Unix epoch. See
9349-
/// [`MAX_SHORT_LIVED_RELATIVE_EXPIRY`].
9350-
fn create_blinded_paths_using_absolute_expiry(
9351-
&self, context: OffersContext, absolute_expiry: Option<Duration>,
9352-
) -> Result<Vec<BlindedMessagePath>, ()> {
9353-
let now = self.duration_since_epoch();
9354-
let max_short_lived_absolute_expiry = now.saturating_add(MAX_SHORT_LIVED_RELATIVE_EXPIRY);
9355-
9356-
if absolute_expiry.unwrap_or(Duration::MAX) <= max_short_lived_absolute_expiry {
9357-
self.create_compact_blinded_paths(context)
9358-
} else {
9359-
self.create_blinded_paths(context)
9360-
}
9361-
}
9362-
9376+
#[cfg(test)]
93639377
pub(super) fn duration_since_epoch(&self) -> Duration {
93649378
#[cfg(not(feature = "std"))]
93659379
let now = Duration::from_secs(

lightning/src/ln/offers_tests.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ fn creates_short_lived_refund() {
459459
let absolute_expiry = bob.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY;
460460
let payment_id = PaymentId([1; 32]);
461461
let refund = bob.node
462-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
462+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Compact))
463463
.unwrap()
464464
.build().unwrap();
465465
assert_eq!(refund.absolute_expiry(), Some(absolute_expiry));
@@ -488,7 +488,7 @@ fn creates_long_lived_refund() {
488488
+ Duration::from_secs(1);
489489
let payment_id = PaymentId([1; 32]);
490490
let refund = bob.node
491-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
491+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
492492
.unwrap()
493493
.build().unwrap();
494494
assert_eq!(refund.absolute_expiry(), Some(absolute_expiry));
@@ -637,7 +637,7 @@ fn creates_and_pays_for_refund_using_two_hop_blinded_path() {
637637
let absolute_expiry = Duration::from_secs(u64::MAX);
638638
let payment_id = PaymentId([1; 32]);
639639
let refund = david.node
640-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
640+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
641641
.unwrap()
642642
.build().unwrap();
643643
assert_eq!(refund.amount_msats(), 10_000_000);
@@ -762,7 +762,7 @@ fn creates_and_pays_for_refund_using_one_hop_blinded_path() {
762762
let absolute_expiry = Duration::from_secs(u64::MAX);
763763
let payment_id = PaymentId([1; 32]);
764764
let refund = bob.node
765-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
765+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
766766
.unwrap()
767767
.build().unwrap();
768768
assert_eq!(refund.amount_msats(), 10_000_000);
@@ -869,7 +869,7 @@ fn pays_for_refund_without_blinded_paths() {
869869
let absolute_expiry = Duration::from_secs(u64::MAX);
870870
let payment_id = PaymentId([1; 32]);
871871
let refund = bob.node
872-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
872+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
873873
.unwrap()
874874
.clear_paths()
875875
.build().unwrap();
@@ -1024,7 +1024,7 @@ fn send_invoice_for_refund_with_distinct_reply_path() {
10241024
let absolute_expiry = Duration::from_secs(u64::MAX);
10251025
let payment_id = PaymentId([1; 32]);
10261026
let refund = alice.node
1027-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1027+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
10281028
.unwrap()
10291029
.build().unwrap();
10301030
assert_ne!(refund.payer_id(), alice_id);
@@ -1226,7 +1226,7 @@ fn creates_refund_with_blinded_path_using_unannounced_introduction_node() {
12261226
let absolute_expiry = Duration::from_secs(u64::MAX);
12271227
let payment_id = PaymentId([1; 32]);
12281228
let refund = bob.node
1229-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1229+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
12301230
.unwrap()
12311231
.build().unwrap();
12321232
assert_ne!(refund.payer_id(), bob_id);
@@ -1509,7 +1509,7 @@ fn fails_authentication_when_handling_invoice_for_refund() {
15091509
let absolute_expiry = Duration::from_secs(u64::MAX);
15101510
let payment_id = PaymentId([1; 32]);
15111511
let refund = david.node
1512-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1512+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
15131513
.unwrap()
15141514
.build().unwrap();
15151515
assert_ne!(refund.payer_id(), david_id);
@@ -1543,7 +1543,7 @@ fn fails_authentication_when_handling_invoice_for_refund() {
15431543
let invalid_path = refund.paths().first().unwrap().clone();
15441544
let payment_id = PaymentId([2; 32]);
15451545
let refund = david.node
1546-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1546+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
15471547
.unwrap()
15481548
.build().unwrap();
15491549
assert_ne!(refund.payer_id(), david_id);
@@ -1671,7 +1671,7 @@ fn fails_creating_refund_or_sending_invoice_without_connected_peers() {
16711671
let absolute_expiry = david.node.duration_since_epoch() + MAX_SHORT_LIVED_RELATIVE_EXPIRY;
16721672
let payment_id = PaymentId([1; 32]);
16731673
match david.node.create_refund_builder(
1674-
10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None
1674+
10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full)
16751675
) {
16761676
Ok(_) => panic!("Expected error"),
16771677
Err(e) => assert_eq!(e, Bolt12SemanticError::MissingPaths),
@@ -1682,7 +1682,7 @@ fn fails_creating_refund_or_sending_invoice_without_connected_peers() {
16821682
reconnect_nodes(args);
16831683

16841684
let refund = david.node
1685-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1685+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
16861686
.unwrap()
16871687
.build().unwrap();
16881688

@@ -1740,7 +1740,7 @@ fn fails_sending_invoice_with_unsupported_chain_for_refund() {
17401740
let absolute_expiry = Duration::from_secs(u64::MAX);
17411741
let payment_id = PaymentId([1; 32]);
17421742
let refund = bob.node
1743-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1743+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
17441744
.unwrap()
17451745
.chain(Network::Signet)
17461746
.build().unwrap();
@@ -1838,13 +1838,13 @@ fn fails_creating_refund_with_duplicate_payment_id() {
18381838
let payment_id = PaymentId([1; 32]);
18391839
assert!(
18401840
nodes[0].node.create_refund_builder(
1841-
10_000, absolute_expiry, payment_id, Retry::Attempts(0), None
1841+
10_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full)
18421842
).is_ok()
18431843
);
18441844
expect_recent_payment!(nodes[0], RecentPaymentDetails::AwaitingInvoice, payment_id);
18451845

18461846
match nodes[0].node.create_refund_builder(
1847-
10_000, absolute_expiry, payment_id, Retry::Attempts(0), None
1847+
10_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full)
18481848
) {
18491849
Ok(_) => panic!("Expected error"),
18501850
Err(e) => assert_eq!(e, Bolt12SemanticError::DuplicatePaymentId),
@@ -1964,7 +1964,7 @@ fn fails_sending_invoice_without_blinded_payment_paths_for_refund() {
19641964
let absolute_expiry = Duration::from_secs(u64::MAX);
19651965
let payment_id = PaymentId([1; 32]);
19661966
let refund = david.node
1967-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
1967+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
19681968
.unwrap()
19691969
.build().unwrap();
19701970

@@ -2013,7 +2013,7 @@ fn fails_paying_invoice_more_than_once() {
20132013
let absolute_expiry = Duration::from_secs(u64::MAX);
20142014
let payment_id = PaymentId([1; 32]);
20152015
let refund = david.node
2016-
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None)
2016+
.create_refund_builder(10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None, Some(BlindedPathType::Full))
20172017
.unwrap()
20182018
.build().unwrap();
20192019
expect_recent_payment!(david, RecentPaymentDetails::AwaitingInvoice, payment_id);

0 commit comments

Comments
 (0)