Skip to content

Commit 3800a46

Browse files
committed
Parse Trampoline forward payloads
We will be using the same logic for decoding onion payloads for outer and for Trampoline onions. To accommodate some Trampoline-only payloads, we add the ability to parse forward payloads that carry a next node ID rather than an SCID.
1 parent f01dc4a commit 3800a46

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

lightning/src/ln/msgs.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1800,7 +1800,7 @@ mod fuzzy_internal_msgs {
18001800

18011801
#[allow(unused_imports)]
18021802
use crate::prelude::*;
1803-
1803+
use crate::routing::gossip::NodeId;
18041804
// These types aren't intended to be pub, but are exposed for direct fuzzing (as we deserialize
18051805
// them from untrusted input):
18061806

@@ -1811,6 +1811,15 @@ mod fuzzy_internal_msgs {
18111811
pub outgoing_cltv_value: u32,
18121812
}
18131813

1814+
#[allow(unused)]
1815+
pub struct InboundTrampolineForwardPayload {
1816+
pub outgoing_node_id: NodeId,
1817+
/// The value, in msat, of the payment after this hop's fee is deducted.
1818+
pub amt_to_forward: u64,
1819+
pub outgoing_cltv_value: u32,
1820+
}
1821+
1822+
#[allow(unused)]
18141823
pub struct InboundTrampolineEntrypointPayload {
18151824
pub amt_to_forward: u64,
18161825
pub outgoing_cltv_value: u32,
@@ -1854,6 +1863,10 @@ mod fuzzy_internal_msgs {
18541863
Receive(InboundOnionReceivePayload),
18551864
BlindedForward(InboundOnionBlindedForwardPayload),
18561865
BlindedReceive(InboundOnionBlindedReceivePayload),
1866+
1867+
// These payloads should be seen inside an inner Trampoline onion
1868+
#[allow(unused)]
1869+
TrampolineForward(InboundTrampolineForwardPayload),
18571870
}
18581871

18591872
pub(crate) enum OutboundOnionPayload<'a> {
@@ -2914,6 +2927,7 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
29142927
let mut payment_data: Option<FinalOnionHopData> = None;
29152928
let mut encrypted_tlvs_opt: Option<WithoutLength<Vec<u8>>> = None;
29162929
let mut intro_node_blinding_point = None;
2930+
let mut outgoing_node_id: Option<NodeId> = None;
29172931
let mut payment_metadata: Option<WithoutLength<Vec<u8>>> = None;
29182932
let mut total_msat = None;
29192933
let mut keysend_preimage: Option<PaymentPreimage> = None;
@@ -2930,6 +2944,7 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
29302944
(8, payment_data, option),
29312945
(10, encrypted_tlvs_opt, option),
29322946
(12, intro_node_blinding_point, option),
2947+
(14, outgoing_node_id, option),
29332948
(16, payment_metadata, option),
29342949
(18, total_msat, (option, encoding: (u64, HighZeroBytesDroppedBigSize))),
29352950
(20, trampoline_onion_packet, option),
@@ -3011,6 +3026,15 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
30113026
amt_to_forward: amt.ok_or(DecodeError::InvalidValue)?,
30123027
outgoing_cltv_value: cltv_value.ok_or(DecodeError::InvalidValue)?,
30133028
}))
3029+
} else if let Some(outgoing_node_id) = outgoing_node_id {
3030+
if payment_data.is_some() || payment_metadata.is_some() || encrypted_tlvs_opt.is_some() ||
3031+
total_msat.is_some() || invoice_request.is_some()
3032+
{ return Err(DecodeError::InvalidValue) }
3033+
Ok(Self::TrampolineForward(InboundTrampolineForwardPayload {
3034+
outgoing_node_id,
3035+
amt_to_forward: amt.ok_or(DecodeError::InvalidValue)?,
3036+
outgoing_cltv_value: cltv_value.ok_or(DecodeError::InvalidValue)?,
3037+
}))
30143038
} else if let Some(trampoline_onion_packet) = trampoline_onion_packet {
30153039
if payment_metadata.is_some() || encrypted_tlvs_opt.is_some() ||
30163040
total_msat.is_some()

0 commit comments

Comments
 (0)