Skip to content

Commit 5e68754

Browse files
committed
Incorporate blinded tail in Trampoline onions.
1 parent 4563c90 commit 5e68754

File tree

1 file changed

+47
-16
lines changed

1 file changed

+47
-16
lines changed

lightning/src/ln/onion_utils.rs

+47-16
Original file line numberDiff line numberDiff line change
@@ -394,15 +394,17 @@ pub(super) fn build_onion_payloads(
394394

395395
/// returns the hop data, as well as the first-hop value_msat and CLTV value we should send.
396396
pub(super) fn build_trampoline_payloads(
397-
path: &[TrampolineHop], total_msat: u64, mut recipient_onion: RecipientOnionFields,
397+
path: &Path, total_msat: u64, mut recipient_onion: RecipientOnionFields,
398398
starting_htlc_offset: u32, keysend_preimage: &Option<PaymentPreimage>,
399399
) -> Result<(Vec<msgs::OutboundOnionPayload>, u64, u32), APIError> {
400400
let mut cur_value_msat = 0u64;
401401
let mut cur_cltv = starting_htlc_offset;
402-
let mut res: Vec<msgs::OutboundOnionPayload> = Vec::with_capacity(path.len());
403402
let mut last_node_id = None;
403+
let mut res: Vec<msgs::OutboundOnionPayload> = Vec::with_capacity(
404+
path.trampoline_hops.len() + path.blinded_tail.as_ref().map_or(0, |t| t.hops.len()),
405+
);
404406

405-
for (idx, hop) in path.iter().rev().enumerate() {
407+
for (idx, hop) in path.trampoline_hops.iter().rev().enumerate() {
406408
// First hop gets special values so that it can check, on receipt, that everything is
407409
// exactly as it should be (and the next hop isn't trying to probe to find out if we're
408410
// the intended recipient).
@@ -413,25 +415,54 @@ pub(super) fn build_trampoline_payloads(
413415
cur_cltv
414416
};
415417
if idx == 0 {
416-
res.push(msgs::OutboundOnionPayload::Receive {
417-
payment_data: if let Some(secret) = recipient_onion.payment_secret.take() {
418-
Some(msgs::FinalOnionHopData { payment_secret: secret, total_msat })
419-
} else {
420-
None
421-
},
422-
payment_metadata: recipient_onion.payment_metadata.take(),
423-
keysend_preimage: *keysend_preimage,
424-
custom_tlvs: recipient_onion.custom_tlvs.clone(),
425-
sender_intended_htlc_amt_msat: value_msat,
426-
cltv_expiry_height: cltv,
427-
});
418+
if let Some(BlindedTail {
419+
blinding_point,
420+
hops,
421+
final_value_msat,
422+
excess_final_cltv_expiry_delta,
423+
..
424+
}) = &path.blinded_tail
425+
{
426+
let mut blinding_point = Some(*blinding_point);
427+
for (i, blinded_hop) in hops.iter().enumerate() {
428+
if i == hops.len() - 1 {
429+
cur_value_msat += final_value_msat;
430+
res.push(msgs::OutboundOnionPayload::BlindedReceive {
431+
sender_intended_htlc_amt_msat: *final_value_msat,
432+
total_msat,
433+
cltv_expiry_height: cur_cltv + excess_final_cltv_expiry_delta,
434+
encrypted_tlvs: blinded_hop.encrypted_payload.clone(),
435+
intro_node_blinding_point: blinding_point.take(),
436+
});
437+
} else {
438+
res.push(msgs::OutboundOnionPayload::BlindedForward {
439+
encrypted_tlvs: blinded_hop.encrypted_payload.clone(),
440+
intro_node_blinding_point: blinding_point.take(),
441+
});
442+
}
443+
}
444+
} else {
445+
res.push(msgs::OutboundOnionPayload::Receive {
446+
payment_data: if let Some(secret) = recipient_onion.payment_secret.take() {
447+
Some(msgs::FinalOnionHopData { payment_secret: secret, total_msat })
448+
} else {
449+
None
450+
},
451+
payment_metadata: recipient_onion.payment_metadata.take(),
452+
keysend_preimage: *keysend_preimage,
453+
custom_tlvs: recipient_onion.custom_tlvs.clone(),
454+
sender_intended_htlc_amt_msat: value_msat,
455+
cltv_expiry_height: cltv,
456+
});
457+
}
428458
} else {
429459
res.insert(
430460
0,
431461
msgs::OutboundOnionPayload::TrampolineForward {
432462
amt_to_forward: value_msat,
433463
outgoing_cltv_value: cltv,
434-
outgoing_node_id: last_node_id.unwrap(),
464+
outgoing_node_id: last_node_id
465+
.expect("outgoing node id cannot be None after last hop"),
435466
},
436467
);
437468
}

0 commit comments

Comments
 (0)