Skip to content

Commit a7b6bac

Browse files
OutboundOnionPayload: hold Vec fields as references.
Will be useful when we reuse this enum to calculate the maximum path length, to avoid cloning the vecs.
1 parent dfb250b commit a7b6bac

File tree

6 files changed

+54
-43
lines changed

6 files changed

+54
-43
lines changed

lightning/src/ln/blinded_payment_tests.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,11 +298,12 @@ fn do_forward_checks_failure(check: ForwardCheckFail, intro_fails: bool) {
298298
$update_add.cltv_expiry = 10; // causes outbound CLTV expiry to underflow
299299
},
300300
ForwardCheckFail::ForwardPayloadEncodedAsReceive => {
301+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
301302
let session_priv = SecretKey::from_slice(&[3; 32]).unwrap();
302303
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
303304
let cur_height = nodes[0].best_block_info().1;
304305
let (mut onion_payloads, ..) = onion_utils::build_onion_payloads(
305-
&route.paths[0], amt_msat, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
306+
&route.paths[0], amt_msat, &recipient_onion_fields, cur_height, &None).unwrap();
306307
// Remove the receive payload so the blinded forward payload is encoded as a final payload
307308
// (i.e. next_hop_hmac == [0; 32])
308309
onion_payloads.pop();
@@ -875,8 +876,9 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
875876
let session_priv = SecretKey::from_slice(&session_priv).unwrap();
876877
let mut onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
877878
let cur_height = nodes[0].best_block_info().1;
879+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
878880
let (mut onion_payloads, ..) = onion_utils::build_onion_payloads(
879-
&route.paths[0], amt_msat, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
881+
&route.paths[0], amt_msat, &recipient_onion_fields, cur_height, &None).unwrap();
880882

881883
let update_add = &mut payment_event_1_2.msgs[0];
882884
onion_payloads.last_mut().map(|p| {

lightning/src/ln/functional_tests.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1401,8 +1401,9 @@ fn test_fee_spike_violation_fails_htlc() {
14011401
let cur_height = nodes[1].node.best_block.read().unwrap().height + 1;
14021402

14031403
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
1404+
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
14041405
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
1405-
3460001, RecipientOnionFields::secret_only(payment_secret), cur_height, &None).unwrap();
1406+
3460001, &recipient_onion_fields, cur_height, &None).unwrap();
14061407
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
14071408
let msg = msgs::UpdateAddHTLC {
14081409
channel_id: chan.2,
@@ -1598,8 +1599,9 @@ fn test_chan_reserve_violation_inbound_htlc_outbound_channel() {
15981599
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
15991600
let cur_height = nodes[1].node.best_block.read().unwrap().height + 1;
16001601
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
1602+
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
16011603
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
1602-
700_000, RecipientOnionFields::secret_only(payment_secret), cur_height, &None).unwrap();
1604+
700_000, &recipient_onion_fields, cur_height, &None).unwrap();
16031605
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
16041606
let msg = msgs::UpdateAddHTLC {
16051607
channel_id: chan.2,
@@ -1777,8 +1779,9 @@ fn test_chan_reserve_violation_inbound_htlc_inbound_chan() {
17771779
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
17781780
let cur_height = nodes[0].node.best_block.read().unwrap().height + 1;
17791781
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route_2.paths[0], &session_priv).unwrap();
1782+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
17801783
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
1781-
&route_2.paths[0], recv_value_2, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
1784+
&route_2.paths[0], recv_value_2, &recipient_onion_fields, cur_height, &None).unwrap();
17821785
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash_1).unwrap();
17831786
let msg = msgs::UpdateAddHTLC {
17841787
channel_id: chan.2,
@@ -3501,8 +3504,9 @@ fn fail_backward_pending_htlc_upon_channel_failure() {
35013504
let secp_ctx = Secp256k1::new();
35023505
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
35033506
let current_height = nodes[1].node.best_block.read().unwrap().height + 1;
3507+
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
35043508
let (onion_payloads, _amount_msat, cltv_expiry) = onion_utils::build_onion_payloads(
3505-
&route.paths[0], 50_000, RecipientOnionFields::secret_only(payment_secret), current_height, &None).unwrap();
3509+
&route.paths[0], 50_000, &recipient_onion_fields, current_height, &None).unwrap();
35063510
let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
35073511
let onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
35083512

@@ -6487,8 +6491,9 @@ fn test_update_add_htlc_bolt2_receiver_check_max_htlc_limit() {
64876491
let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
64886492
let cur_height = nodes[0].node.best_block.read().unwrap().height + 1;
64896493
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::signing_only(), &route.paths[0], &session_priv).unwrap();
6494+
let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
64906495
let (onion_payloads, _htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
6491-
&route.paths[0], send_amt, RecipientOnionFields::secret_only(our_payment_secret), cur_height, &None).unwrap();
6496+
&route.paths[0], send_amt, &recipient_onion_fields, cur_height, &None).unwrap();
64926497
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash).unwrap();
64936498

64946499
let mut msg = msgs::UpdateAddHTLC {
@@ -8222,8 +8227,9 @@ fn test_onion_value_mpp_set_calculation() {
82228227
let height = nodes[0].best_block_info().1;
82238228
let session_priv = SecretKey::from_slice(&session_priv).unwrap();
82248229
let mut onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
8230+
let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
82258231
let (mut onion_payloads, _, _) = onion_utils::build_onion_payloads(&route.paths[0], 100_000,
8226-
RecipientOnionFields::secret_only(our_payment_secret), height + 1, &None).unwrap();
8232+
&recipient_onion_fields, height + 1, &None).unwrap();
82278233
// Edit amt_to_forward to simulate the sender having set
82288234
// the final amount and the routing node taking less fee
82298235
if let msgs::OutboundOnionPayload::Receive {

lightning/src/ln/msgs.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1723,7 +1723,7 @@ mod fuzzy_internal_msgs {
17231723
}
17241724
}
17251725

1726-
pub(crate) enum OutboundOnionPayload {
1726+
pub(crate) enum OutboundOnionPayload<'a> {
17271727
Forward {
17281728
short_channel_id: u64,
17291729
/// The value, in msat, of the payment after this hop's fee is deducted.
@@ -1739,24 +1739,24 @@ mod fuzzy_internal_msgs {
17391739
},
17401740
Receive {
17411741
payment_data: Option<FinalOnionHopData>,
1742-
payment_metadata: Option<Vec<u8>>,
1742+
payment_metadata: Option<&'a Vec<u8>>,
17431743
keysend_preimage: Option<PaymentPreimage>,
1744-
custom_tlvs: Vec<(u64, Vec<u8>)>,
1744+
custom_tlvs: &'a Vec<(u64, Vec<u8>)>,
17451745
sender_intended_htlc_amt_msat: u64,
17461746
cltv_expiry_height: u32,
17471747
},
17481748
BlindedForward {
1749-
encrypted_tlvs: Vec<u8>,
1749+
encrypted_tlvs: &'a Vec<u8>,
17501750
intro_node_blinding_point: Option<PublicKey>,
17511751
},
17521752
BlindedReceive {
17531753
sender_intended_htlc_amt_msat: u64,
17541754
total_msat: u64,
17551755
cltv_expiry_height: u32,
1756-
encrypted_tlvs: Vec<u8>,
1756+
encrypted_tlvs: &'a Vec<u8>,
17571757
intro_node_blinding_point: Option<PublicKey>, // Set if the introduction node of the blinded path is the final node
17581758
keysend_preimage: Option<PaymentPreimage>,
1759-
custom_tlvs: Vec<(u64, Vec<u8>)>,
1759+
custom_tlvs: &'a Vec<(u64, Vec<u8>)>,
17601760
}
17611761
}
17621762

@@ -2569,7 +2569,7 @@ impl Readable for FinalOnionHopData {
25692569
}
25702570
}
25712571

2572-
impl Writeable for OutboundOnionPayload {
2572+
impl<'a> Writeable for OutboundOnionPayload<'a> {
25732573
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
25742574
match self {
25752575
Self::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value } => {
@@ -2604,12 +2604,12 @@ impl Writeable for OutboundOnionPayload {
26042604
(2, HighZeroBytesDroppedBigSize(*sender_intended_htlc_amt_msat), required),
26052605
(4, HighZeroBytesDroppedBigSize(*cltv_expiry_height), required),
26062606
(8, payment_data, option),
2607-
(16, payment_metadata.as_ref().map(|m| WithoutLength(m)), option)
2607+
(16, payment_metadata.map(|m| WithoutLength(m)), option)
26082608
}, custom_tlvs.iter());
26092609
},
26102610
Self::BlindedForward { encrypted_tlvs, intro_node_blinding_point } => {
26112611
_encode_varint_length_prefixed_tlv!(w, {
2612-
(10, *encrypted_tlvs, required_vec),
2612+
(10, **encrypted_tlvs, required_vec),
26132613
(12, intro_node_blinding_point, option)
26142614
});
26152615
},
@@ -2626,7 +2626,7 @@ impl Writeable for OutboundOnionPayload {
26262626
_encode_varint_length_prefixed_tlv!(w, {
26272627
(2, HighZeroBytesDroppedBigSize(*sender_intended_htlc_amt_msat), required),
26282628
(4, HighZeroBytesDroppedBigSize(*cltv_expiry_height), required),
2629-
(10, *encrypted_tlvs, required_vec),
2629+
(10, **encrypted_tlvs, required_vec),
26302630
(12, intro_node_blinding_point, option),
26312631
(18, HighZeroBytesDroppedBigSize(*total_msat), required)
26322632
}, custom_tlvs.iter());
@@ -4360,7 +4360,7 @@ mod tests {
43604360
keysend_preimage: None,
43614361
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
43624362
cltv_expiry_height: 0xffffffff,
4363-
custom_tlvs: vec![],
4363+
custom_tlvs: &vec![],
43644364
};
43654365
let encoded_value = outbound_msg.encode();
43664366
let target_value = <Vec<u8>>::from_hex("1002080badf00d010203040404ffffffff").unwrap();
@@ -4388,7 +4388,7 @@ mod tests {
43884388
keysend_preimage: None,
43894389
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
43904390
cltv_expiry_height: 0xffffffff,
4391-
custom_tlvs: vec![],
4391+
custom_tlvs: &vec![],
43924392
};
43934393
let encoded_value = outbound_msg.encode();
43944394
let target_value = <Vec<u8>>::from_hex("3602080badf00d010203040404ffffffff082442424242424242424242424242424242424242424242424242424242424242421badca1f").unwrap();
@@ -4425,7 +4425,7 @@ mod tests {
44254425
payment_data: None,
44264426
payment_metadata: None,
44274427
keysend_preimage: None,
4428-
custom_tlvs: bad_type_range_tlvs,
4428+
custom_tlvs: &bad_type_range_tlvs,
44294429
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
44304430
cltv_expiry_height: 0xffffffff,
44314431
};
@@ -4437,7 +4437,7 @@ mod tests {
44374437
((1 << 16) - 1, vec![42; 32]),
44384438
];
44394439
if let msgs::OutboundOnionPayload::Receive { ref mut custom_tlvs, .. } = msg {
4440-
*custom_tlvs = good_type_range_tlvs.clone();
4440+
*custom_tlvs = &good_type_range_tlvs;
44414441
}
44424442
let encoded_value = msg.encode();
44434443
let inbound_msg = ReadableArgs::read(&mut Cursor::new(&encoded_value[..]), (None, &&node_signer)).unwrap();
@@ -4457,7 +4457,7 @@ mod tests {
44574457
payment_data: None,
44584458
payment_metadata: None,
44594459
keysend_preimage: None,
4460-
custom_tlvs: expected_custom_tlvs.clone(),
4460+
custom_tlvs: &expected_custom_tlvs,
44614461
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
44624462
cltv_expiry_height: 0xffffffff,
44634463
};

lightning/src/ln/onion_payment.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ mod tests {
537537
let path = Path { hops, blinded_tail: None, };
538538
let onion_keys = super::onion_utils::construct_onion_keys(&secp_ctx, &path, &session_priv).unwrap();
539539
let (onion_payloads, ..) = super::onion_utils::build_onion_payloads(
540-
&path, total_amt_msat, recipient_onion, cur_height + 1, &Some(keysend_preimage)
540+
&path, total_amt_msat, &recipient_onion, cur_height + 1, &Some(keysend_preimage)
541541
).unwrap();
542542

543543
assert!(super::onion_utils::construct_onion_packet(

lightning/src/ln/onion_route_tests.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,9 @@ fn test_onion_failure() {
356356
let session_priv = SecretKey::from_slice(&[3; 32]).unwrap();
357357
let cur_height = nodes[0].best_block_info().1 + 1;
358358
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
359+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
359360
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
360-
&route.paths[0], 40000, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
361+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
361362
let mut new_payloads = Vec::new();
362363
for payload in onion_payloads.drain(..) {
363364
new_payloads.push(BogusOnionHopData::new(payload));
@@ -374,8 +375,9 @@ fn test_onion_failure() {
374375
let session_priv = SecretKey::from_slice(&[3; 32]).unwrap();
375376
let cur_height = nodes[0].best_block_info().1 + 1;
376377
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
378+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
377379
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
378-
&route.paths[0], 40000, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
380+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
379381
let mut new_payloads = Vec::new();
380382
for payload in onion_payloads.drain(..) {
381383
new_payloads.push(BogusOnionHopData::new(payload));
@@ -611,8 +613,9 @@ fn test_onion_failure() {
611613
let height = nodes[2].best_block_info().1;
612614
route.paths[0].hops[1].cltv_expiry_delta += CLTV_FAR_FAR_AWAY + route.paths[0].hops[0].cltv_expiry_delta + 1;
613615
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
616+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
614617
let (onion_payloads, _, htlc_cltv) = onion_utils::build_onion_payloads(
615-
&route.paths[0], 40000, RecipientOnionFields::spontaneous_empty(), height, &None).unwrap();
618+
&route.paths[0], 40000, &recipient_onion_fields, height, &None).unwrap();
616619
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
617620
msg.cltv_expiry = htlc_cltv;
618621
msg.onion_routing_packet = onion_packet;
@@ -947,8 +950,9 @@ fn test_always_create_tlv_format_onion_payloads() {
947950
assert!(!hops[1].node_features.supports_variable_length_onion());
948951

949952
let cur_height = nodes[0].best_block_info().1 + 1;
953+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
950954
let (onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
951-
&route.paths[0], 40000, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
955+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
952956

953957
match onion_payloads[0] {
954958
msgs::OutboundOnionPayload::Forward {..} => {},
@@ -1202,9 +1206,10 @@ fn test_phantom_invalid_onion_payload() {
12021206
let height = nodes[0].best_block_info().1;
12031207
let session_priv = SecretKey::from_slice(&session_priv).unwrap();
12041208
let mut onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
1209+
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
12051210
let (mut onion_payloads, _, _) = onion_utils::build_onion_payloads(
12061211
&route.paths[0], msgs::MAX_VALUE_MSAT + 1,
1207-
RecipientOnionFields::secret_only(payment_secret), height + 1, &None).unwrap();
1212+
&recipient_onion_fields, height + 1, &None).unwrap();
12081213
// We only want to construct the onion packet for the last hop, not the entire route, so
12091214
// remove the first hop's payload and its keys.
12101215
onion_keys.remove(0);

lightning/src/ln/onion_utils.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,10 @@ pub(super) fn construct_onion_keys<T: secp256k1::Signing>(
174174
}
175175

176176
/// returns the hop data, as well as the first-hop value_msat and CLTV value we should send.
177-
pub(super) fn build_onion_payloads(
178-
path: &Path, total_msat: u64, mut recipient_onion: RecipientOnionFields,
177+
pub(super) fn build_onion_payloads<'a>(
178+
path: &'a Path, total_msat: u64, recipient_onion: &'a RecipientOnionFields,
179179
starting_htlc_offset: u32, keysend_preimage: &Option<PaymentPreimage>,
180-
) -> Result<(Vec<msgs::OutboundOnionPayload>, u64, u32), APIError> {
180+
) -> Result<(Vec<msgs::OutboundOnionPayload<'a>>, u64, u32), APIError> {
181181
let mut cur_value_msat = 0u64;
182182
let mut cur_cltv = starting_htlc_offset;
183183
let mut last_short_channel_id = 0;
@@ -212,28 +212,26 @@ pub(super) fn build_onion_payloads(
212212
sender_intended_htlc_amt_msat: *final_value_msat,
213213
total_msat,
214214
cltv_expiry_height: cur_cltv + excess_final_cltv_expiry_delta,
215-
encrypted_tlvs: blinded_hop.encrypted_payload.clone(),
215+
encrypted_tlvs: &blinded_hop.encrypted_payload,
216216
intro_node_blinding_point: blinding_point.take(),
217217
keysend_preimage: *keysend_preimage,
218-
custom_tlvs: recipient_onion.custom_tlvs.clone(),
218+
custom_tlvs: &recipient_onion.custom_tlvs,
219219
});
220220
} else {
221221
res.push(msgs::OutboundOnionPayload::BlindedForward {
222-
encrypted_tlvs: blinded_hop.encrypted_payload.clone(),
222+
encrypted_tlvs: &blinded_hop.encrypted_payload,
223223
intro_node_blinding_point: blinding_point.take(),
224224
});
225225
}
226226
}
227227
} else {
228228
res.push(msgs::OutboundOnionPayload::Receive {
229-
payment_data: if let Some(secret) = recipient_onion.payment_secret.take() {
230-
Some(msgs::FinalOnionHopData { payment_secret: secret, total_msat })
231-
} else {
232-
None
233-
},
234-
payment_metadata: recipient_onion.payment_metadata.take(),
229+
payment_data: recipient_onion.payment_secret.map(|payment_secret|
230+
msgs::FinalOnionHopData { payment_secret, total_msat }
231+
),
232+
payment_metadata: recipient_onion.payment_metadata.as_ref(),
235233
keysend_preimage: *keysend_preimage,
236-
custom_tlvs: recipient_onion.custom_tlvs.clone(),
234+
custom_tlvs: &recipient_onion.custom_tlvs,
237235
sender_intended_htlc_amt_msat: value_msat,
238236
cltv_expiry_height: cltv,
239237
});
@@ -1133,7 +1131,7 @@ pub fn create_payment_onion<T: secp256k1::Signing>(
11331131
let (onion_payloads, htlc_msat, htlc_cltv) = build_onion_payloads(
11341132
&path,
11351133
total_msat,
1136-
recipient_onion,
1134+
&recipient_onion,
11371135
cur_block_height,
11381136
keysend_preimage,
11391137
)?;

0 commit comments

Comments
 (0)