Skip to content

Commit 7bf0469

Browse files
committed
Include a one-hop blinded path in Offer and Refund
While this doesn't add much privacy over not including any blinded paths, it allows us to exercise code for receiving on blinded paths.
1 parent 1059231 commit 7bf0469

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

lightning/src/blinded_path/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pub struct BlindedHop {
5757

5858
impl BlindedPath {
5959
/// Create a one-hop blinded path for a message.
60-
pub fn one_hop_for_message<ES: EntropySource, T: secp256k1::Signing + secp256k1::Verification>(
60+
pub fn one_hop_for_message<ES: EntropySource + ?Sized, T: secp256k1::Signing + secp256k1::Verification>(
6161
recipient_node_id: PublicKey, entropy_source: &ES, secp_ctx: &Secp256k1<T>
6262
) -> Result<Self, ()> {
6363
Self::new_for_message(&[recipient_node_id], entropy_source, secp_ctx)
@@ -68,7 +68,7 @@ impl BlindedPath {
6868
///
6969
/// Errors if no hops are provided or if `node_pk`(s) are invalid.
7070
// TODO: make all payloads the same size with padding + add dummy hops
71-
pub fn new_for_message<ES: EntropySource, T: secp256k1::Signing + secp256k1::Verification>(
71+
pub fn new_for_message<ES: EntropySource + ?Sized, T: secp256k1::Signing + secp256k1::Verification>(
7272
node_pks: &[PublicKey], entropy_source: &ES, secp_ctx: &Secp256k1<T>
7373
) -> Result<Self, ()> {
7474
if node_pks.is_empty() { return Err(()) }

lightning/src/ln/channelmanager.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use bitcoin::secp256k1::{SecretKey,PublicKey};
3030
use bitcoin::secp256k1::Secp256k1;
3131
use bitcoin::{LockTime, secp256k1, Sequence};
3232

33+
use crate::blinded_path::BlindedPath;
3334
use crate::chain;
3435
use crate::chain::{Confirm, ChannelMonitorUpdateStatus, Watch, BestBlock};
3536
use crate::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator, LowerBoundedFeeEstimator};
@@ -7093,6 +7094,11 @@ where
70937094
/// [`ChannelManager`] when handling [`InvoiceRequest`] messages for the offer. The offer will
70947095
/// not have an expiration unless otherwise set on the builder.
70957096
///
7097+
/// Uses a one-hop [`BlindedPath`] for the offer with [`ChannelManager::get_our_node_id`] as the
7098+
/// introduction node and a derived signing pubkey for recipient privacy. As such, currently,
7099+
/// the node must be announced. Otherwise, there is no way to find a path to the introduction
7100+
/// node in order to send the [`InvoiceRequest`].
7101+
///
70967102
/// [`Offer`]: crate::offers::offer::Offer
70977103
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
70987104
pub fn create_offer_builder(
@@ -7102,10 +7108,11 @@ where
71027108
let expanded_key = &self.inbound_payment_key;
71037109
let entropy = &*self.entropy_source;
71047110
let secp_ctx = &self.secp_ctx;
7111+
let path = self.create_one_hop_blinded_path();
71057112

7106-
// TODO: Set blinded paths
71077113
OfferBuilder::deriving_signing_pubkey(description, node_id, expanded_key, entropy, secp_ctx)
71087114
.chain_hash(self.chain_hash)
7115+
.path(path)
71097116
}
71107117

71117118
/// Creates a [`RefundBuilder`] such that the [`Refund`] it builds is recognized by the
@@ -7115,6 +7122,11 @@ where
71157122
///
71167123
/// The provided `payment_id` is used to ensure that only one invoice is paid for the refund.
71177124
///
7125+
/// Uses a one-hop [`BlindedPath`] for the refund with [`ChannelManager::get_our_node_id`] as
7126+
/// the introduction node and a derived payer id for sender privacy. As such, currently, the
7127+
/// node must be announced. Otherwise, there is no way to find a path to the introduction node
7128+
/// in order to send the [`Bolt12Invoice`].
7129+
///
71187130
/// [`Refund`]: crate::offers::refund::Refund
71197131
/// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
71207132
pub fn create_refund_builder(
@@ -7125,13 +7137,14 @@ where
71257137
let expanded_key = &self.inbound_payment_key;
71267138
let entropy = &*self.entropy_source;
71277139
let secp_ctx = &self.secp_ctx;
7140+
let path = self.create_one_hop_blinded_path();
71287141

7129-
// TODO: Set blinded paths
71307142
let builder = RefundBuilder::deriving_payer_id(
71317143
description, node_id, expanded_key, entropy, secp_ctx, amount_msats, payment_id
71327144
)?
71337145
.chain_hash(self.chain_hash)
7134-
.absolute_expiry(absolute_expiry);
7146+
.absolute_expiry(absolute_expiry)
7147+
.path(path);
71357148

71367149
self.pending_outbound_payments
71377150
.add_new_awaiting_invoice(
@@ -7242,6 +7255,14 @@ where
72427255
inbound_payment::get_payment_preimage(payment_hash, payment_secret, &self.inbound_payment_key)
72437256
}
72447257

7258+
/// Creates a one-hop blinded path with [`ChannelManager::get_our_node_id`] as the introduction
7259+
/// node.
7260+
fn create_one_hop_blinded_path(&self) -> BlindedPath {
7261+
let entropy_source = self.entropy_source.deref();
7262+
let secp_ctx = &self.secp_ctx;
7263+
BlindedPath::one_hop_for_message(self.get_our_node_id(), entropy_source, secp_ctx).unwrap()
7264+
}
7265+
72457266
/// Gets a fake short channel id for use in receiving [phantom node payments]. These fake scids
72467267
/// are used when constructing the phantom invoice's route hints.
72477268
///

lightning/src/routing/router.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ pub trait Router {
9090
&self, payer: &PublicKey, route_params: &RouteParameters,
9191
first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs
9292
) -> Result<Route, LightningError>;
93+
9394
/// Finds a [`Route`] for a payment between the given `payer` and a payee.
9495
///
9596
/// The `payee` and the payment's value are given in [`RouteParameters::payment_params`]

0 commit comments

Comments
 (0)