Skip to content

Commit 5ea3ada

Browse files
committed
Return Trampoline payloads in build_onion_payloads
1 parent 33804c3 commit 5ea3ada

File tree

3 files changed

+43
-24
lines changed

3 files changed

+43
-24
lines changed

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

14381438
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
14391439
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
1440-
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
1440+
let (onion_payloads, _, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
14411441
3460001, &recipient_onion_fields, cur_height, &None, None).unwrap();
14421442
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
14431443
let msg = msgs::UpdateAddHTLC {
@@ -1636,7 +1636,7 @@ fn test_chan_reserve_violation_inbound_htlc_outbound_channel() {
16361636
let cur_height = nodes[1].node.best_block.read().unwrap().height + 1;
16371637
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
16381638
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
1639-
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
1639+
let (onion_payloads, _, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
16401640
700_000, &recipient_onion_fields, cur_height, &None, None).unwrap();
16411641
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
16421642
let msg = msgs::UpdateAddHTLC {
@@ -1816,7 +1816,7 @@ fn test_chan_reserve_violation_inbound_htlc_inbound_chan() {
18161816
let cur_height = nodes[0].node.best_block.read().unwrap().height + 1;
18171817
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route_2.paths[0], &session_priv).unwrap();
18181818
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
1819-
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
1819+
let (onion_payloads, _, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
18201820
&route_2.paths[0], recv_value_2, &recipient_onion_fields, cur_height, &None, None).unwrap();
18211821
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash_1).unwrap();
18221822
let msg = msgs::UpdateAddHTLC {
@@ -3555,7 +3555,7 @@ fn fail_backward_pending_htlc_upon_channel_failure() {
35553555
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
35563556
let current_height = nodes[1].node.best_block.read().unwrap().height + 1;
35573557
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
3558-
let (onion_payloads, _amount_msat, cltv_expiry) = onion_utils::build_onion_payloads(
3558+
let (onion_payloads, _trampoline_payloads, _amount_msat, cltv_expiry) = onion_utils::build_onion_payloads(
35593559
&route.paths[0], 50_000, &recipient_onion_fields, current_height, &None, None).unwrap();
35603560
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
35613561
let onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
@@ -6550,7 +6550,7 @@ fn test_update_add_htlc_bolt2_receiver_check_max_htlc_limit() {
65506550
let cur_height = nodes[0].node.best_block.read().unwrap().height + 1;
65516551
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::signing_only(), &route.paths[0], &session_priv).unwrap();
65526552
let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
6553-
let (onion_payloads, _htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
6553+
let (onion_payloads, _trampoline_payloads, _htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
65546554
&route.paths[0], send_amt, &recipient_onion_fields, cur_height, &None, None).unwrap();
65556555
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash).unwrap();
65566556

@@ -8293,7 +8293,7 @@ fn test_onion_value_mpp_set_calculation() {
82938293
let session_priv = SecretKey::from_slice(&session_priv).unwrap();
82948294
let mut onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
82958295
let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
8296-
let (mut onion_payloads, _, _) = onion_utils::build_onion_payloads(&route.paths[0], 100_000,
8296+
let (mut onion_payloads, _, _, _) = onion_utils::build_onion_payloads(&route.paths[0], 100_000,
82978297
&recipient_onion_fields, height + 1, &None, None).unwrap();
82988298
// Edit amt_to_forward to simulate the sender having set
82998299
// the final amount and the routing node taking less fee

lightning/src/ln/onion_route_tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ fn test_onion_failure() {
355355
let cur_height = nodes[0].best_block_info().1 + 1;
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();
358-
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
358+
let (mut onion_payloads, _trampoline_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
359359
&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(..) {
@@ -374,7 +374,7 @@ fn test_onion_failure() {
374374
let cur_height = nodes[0].best_block_info().1 + 1;
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();
377-
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
377+
let (mut onion_payloads, _trampoline_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
378378
&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(..) {
@@ -626,7 +626,7 @@ fn test_onion_failure() {
626626
route.paths[0].hops[1].cltv_expiry_delta += CLTV_FAR_FAR_AWAY + route.paths[0].hops[0].cltv_expiry_delta + 1;
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();
629-
let (onion_payloads, _, htlc_cltv) = onion_utils::build_onion_payloads(
629+
let (onion_payloads, _, _, htlc_cltv) = onion_utils::build_onion_payloads(
630630
&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;
@@ -963,7 +963,7 @@ fn test_always_create_tlv_format_onion_payloads() {
963963

964964
let cur_height = nodes[0].best_block_info().1 + 1;
965965
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
966-
let (onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
966+
let (onion_payloads, _trampoline_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
967967
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None, None).unwrap();
968968

969969
match onion_payloads[0] {
@@ -1219,7 +1219,7 @@ fn test_phantom_invalid_onion_payload() {
12191219
let session_priv = SecretKey::from_slice(&session_priv).unwrap();
12201220
let mut onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
12211221
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
1222-
let (mut onion_payloads, _, _) = onion_utils::build_onion_payloads(
1222+
let (mut onion_payloads, _, _, _) = onion_utils::build_onion_payloads(
12231223
&route.paths[0], msgs::MAX_VALUE_MSAT + 1,
12241224
&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

lightning/src/ln/onion_utils.rs

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::ln::msgs;
1616
use crate::offers::invoice_request::InvoiceRequest;
1717
use crate::routing::gossip::NetworkUpdate;
1818
use crate::routing::router::{Path, RouteHop, RouteParameters, TrampolineHop};
19-
use crate::sign::NodeSigner;
19+
use crate::sign::{EntropySource, NodeSigner};
2020
use crate::types::features::{ChannelFeatures, NodeFeatures};
2121
use crate::types::payment::{PaymentHash, PaymentPreimage};
2222
use crate::util::errors::{self, APIError};
@@ -34,7 +34,7 @@ use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey};
3434

3535
use crate::io::{Cursor, Read};
3636
use core::ops::Deref;
37-
37+
use crate::blinded_path::payment::BlindedPaymentPath;
3838
#[allow(unused_imports)]
3939
use crate::prelude::*;
4040

@@ -186,6 +186,13 @@ fn build_trampoline_onion_payloads<'a>(
186186
let blinded_tail = path.blinded_tail.as_ref().ok_or(APIError::InvalidRoute {
187187
err: "Routes using Trampoline must terminate blindly.".to_string(),
188188
})?;
189+
190+
if !blinded_tail.final_hop_supports_trampoline {
191+
// if the final hop does not support Trampoline, we need to generate blinded tails
192+
// here instead
193+
debug_assert!(false);
194+
}
195+
189196
let blinded_tail_with_hop_iter = BlindedTailHopIter {
190197
hops: blinded_tail.hops.iter(),
191198
blinding_point: blinded_tail.blinding_point,
@@ -297,31 +304,43 @@ pub(super) fn build_onion_payloads<'a>(
297304
path: &'a Path, total_msat: u64, recipient_onion: &'a RecipientOnionFields,
298305
starting_htlc_offset: u32, keysend_preimage: &Option<PaymentPreimage>,
299306
invoice_request: Option<&'a InvoiceRequest>,
300-
) -> Result<(Vec<msgs::OutboundOnionPayload<'a>>, u64, u32), APIError> {
307+
) -> Result<(Vec<msgs::OutboundOnionPayload<'a>>, Vec<msgs::OutboundTrampolinePayload<'a>>, u64, u32), APIError> {
301308
let mut res: Vec<msgs::OutboundOnionPayload> = Vec::with_capacity(
302309
path.hops.len() + path.blinded_tail.as_ref().map_or(0, |t| t.hops.len()),
303310
);
304-
let blinded_tail_with_hop_iter = path.blinded_tail.as_ref().map(|bt| BlindedTailHopIter {
305-
hops: bt.hops.iter(),
306-
blinding_point: bt.blinding_point,
307-
final_value_msat: bt.final_value_msat,
308-
excess_final_cltv_expiry_delta: bt.excess_final_cltv_expiry_delta,
309-
});
311+
312+
let mut non_trampoline_total_msat = total_msat;
313+
let mut non_trampoline_starting_htlc_offset = starting_htlc_offset;
314+
315+
let (blinded_tail_with_hop_iter, trampoline_payloads) = if path.trampoline_hops.len() > 0 {
316+
let trampoline_payload_details = build_trampoline_onion_payloads(path, total_msat, recipient_onion, starting_htlc_offset, keysend_preimage)?;
317+
non_trampoline_total_msat = trampoline_payload_details.1;
318+
non_trampoline_starting_htlc_offset = trampoline_payload_details.2;
319+
(None, trampoline_payload_details.0)
320+
} else {
321+
let blinded_tail_with_hop_iter = path.blinded_tail.as_ref().map(|bt| BlindedTailHopIter {
322+
hops: bt.hops.iter(),
323+
blinding_point: bt.blinding_point,
324+
final_value_msat: bt.final_value_msat,
325+
excess_final_cltv_expiry_delta: bt.excess_final_cltv_expiry_delta,
326+
});
327+
(blinded_tail_with_hop_iter, vec![])
328+
};
310329

311330
let (value_msat, cltv) = build_onion_payloads_callback(
312331
path.hops.iter(),
313332
blinded_tail_with_hop_iter,
314-
total_msat,
333+
non_trampoline_total_msat,
315334
recipient_onion,
316-
starting_htlc_offset,
335+
non_trampoline_starting_htlc_offset,
317336
keysend_preimage,
318337
invoice_request,
319338
|action, payload| match action {
320339
PayloadCallbackAction::PushBack => res.push(payload),
321340
PayloadCallbackAction::PushFront => res.insert(0, payload),
322341
},
323342
)?;
324-
Ok((res, value_msat, cltv))
343+
Ok((res, trampoline_payloads, value_msat, cltv))
325344
}
326345

327346
struct BlindedTailHopIter<'a, I: Iterator<Item = &'a BlindedHop>> {
@@ -1286,7 +1305,7 @@ pub fn create_payment_onion<T: secp256k1::Signing>(
12861305
let onion_keys = construct_onion_keys(&secp_ctx, &path, &session_priv).map_err(|_| {
12871306
APIError::InvalidRoute { err: "Pubkey along hop was maliciously selected".to_owned() }
12881307
})?;
1289-
let (onion_payloads, htlc_msat, htlc_cltv) = build_onion_payloads(
1308+
let (onion_payloads, _, htlc_msat, htlc_cltv) = build_onion_payloads(
12901309
&path,
12911310
total_msat,
12921311
recipient_onion,

0 commit comments

Comments
 (0)