Skip to content

Commit d343ea5

Browse files
Support including invreqs when building onion payloads
Add a new invoice request parameter to onion_utils::build_onion_payloads. As of this commit it will always be passed in as None, to be updated in future commits. Per <lightning/bolts#1149>, when paying a static invoice we need to include our original invoice request in the HTLC onion since the recipient wouldn't have received it previously.
1 parent ed2f26e commit d343ea5

6 files changed

+23
-17
lines changed

lightning/src/ln/blinded_payment_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ fn do_forward_checks_failure(check: ForwardCheckFail, intro_fails: bool) {
317317
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
318318
let cur_height = nodes[0].best_block_info().1;
319319
let (mut onion_payloads, ..) = onion_utils::build_onion_payloads(
320-
&route.paths[0], amt_msat, &recipient_onion_fields, cur_height, &None).unwrap();
320+
&route.paths[0], amt_msat, &recipient_onion_fields, cur_height, &None, None).unwrap();
321321
// Remove the receive payload so the blinded forward payload is encoded as a final payload
322322
// (i.e. next_hop_hmac == [0; 32])
323323
onion_payloads.pop();
@@ -896,7 +896,7 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
896896
let cur_height = nodes[0].best_block_info().1;
897897
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
898898
let (mut onion_payloads, ..) = onion_utils::build_onion_payloads(
899-
&route.paths[0], amt_msat, &recipient_onion_fields, cur_height, &None).unwrap();
899+
&route.paths[0], amt_msat, &recipient_onion_fields, cur_height, &None, None).unwrap();
900900

901901
let update_add = &mut payment_event_1_2.msgs[0];
902902
onion_payloads.last_mut().map(|p| {

lightning/src/ln/functional_tests.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,7 +1437,7 @@ fn test_fee_spike_violation_fails_htlc() {
14371437
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
14381438
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
14391439
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
1440-
3460001, &recipient_onion_fields, cur_height, &None).unwrap();
1440+
3460001, &recipient_onion_fields, cur_height, &None, None).unwrap();
14411441
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
14421442
let msg = msgs::UpdateAddHTLC {
14431443
channel_id: chan.2,
@@ -1636,7 +1636,7 @@ fn test_chan_reserve_violation_inbound_htlc_outbound_channel() {
16361636
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
16371637
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
16381638
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
1639-
700_000, &recipient_onion_fields, cur_height, &None).unwrap();
1639+
700_000, &recipient_onion_fields, cur_height, &None, None).unwrap();
16401640
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
16411641
let msg = msgs::UpdateAddHTLC {
16421642
channel_id: chan.2,
@@ -1816,7 +1816,7 @@ fn test_chan_reserve_violation_inbound_htlc_inbound_chan() {
18161816
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route_2.paths[0], &session_priv).unwrap();
18171817
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
18181818
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
1819-
&route_2.paths[0], recv_value_2, &recipient_onion_fields, cur_height, &None).unwrap();
1819+
&route_2.paths[0], recv_value_2, &recipient_onion_fields, cur_height, &None, None).unwrap();
18201820
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash_1).unwrap();
18211821
let msg = msgs::UpdateAddHTLC {
18221822
channel_id: chan.2,
@@ -3546,7 +3546,7 @@ fn fail_backward_pending_htlc_upon_channel_failure() {
35463546
let current_height = nodes[1].node.best_block.read().unwrap().height + 1;
35473547
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
35483548
let (onion_payloads, _amount_msat, cltv_expiry) = onion_utils::build_onion_payloads(
3549-
&route.paths[0], 50_000, &recipient_onion_fields, current_height, &None).unwrap();
3549+
&route.paths[0], 50_000, &recipient_onion_fields, current_height, &None, None).unwrap();
35503550
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
35513551
let onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
35523552

@@ -6538,7 +6538,7 @@ fn test_update_add_htlc_bolt2_receiver_check_max_htlc_limit() {
65386538
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::signing_only(), &route.paths[0], &session_priv).unwrap();
65396539
let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
65406540
let (onion_payloads, _htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
6541-
&route.paths[0], send_amt, &recipient_onion_fields, cur_height, &None).unwrap();
6541+
&route.paths[0], send_amt, &recipient_onion_fields, cur_height, &None, None).unwrap();
65426542
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash).unwrap();
65436543

65446544
let mut msg = msgs::UpdateAddHTLC {
@@ -8281,7 +8281,7 @@ fn test_onion_value_mpp_set_calculation() {
82818281
let mut onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
82828282
let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
82838283
let (mut onion_payloads, _, _) = onion_utils::build_onion_payloads(&route.paths[0], 100_000,
8284-
&recipient_onion_fields, height + 1, &None).unwrap();
8284+
&recipient_onion_fields, height + 1, &None, None).unwrap();
82858285
// Edit amt_to_forward to simulate the sender having set
82868286
// the final amount and the routing node taking less fee
82878287
if let msgs::OutboundOnionPayload::Receive {

lightning/src/ln/max_payment_path_len_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ fn blinded_path_with_custom_tlv() {
276276
let reserved_packet_bytes_without_custom_tlv: usize = onion_utils::build_onion_payloads(
277277
&route.paths[0], MIN_FINAL_VALUE_ESTIMATE_WITH_OVERPAY,
278278
&RecipientOnionFields::spontaneous_empty(),
279-
nodes[0].best_block_info().1 + DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA, &None
279+
nodes[0].best_block_info().1 + DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA, &None, None
280280
)
281281
.unwrap()
282282
.0

lightning/src/ln/onion_payment.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ mod tests {
540540
let path = Path { hops, blinded_tail: None, };
541541
let onion_keys = super::onion_utils::construct_onion_keys(&secp_ctx, &path, &session_priv).unwrap();
542542
let (onion_payloads, ..) = super::onion_utils::build_onion_payloads(
543-
&path, total_amt_msat, &recipient_onion, cur_height + 1, &Some(keysend_preimage)
543+
&path, total_amt_msat, &recipient_onion, cur_height + 1, &Some(keysend_preimage), None
544544
).unwrap();
545545

546546
assert!(super::onion_utils::construct_onion_packet(

lightning/src/ln/onion_route_tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ fn test_onion_failure() {
356356
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
357357
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
358358
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
359-
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
359+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None, None).unwrap();
360360
let mut new_payloads = Vec::new();
361361
for payload in onion_payloads.drain(..) {
362362
new_payloads.push(BogusOnionHopData::new(payload));
@@ -375,7 +375,7 @@ fn test_onion_failure() {
375375
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
376376
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
377377
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
378-
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
378+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None, None).unwrap();
379379
let mut new_payloads = Vec::new();
380380
for payload in onion_payloads.drain(..) {
381381
new_payloads.push(BogusOnionHopData::new(payload));
@@ -627,7 +627,7 @@ fn test_onion_failure() {
627627
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
628628
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
629629
let (onion_payloads, _, htlc_cltv) = onion_utils::build_onion_payloads(
630-
&route.paths[0], 40000, &recipient_onion_fields, height, &None).unwrap();
630+
&route.paths[0], 40000, &recipient_onion_fields, height, &None, None).unwrap();
631631
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
632632
msg.cltv_expiry = htlc_cltv;
633633
msg.onion_routing_packet = onion_packet;
@@ -964,7 +964,7 @@ fn test_always_create_tlv_format_onion_payloads() {
964964
let cur_height = nodes[0].best_block_info().1 + 1;
965965
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
966966
let (onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
967-
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
967+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None, None).unwrap();
968968

969969
match onion_payloads[0] {
970970
msgs::OutboundOnionPayload::Forward {..} => {},
@@ -1221,7 +1221,7 @@ fn test_phantom_invalid_onion_payload() {
12211221
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
12221222
let (mut onion_payloads, _, _) = onion_utils::build_onion_payloads(
12231223
&route.paths[0], msgs::MAX_VALUE_MSAT + 1,
1224-
&recipient_onion_fields, height + 1, &None).unwrap();
1224+
&recipient_onion_fields, height + 1, &None, None).unwrap();
12251225
// We only want to construct the onion packet for the last hop, not the entire route, so
12261226
// remove the first hop's payload and its keys.
12271227
onion_keys.remove(0);

lightning/src/ln/onion_utils.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use crate::ln::channelmanager::{HTLCSource, RecipientOnionFields};
1515
use crate::ln::features::{ChannelFeatures, NodeFeatures};
1616
use crate::ln::msgs;
1717
use crate::ln::types::{PaymentHash, PaymentPreimage};
18+
use crate::offers::invoice_request::InvoiceRequest;
1819
use crate::routing::gossip::NetworkUpdate;
1920
use crate::routing::router::{Path, RouteHop, RouteParameters};
2021
use crate::sign::NodeSigner;
@@ -179,6 +180,7 @@ pub(super) fn construct_onion_keys<T: secp256k1::Signing>(
179180
pub(super) fn build_onion_payloads<'a>(
180181
path: &'a Path, total_msat: u64, recipient_onion: &'a RecipientOnionFields,
181182
starting_htlc_offset: u32, keysend_preimage: &Option<PaymentPreimage>,
183+
invoice_request: Option<&'a InvoiceRequest>,
182184
) -> Result<(Vec<msgs::OutboundOnionPayload<'a>>, u64, u32), APIError> {
183185
let mut res: Vec<msgs::OutboundOnionPayload> = Vec::with_capacity(
184186
path.hops.len() + path.blinded_tail.as_ref().map_or(0, |t| t.hops.len()),
@@ -197,6 +199,7 @@ pub(super) fn build_onion_payloads<'a>(
197199
recipient_onion,
198200
starting_htlc_offset,
199201
keysend_preimage,
202+
invoice_request,
200203
|action, payload| match action {
201204
PayloadCallbackAction::PushBack => res.push(payload),
202205
PayloadCallbackAction::PushFront => res.insert(0, payload),
@@ -218,7 +221,8 @@ enum PayloadCallbackAction {
218221
fn build_onion_payloads_callback<'a, H, B, F>(
219222
hops: H, mut blinded_tail: Option<BlindedTailHopIter<'a, B>>, total_msat: u64,
220223
recipient_onion: &'a RecipientOnionFields, starting_htlc_offset: u32,
221-
keysend_preimage: &Option<PaymentPreimage>, mut callback: F,
224+
keysend_preimage: &Option<PaymentPreimage>, invoice_request: Option<&'a InvoiceRequest>,
225+
mut callback: F,
222226
) -> Result<(u64, u32), APIError>
223227
where
224228
H: DoubleEndedIterator<Item = &'a RouteHop>,
@@ -262,7 +266,7 @@ where
262266
encrypted_tlvs: &blinded_hop.encrypted_payload,
263267
intro_node_blinding_point: blinding_point.take(),
264268
keysend_preimage: *keysend_preimage,
265-
invoice_request: None,
269+
invoice_request,
266270
custom_tlvs: &recipient_onion.custom_tlvs,
267271
},
268272
);
@@ -363,6 +367,7 @@ pub(crate) fn set_max_path_length(
363367
&recipient_onion,
364368
best_block_height,
365369
&keysend_preimage,
370+
None,
366371
|_, payload| {
367372
num_reserved_bytes = num_reserved_bytes
368373
.saturating_add(payload.serialized_length())
@@ -1169,6 +1174,7 @@ pub fn create_payment_onion<T: secp256k1::Signing>(
11691174
recipient_onion,
11701175
cur_block_height,
11711176
keysend_preimage,
1177+
None,
11721178
)?;
11731179
let onion_packet = construct_onion_packet(onion_payloads, onion_keys, prng_seed, payment_hash)
11741180
.map_err(|_| APIError::InvalidRoute {

0 commit comments

Comments
 (0)