Skip to content

Commit 2e3b378

Browse files
Persist blinded payment state in PendingHTLCRouting
Will be used for failing backwards correctly once we similarly store this data in HTLCPreviousHopData.
1 parent 6160708 commit 2e3b378

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ pub(super) enum PendingHTLCRouting {
114114
phantom_shared_secret: Option<[u8; 32]>,
115115
/// See [`RecipientOnionFields::custom_tlvs`] for more info.
116116
custom_tlvs: Vec<(u64, Vec<u8>)>,
117+
/// `Some` if this corresponds to a blinded HTLC. Used for failing backwards properly. We use an
118+
/// option to maintain compatibility with LDK versions prior to 0.0.117.
119+
blinded: Option<()>,
117120
},
118121
ReceiveKeysend {
119122
/// This was added in 0.0.116 and will break deserialization on downgrades.
@@ -123,6 +126,8 @@ pub(super) enum PendingHTLCRouting {
123126
incoming_cltv_expiry: u32, // Used to track when we should expire pending HTLCs that go unclaimed
124127
/// See [`RecipientOnionFields::custom_tlvs`] for more info.
125128
custom_tlvs: Vec<(u64, Vec<u8>)>,
129+
/// See [`Self::Receive::blinded`] docs.
130+
blinded: Option<()>,
126131
},
127132
}
128133

@@ -181,7 +186,7 @@ pub(super) enum HTLCForwardInfo {
181186
#[derive(Clone, Copy, Hash, PartialEq, Eq)]
182187
pub(super) struct BlindedForward {
183188
inbound_blinding_point: PublicKey,
184-
// Another field will be added later for error handling.
189+
we_are_intro_node: bool,
185190
}
186191

187192
/// Tracks the inbound corresponding to an outbound HTLC
@@ -2772,6 +2777,7 @@ where
27722777
blinded: intro_node_blinding_pt.or(msg.blinding_point)
27732778
.map(|bp| BlindedForward {
27742779
inbound_blinding_point: bp,
2780+
we_are_intro_node: intro_node_blinding_pt.is_some(),
27752781
}),
27762782
},
27772783
payment_hash: msg.payment_hash,
@@ -2788,16 +2794,21 @@ where
27882794
amt_msat: u64, cltv_expiry: u32, phantom_shared_secret: Option<[u8; 32]>, allow_underpay: bool,
27892795
counterparty_skimmed_fee_msat: Option<u64>,
27902796
) -> Result<PendingHTLCInfo, InboundOnionErr> {
2791-
let (payment_data, keysend_preimage, custom_tlvs, onion_amt_msat, outgoing_cltv_value, payment_metadata) = match hop_data {
2797+
let (
2798+
payment_data, keysend_preimage, custom_tlvs, onion_amt_msat, outgoing_cltv_value,
2799+
payment_metadata, blinded
2800+
) = match hop_data {
27922801
msgs::InboundOnionPayload::Receive {
27932802
payment_data, keysend_preimage, custom_tlvs, amt_msat, outgoing_cltv_value, payment_metadata, ..
27942803
} =>
2795-
(payment_data, keysend_preimage, custom_tlvs, amt_msat, outgoing_cltv_value, payment_metadata),
2804+
(payment_data, keysend_preimage, custom_tlvs, amt_msat, outgoing_cltv_value,
2805+
payment_metadata, None),
27962806
msgs::InboundOnionPayload::BlindedReceive {
2797-
amt_msat, total_msat, outgoing_cltv_value, payment_secret, ..
2807+
amt_msat, total_msat, outgoing_cltv_value, payment_secret, intro_node_blinding_point, ..
27982808
} => {
27992809
let payment_data = msgs::FinalOnionHopData { payment_secret, total_msat };
2800-
(Some(payment_data), None, Vec::new(), amt_msat, outgoing_cltv_value, None)
2810+
let blinded = if intro_node_blinding_point.is_none() { Some(()) } else { None };
2811+
(Some(payment_data), None, Vec::new(), amt_msat, outgoing_cltv_value, None, blinded)
28012812
}
28022813
msgs::InboundOnionPayload::Forward { .. } => {
28032814
return Err(InboundOnionErr {
@@ -2877,6 +2888,7 @@ where
28772888
payment_metadata,
28782889
incoming_cltv_expiry: outgoing_cltv_value,
28792890
custom_tlvs,
2891+
blinded,
28802892
}
28812893
} else if let Some(data) = payment_data {
28822894
PendingHTLCRouting::Receive {
@@ -2885,6 +2897,7 @@ where
28852897
incoming_cltv_expiry: outgoing_cltv_value,
28862898
phantom_shared_secret,
28872899
custom_tlvs,
2900+
blinded,
28882901
}
28892902
} else {
28902903
return Err(InboundOnionErr {
@@ -4150,14 +4163,20 @@ where
41504163
}
41514164
}) => {
41524165
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret, mut onion_fields) = match routing {
4153-
PendingHTLCRouting::Receive { payment_data, payment_metadata, incoming_cltv_expiry, phantom_shared_secret, custom_tlvs } => {
4166+
PendingHTLCRouting::Receive {
4167+
payment_data, payment_metadata, incoming_cltv_expiry, phantom_shared_secret,
4168+
custom_tlvs, ..
4169+
} => {
41544170
let _legacy_hop_data = Some(payment_data.clone());
41554171
let onion_fields = RecipientOnionFields { payment_secret: Some(payment_data.payment_secret),
41564172
payment_metadata, custom_tlvs };
41574173
(incoming_cltv_expiry, OnionPayload::Invoice { _legacy_hop_data },
41584174
Some(payment_data), phantom_shared_secret, onion_fields)
41594175
},
4160-
PendingHTLCRouting::ReceiveKeysend { payment_data, payment_preimage, payment_metadata, incoming_cltv_expiry, custom_tlvs } => {
4176+
PendingHTLCRouting::ReceiveKeysend {
4177+
payment_data, payment_preimage, payment_metadata, incoming_cltv_expiry,
4178+
custom_tlvs, ..
4179+
} => {
41614180
let onion_fields = RecipientOnionFields {
41624181
payment_secret: payment_data.as_ref().map(|data| data.payment_secret),
41634182
payment_metadata,
@@ -8026,6 +8045,7 @@ impl_writeable_tlv_based_enum!(PendingHTLCRouting,
80268045
(1, phantom_shared_secret, option),
80278046
(2, incoming_cltv_expiry, required),
80288047
(3, payment_metadata, option),
8048+
(4, blinded, option),
80298049
(5, custom_tlvs, optional_vec),
80308050
},
80318051
(2, ReceiveKeysend) => {
@@ -8034,11 +8054,13 @@ impl_writeable_tlv_based_enum!(PendingHTLCRouting,
80348054
(3, payment_metadata, option),
80358055
(4, payment_data, option), // Added in 0.0.116
80368056
(5, custom_tlvs, optional_vec),
8057+
(6, blinded, option),
80378058
},
80388059
;);
80398060

80408061
impl_writeable_tlv_based!(BlindedForward, {
80418062
(0, inbound_blinding_point, required),
8063+
(2, we_are_intro_node, required),
80428064
});
80438065

80448066
impl_writeable_tlv_based!(PendingHTLCInfo, {

0 commit comments

Comments
 (0)