Skip to content

Commit e4e6e09

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 da7a916 commit e4e6e09

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());
@@ -4359,7 +4359,7 @@ mod tests {
43594359
keysend_preimage: None,
43604360
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
43614361
cltv_expiry_height: 0xffffffff,
4362-
custom_tlvs: vec![],
4362+
custom_tlvs: &vec![],
43634363
};
43644364
let encoded_value = outbound_msg.encode();
43654365
let target_value = <Vec<u8>>::from_hex("1002080badf00d010203040404ffffffff").unwrap();
@@ -4387,7 +4387,7 @@ mod tests {
43874387
keysend_preimage: None,
43884388
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
43894389
cltv_expiry_height: 0xffffffff,
4390-
custom_tlvs: vec![],
4390+
custom_tlvs: &vec![],
43914391
};
43924392
let encoded_value = outbound_msg.encode();
43934393
let target_value = <Vec<u8>>::from_hex("3602080badf00d010203040404ffffffff082442424242424242424242424242424242424242424242424242424242424242421badca1f").unwrap();
@@ -4424,7 +4424,7 @@ mod tests {
44244424
payment_data: None,
44254425
payment_metadata: None,
44264426
keysend_preimage: None,
4427-
custom_tlvs: bad_type_range_tlvs,
4427+
custom_tlvs: &bad_type_range_tlvs,
44284428
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
44294429
cltv_expiry_height: 0xffffffff,
44304430
};
@@ -4436,7 +4436,7 @@ mod tests {
44364436
((1 << 16) - 1, vec![42; 32]),
44374437
];
44384438
if let msgs::OutboundOnionPayload::Receive { ref mut custom_tlvs, .. } = msg {
4439-
*custom_tlvs = good_type_range_tlvs.clone();
4439+
*custom_tlvs = &good_type_range_tlvs;
44404440
}
44414441
let encoded_value = msg.encode();
44424442
let inbound_msg = ReadableArgs::read(&mut Cursor::new(&encoded_value[..]), (None, &&node_signer)).unwrap();
@@ -4456,7 +4456,7 @@ mod tests {
44564456
payment_data: None,
44574457
payment_metadata: None,
44584458
keysend_preimage: None,
4459-
custom_tlvs: expected_custom_tlvs.clone(),
4459+
custom_tlvs: &expected_custom_tlvs,
44604460
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
44614461
cltv_expiry_height: 0xffffffff,
44624462
};

lightning/src/ln/onion_payment.rs

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

542542
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
@@ -357,8 +357,9 @@ fn test_onion_failure() {
357357
let session_priv = SecretKey::from_slice(&[3; 32]).unwrap();
358358
let cur_height = nodes[0].best_block_info().1 + 1;
359359
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
360+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
360361
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
361-
&route.paths[0], 40000, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
362+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
362363
let mut new_payloads = Vec::new();
363364
for payload in onion_payloads.drain(..) {
364365
new_payloads.push(BogusOnionHopData::new(payload));
@@ -375,8 +376,9 @@ fn test_onion_failure() {
375376
let session_priv = SecretKey::from_slice(&[3; 32]).unwrap();
376377
let cur_height = nodes[0].best_block_info().1 + 1;
377378
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
379+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
378380
let (mut onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
379-
&route.paths[0], 40000, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
381+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
380382
let mut new_payloads = Vec::new();
381383
for payload in onion_payloads.drain(..) {
382384
new_payloads.push(BogusOnionHopData::new(payload));
@@ -612,8 +614,9 @@ fn test_onion_failure() {
612614
let height = nodes[2].best_block_info().1;
613615
route.paths[0].hops[1].cltv_expiry_delta += CLTV_FAR_FAR_AWAY + route.paths[0].hops[0].cltv_expiry_delta + 1;
614616
let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
617+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
615618
let (onion_payloads, _, htlc_cltv) = onion_utils::build_onion_payloads(
616-
&route.paths[0], 40000, RecipientOnionFields::spontaneous_empty(), height, &None).unwrap();
619+
&route.paths[0], 40000, &recipient_onion_fields, height, &None).unwrap();
617620
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
618621
msg.cltv_expiry = htlc_cltv;
619622
msg.onion_routing_packet = onion_packet;
@@ -948,8 +951,9 @@ fn test_always_create_tlv_format_onion_payloads() {
948951
assert!(!hops[1].node_features.supports_variable_length_onion());
949952

950953
let cur_height = nodes[0].best_block_info().1 + 1;
954+
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
951955
let (onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(
952-
&route.paths[0], 40000, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
956+
&route.paths[0], 40000, &recipient_onion_fields, cur_height, &None).unwrap();
953957

954958
match onion_payloads[0] {
955959
msgs::OutboundOnionPayload::Forward {..} => {},
@@ -1203,9 +1207,10 @@ fn test_phantom_invalid_onion_payload() {
12031207
let height = nodes[0].best_block_info().1;
12041208
let session_priv = SecretKey::from_slice(&session_priv).unwrap();
12051209
let mut onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
1210+
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
12061211
let (mut onion_payloads, _, _) = onion_utils::build_onion_payloads(
12071212
&route.paths[0], msgs::MAX_VALUE_MSAT + 1,
1208-
RecipientOnionFields::secret_only(payment_secret), height + 1, &None).unwrap();
1213+
&recipient_onion_fields, height + 1, &None).unwrap();
12091214
// We only want to construct the onion packet for the last hop, not the entire route, so
12101215
// remove the first hop's payload and its keys.
12111216
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)