Skip to content

Commit 856ce97

Browse files
committed
Return Trampoline payloads in build_onion_payloads
1 parent 5583b98 commit 856ce97

File tree

3 files changed

+43
-24
lines changed

3 files changed

+43
-24
lines changed

lightning/src/ln/functional_tests.rs

+6-6
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).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).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).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).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();
@@ -6547,7 +6547,7 @@ fn test_update_add_htlc_bolt2_receiver_check_max_htlc_limit() {
65476547
let cur_height = nodes[0].node.best_block.read().unwrap().height + 1;
65486548
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::signing_only(), &route.paths[0], &session_priv).unwrap();
65496549
let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
6550-
let (onion_payloads, _htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
6550+
let (onion_payloads, _trampoline_payloads, _htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
65516551
&route.paths[0], send_amt, &recipient_onion_fields, cur_height, &None).unwrap();
65526552
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash).unwrap();
65536553

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

lightning/src/ln/onion_route_tests.rs

+5-5
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).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).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).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).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).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

+32-13
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::ln::channelmanager::{HTLCSource, RecipientOnionFields};
1515
use crate::ln::msgs;
1616
use crate::routing::gossip::NetworkUpdate;
1717
use crate::routing::router::{Path, RouteHop, RouteParameters, TrampolineHop};
18-
use crate::sign::NodeSigner;
18+
use crate::sign::{EntropySource, NodeSigner};
1919
use crate::types::features::{ChannelFeatures, NodeFeatures};
2020
use crate::types::payment::{PaymentHash, PaymentPreimage};
2121
use crate::util::errors::{self, APIError};
@@ -33,7 +33,7 @@ use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey};
3333

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

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

309328
let (value_msat, cltv) = build_onion_payloads_callback(
310329
path.hops.iter(),
311330
blinded_tail_with_hop_iter,
312-
total_msat,
331+
non_trampoline_total_msat,
313332
recipient_onion,
314-
starting_htlc_offset,
333+
non_trampoline_starting_htlc_offset,
315334
keysend_preimage,
316335
|action, payload| match action {
317336
PayloadCallbackAction::PushBack => res.push(payload),
318337
PayloadCallbackAction::PushFront => res.insert(0, payload),
319338
},
320339
)?;
321-
Ok((res, value_msat, cltv))
340+
Ok((res, trampoline_payloads, value_msat, cltv))
322341
}
323342

324343
struct BlindedTailHopIter<'a, I: Iterator<Item = &'a BlindedHop>> {
@@ -1278,7 +1297,7 @@ pub fn create_payment_onion<T: secp256k1::Signing>(
12781297
let onion_keys = construct_onion_keys(&secp_ctx, &path, &session_priv).map_err(|_| {
12791298
APIError::InvalidRoute { err: "Pubkey along hop was maliciously selected".to_owned() }
12801299
})?;
1281-
let (onion_payloads, htlc_msat, htlc_cltv) = build_onion_payloads(
1300+
let (onion_payloads, _, htlc_msat, htlc_cltv) = build_onion_payloads(
12821301
&path,
12831302
total_msat,
12841303
recipient_onion,

0 commit comments

Comments
 (0)