Skip to content

Commit 059bfe4

Browse files
Replace OnionHopData with OutboundPayload for outbound onions
Follows on from the previous commit, see its message
1 parent 8c43f49 commit 059bfe4

File tree

4 files changed

+77
-93
lines changed

4 files changed

+77
-93
lines changed

fuzz/src/msg_targets/msg_onion_hop_data.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ macro_rules! test_onion_payload_ser_roundtrip {
2121
if let Ok(inbound_payload_1) = <lightning::ln::msgs::InboundPayload as Readable>::read(&mut r) {
2222
let outbound_payload_1 = match inbound_payload_1 {
2323
lightning::ln::msgs::InboundPayload::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value } =>
24-
lightning::ln::msgs::OnionHopData { format: lightning::ln::msgs::OnionHopDataFormat::NonFinalNode { short_channel_id }, amt_to_forward, outgoing_cltv_value },
24+
lightning::ln::msgs::OutboundPayload::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value },
2525
lightning::ln::msgs::InboundPayload::Receive { payment_data, keysend_preimage, amt_msat, outgoing_cltv_value } =>
26-
lightning::ln::msgs::OnionHopData { format: lightning::ln::msgs::OnionHopDataFormat::FinalNode { payment_data, keysend_preimage }, amt_to_forward: amt_msat, outgoing_cltv_value },
26+
lightning::ln::msgs::OutboundPayload::Receive { payment_data, keysend_preimage, amt_msat, outgoing_cltv_value },
2727
};
2828
let mut w = VecWriter(Vec::new());
2929
outbound_payload_1.write(&mut w).unwrap();
@@ -32,9 +32,9 @@ macro_rules! test_onion_payload_ser_roundtrip {
3232
let inbound_payload_2 = <lightning::ln::msgs::InboundPayload as Readable>::read(&mut ::std::io::Cursor::new(&w.0)).unwrap();
3333
let outbound_payload_2 = match inbound_payload_2 {
3434
lightning::ln::msgs::InboundPayload::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value } =>
35-
lightning::ln::msgs::OnionHopData { format: lightning::ln::msgs::OnionHopDataFormat::NonFinalNode { short_channel_id }, amt_to_forward, outgoing_cltv_value },
35+
lightning::ln::msgs::OutboundPayload::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value },
3636
lightning::ln::msgs::InboundPayload::Receive { payment_data, keysend_preimage, amt_msat, outgoing_cltv_value } =>
37-
lightning::ln::msgs::OnionHopData { format: lightning::ln::msgs::OnionHopDataFormat::FinalNode { payment_data, keysend_preimage }, amt_to_forward: amt_msat, outgoing_cltv_value },
37+
lightning::ln::msgs::OutboundPayload::Receive { payment_data, keysend_preimage, amt_msat, outgoing_cltv_value },
3838
};
3939
let mut w_two = VecWriter(Vec::new());
4040
outbound_payload_2 .write(&mut w_two).unwrap();

lightning/src/ln/msgs.rs

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,24 +1153,20 @@ mod fuzzy_internal_msgs {
11531153
},
11541154
}
11551155

1156-
pub enum OnionHopDataFormat {
1157-
NonFinalNode {
1156+
pub enum OutboundPayload {
1157+
Forward {
11581158
short_channel_id: u64,
1159+
amt_to_forward: u64,
1160+
outgoing_cltv_value: u32,
11591161
},
1160-
FinalNode {
1162+
Receive {
11611163
payment_data: Option<FinalOnionHopData>,
11621164
keysend_preimage: Option<PaymentPreimage>,
1165+
amt_msat: u64,
1166+
outgoing_cltv_value: u32,
11631167
},
11641168
}
11651169

1166-
pub struct OnionHopData {
1167-
pub format: OnionHopDataFormat,
1168-
/// The value, in msat, of the payment after this hop's fee is deducted.
1169-
/// Message serialization may panic if this value is more than 21 million Bitcoin.
1170-
pub amt_to_forward: u64,
1171-
pub outgoing_cltv_value: u32,
1172-
}
1173-
11741170
pub struct DecodedOnionErrorPacket {
11751171
pub(crate) hmac: [u8; 32],
11761172
pub(crate) failuremsg: Vec<u8>,
@@ -1580,20 +1576,22 @@ impl Readable for FinalOnionHopData {
15801576
}
15811577
}
15821578

1583-
impl Writeable for OnionHopData {
1579+
impl Writeable for OutboundPayload {
15841580
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1585-
match self.format {
1586-
OnionHopDataFormat::NonFinalNode { short_channel_id } => {
1581+
match self {
1582+
Self::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value } => {
15871583
_encode_varint_length_prefixed_tlv!(w, {
1588-
(2, HighZeroBytesDroppedBigSize(self.amt_to_forward), required),
1589-
(4, HighZeroBytesDroppedBigSize(self.outgoing_cltv_value), required),
1584+
(2, HighZeroBytesDroppedBigSize(*amt_to_forward), required),
1585+
(4, HighZeroBytesDroppedBigSize(*outgoing_cltv_value), required),
15901586
(6, short_channel_id, required)
15911587
});
15921588
},
1593-
OnionHopDataFormat::FinalNode { ref payment_data, ref keysend_preimage } => {
1589+
Self::Receive {
1590+
ref payment_data, ref keysend_preimage, amt_msat, outgoing_cltv_value
1591+
} => {
15941592
_encode_varint_length_prefixed_tlv!(w, {
1595-
(2, HighZeroBytesDroppedBigSize(self.amt_to_forward), required),
1596-
(4, HighZeroBytesDroppedBigSize(self.outgoing_cltv_value), required),
1593+
(2, HighZeroBytesDroppedBigSize(*amt_msat), required),
1594+
(4, HighZeroBytesDroppedBigSize(*outgoing_cltv_value), required),
15971595
(8, payment_data, option),
15981596
(5482373484, keysend_preimage, option)
15991597
});
@@ -2062,7 +2060,7 @@ mod tests {
20622060
use crate::ln::{PaymentPreimage, PaymentHash, PaymentSecret};
20632061
use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
20642062
use crate::ln::msgs;
2065-
use crate::ln::msgs::{FinalOnionHopData, OptionalField, OnionErrorPacket, OnionHopDataFormat};
2063+
use crate::ln::msgs::{FinalOnionHopData, OptionalField, OnionErrorPacket};
20662064
use crate::routing::gossip::NodeId;
20672065
use crate::util::ser::{Writeable, Readable, Hostname};
20682066

@@ -2770,14 +2768,12 @@ mod tests {
27702768

27712769
#[test]
27722770
fn encoding_nonfinal_onion_hop_data() {
2773-
let msg = msgs::OnionHopData {
2774-
format: OnionHopDataFormat::NonFinalNode {
2775-
short_channel_id: 0xdeadbeef1bad1dea,
2776-
},
2771+
let outbound_msg = msgs::OutboundPayload::Forward {
2772+
short_channel_id: 0xdeadbeef1bad1dea,
27772773
amt_to_forward: 0x0badf00d01020304,
27782774
outgoing_cltv_value: 0xffffffff,
27792775
};
2780-
let encoded_value = msg.encode();
2776+
let encoded_value = outbound_msg.encode();
27812777
let target_value = hex::decode("1a02080badf00d010203040404ffffffff0608deadbeef1bad1dea").unwrap();
27822778
assert_eq!(encoded_value, target_value);
27832779

@@ -2791,15 +2787,13 @@ mod tests {
27912787

27922788
#[test]
27932789
fn encoding_final_onion_hop_data() {
2794-
let msg = msgs::OnionHopData {
2795-
format: OnionHopDataFormat::FinalNode {
2796-
payment_data: None,
2797-
keysend_preimage: None,
2798-
},
2799-
amt_to_forward: 0x0badf00d01020304,
2790+
let outbound_msg = msgs::OutboundPayload::Receive {
2791+
payment_data: None,
2792+
keysend_preimage: None,
2793+
amt_msat: 0x0badf00d01020304,
28002794
outgoing_cltv_value: 0xffffffff,
28012795
};
2802-
let encoded_value = msg.encode();
2796+
let encoded_value = outbound_msg.encode();
28032797
let target_value = hex::decode("1002080badf00d010203040404ffffffff").unwrap();
28042798
assert_eq!(encoded_value, target_value);
28052799

@@ -2813,18 +2807,16 @@ mod tests {
28132807
#[test]
28142808
fn encoding_final_onion_hop_data_with_secret() {
28152809
let expected_payment_secret = PaymentSecret([0x42u8; 32]);
2816-
let msg = msgs::OnionHopData {
2817-
format: OnionHopDataFormat::FinalNode {
2818-
payment_data: Some(FinalOnionHopData {
2819-
payment_secret: expected_payment_secret,
2820-
total_msat: 0x1badca1f
2821-
}),
2822-
keysend_preimage: None,
2823-
},
2824-
amt_to_forward: 0x0badf00d01020304,
2810+
let outbound_msg = msgs::OutboundPayload::Receive {
2811+
payment_data: Some(FinalOnionHopData {
2812+
payment_secret: expected_payment_secret,
2813+
total_msat: 0x1badca1f
2814+
}),
2815+
keysend_preimage: None,
2816+
amt_msat: 0x0badf00d01020304,
28252817
outgoing_cltv_value: 0xffffffff,
28262818
};
2827-
let encoded_value = msg.encode();
2819+
let encoded_value = outbound_msg.encode();
28282820
let target_value = hex::decode("3602080badf00d010203040404ffffffff082442424242424242424242424242424242424242424242424242424242424242421badca1f").unwrap();
28292821
assert_eq!(encoded_value, target_value);
28302822

@@ -2994,20 +2986,18 @@ mod tests {
29942986
// see above test, needs to be a separate method for use of the serialization macros.
29952987
fn encode_big_payload() -> Result<Vec<u8>, io::Error> {
29962988
use crate::util::ser::HighZeroBytesDroppedBigSize;
2997-
let payload = msgs::OnionHopData {
2998-
format: OnionHopDataFormat::NonFinalNode {
2999-
short_channel_id: 0xdeadbeef1bad1dea,
3000-
},
2989+
let payload = msgs::OutboundPayload::Forward {
2990+
short_channel_id: 0xdeadbeef1bad1dea,
30012991
amt_to_forward: 1000,
30022992
outgoing_cltv_value: 0xffffffff,
30032993
};
30042994
let mut encoded_payload = Vec::new();
30052995
let test_bytes = vec![42u8; 1000];
3006-
if let OnionHopDataFormat::NonFinalNode { short_channel_id } = payload.format {
2996+
if let msgs::OutboundPayload::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value } = payload {
30072997
_encode_varint_length_prefixed_tlv!(&mut encoded_payload, {
30082998
(1, test_bytes, vec_type),
3009-
(2, HighZeroBytesDroppedBigSize(payload.amt_to_forward), required),
3010-
(4, HighZeroBytesDroppedBigSize(payload.outgoing_cltv_value), required),
2999+
(2, HighZeroBytesDroppedBigSize(amt_to_forward), required),
3000+
(4, HighZeroBytesDroppedBigSize(outgoing_cltv_value), required),
30113001
(6, short_channel_id, required)
30123002
});
30133003
}

lightning/src/ln/onion_route_tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ struct BogusOnionHopData {
246246
data: Vec<u8>
247247
}
248248
impl BogusOnionHopData {
249-
fn new(orig: msgs::OnionHopData) -> Self {
249+
fn new(orig: msgs::OutboundPayload) -> Self {
250250
Self { data: orig.encode() }
251251
}
252252
}
@@ -811,15 +811,15 @@ fn test_always_create_tlv_format_onion_payloads() {
811811
let cur_height = nodes[0].best_block_info().1 + 1;
812812
let (onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0], 40000, &None, cur_height, &None).unwrap();
813813

814-
match onion_payloads[0].format {
815-
msgs::OnionHopDataFormat::NonFinalNode {..} => {},
814+
match onion_payloads[0] {
815+
msgs::OutboundPayload::Forward {..} => {},
816816
_ => { panic!(
817817
"Should have generated a `msgs::OnionHopDataFormat::NonFinalNode` payload for `hops[0]`,
818818
despite that the features signals no support for variable length onions"
819819
)}
820820
}
821-
match onion_payloads[1].format {
822-
msgs::OnionHopDataFormat::FinalNode {..} => {},
821+
match onion_payloads[1] {
822+
msgs::OutboundPayload::Receive {..} => {},
823823
_ => {panic!(
824824
"Should have generated a `msgs::OnionHopDataFormat::FinalNode` payload for `hops[1]`,
825825
despite that the features signals no support for variable length onions"

lightning/src/ln/onion_utils.rs

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -149,36 +149,36 @@ pub(super) fn construct_onion_keys<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T
149149
}
150150

151151
/// returns the hop data, as well as the first-hop value_msat and CLTV value we should send.
152-
pub(super) fn build_onion_payloads(path: &Vec<RouteHop>, total_msat: u64, payment_secret_option: &Option<PaymentSecret>, starting_htlc_offset: u32, keysend_preimage: &Option<PaymentPreimage>) -> Result<(Vec<msgs::OnionHopData>, u64, u32), APIError> {
152+
pub(super) fn build_onion_payloads(path: &Vec<RouteHop>, total_msat: u64, payment_secret_option: &Option<PaymentSecret>, starting_htlc_offset: u32, keysend_preimage: &Option<PaymentPreimage>) -> Result<(Vec<msgs::OutboundPayload>, u64, u32), APIError> {
153153
let mut cur_value_msat = 0u64;
154154
let mut cur_cltv = starting_htlc_offset;
155155
let mut last_short_channel_id = 0;
156-
let mut res: Vec<msgs::OnionHopData> = Vec::with_capacity(path.len());
156+
let mut res: Vec<msgs::OutboundPayload> = Vec::with_capacity(path.len());
157157

158158
for (idx, hop) in path.iter().rev().enumerate() {
159159
// First hop gets special values so that it can check, on receipt, that everything is
160160
// exactly as it should be (and the next hop isn't trying to probe to find out if we're
161161
// the intended recipient).
162162
let value_msat = if cur_value_msat == 0 { hop.fee_msat } else { cur_value_msat };
163163
let cltv = if cur_cltv == starting_htlc_offset { hop.cltv_expiry_delta + starting_htlc_offset } else { cur_cltv };
164-
res.insert(0, msgs::OnionHopData {
165-
format: if idx == 0 {
166-
msgs::OnionHopDataFormat::FinalNode {
167-
payment_data: if let &Some(ref payment_secret) = payment_secret_option {
168-
Some(msgs::FinalOnionHopData {
169-
payment_secret: payment_secret.clone(),
170-
total_msat,
171-
})
172-
} else { None },
173-
keysend_preimage: *keysend_preimage,
174-
}
175-
} else {
176-
msgs::OnionHopDataFormat::NonFinalNode {
177-
short_channel_id: last_short_channel_id,
178-
}
179-
},
180-
amt_to_forward: value_msat,
181-
outgoing_cltv_value: cltv,
164+
res.insert(0, if idx == 0 {
165+
msgs::OutboundPayload::Receive {
166+
payment_data: if let &Some(ref payment_secret) = payment_secret_option {
167+
Some(msgs::FinalOnionHopData {
168+
payment_secret: payment_secret.clone(),
169+
total_msat,
170+
})
171+
} else { None },
172+
keysend_preimage: *keysend_preimage,
173+
amt_msat: value_msat,
174+
outgoing_cltv_value: cltv,
175+
}
176+
} else {
177+
msgs::OutboundPayload::Forward {
178+
short_channel_id: last_short_channel_id,
179+
amt_to_forward: value_msat,
180+
outgoing_cltv_value: cltv,
181+
}
182182
});
183183
cur_value_msat += hop.fee_msat;
184184
if cur_value_msat >= 21000000 * 100000000 * 1000 {
@@ -207,7 +207,7 @@ fn shift_slice_right(arr: &mut [u8], amt: usize) {
207207
}
208208
}
209209

210-
pub(super) fn route_size_insane(payloads: &Vec<msgs::OnionHopData>) -> bool {
210+
pub(super) fn route_size_insane(payloads: &Vec<msgs::OutboundPayload>) -> bool {
211211
let mut len = 0;
212212
for payload in payloads.iter() {
213213
let mut payload_len = LengthCalculatingWriter(0);
@@ -222,7 +222,7 @@ pub(super) fn route_size_insane(payloads: &Vec<msgs::OnionHopData>) -> bool {
222222
}
223223

224224
/// panics if route_size_insane(payloads)
225-
pub(super) fn construct_onion_packet(payloads: Vec<msgs::OnionHopData>, onion_keys: Vec<OnionKeys>, prng_seed: [u8; 32], associated_data: &PaymentHash) -> msgs::OnionPacket {
225+
pub(super) fn construct_onion_packet(payloads: Vec<msgs::OutboundPayload>, onion_keys: Vec<OnionKeys>, prng_seed: [u8; 32], associated_data: &PaymentHash) -> msgs::OnionPacket {
226226
let mut packet_data = [0; ONION_DATA_LEN];
227227

228228
let mut chacha = ChaCha20::new(&prng_seed, &[0; 8]);
@@ -979,10 +979,8 @@ mod tests {
979979
// with raw hex instead of our in-memory enums, as the payloads contains custom types, and
980980
// we have no way of representing that with our enums.
981981
let payloads = vec!(
982-
RawOnionHopData::new(msgs::OnionHopData {
983-
format: msgs::OnionHopDataFormat::NonFinalNode {
984-
short_channel_id: 1,
985-
},
982+
RawOnionHopData::new(msgs::OutboundPayload::Forward {
983+
short_channel_id: 1,
986984
amt_to_forward: 15000,
987985
outgoing_cltv_value: 1500,
988986
}),
@@ -1004,17 +1002,13 @@ mod tests {
10041002
RawOnionHopData {
10051003
data: hex::decode("52020236b00402057806080000000000000002fd02013c0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f").unwrap(),
10061004
},
1007-
RawOnionHopData::new(msgs::OnionHopData {
1008-
format: msgs::OnionHopDataFormat::NonFinalNode {
1009-
short_channel_id: 3,
1010-
},
1005+
RawOnionHopData::new(msgs::OutboundPayload::Forward {
1006+
short_channel_id: 3,
10111007
amt_to_forward: 12500,
10121008
outgoing_cltv_value: 1250,
10131009
}),
1014-
RawOnionHopData::new(msgs::OnionHopData {
1015-
format: msgs::OnionHopDataFormat::NonFinalNode {
1016-
short_channel_id: 4,
1017-
},
1010+
RawOnionHopData::new(msgs::OutboundPayload::Forward {
1011+
short_channel_id: 4,
10181012
amt_to_forward: 10000,
10191013
outgoing_cltv_value: 1000,
10201014
}),
@@ -1092,7 +1086,7 @@ mod tests {
10921086
data: Vec<u8>
10931087
}
10941088
impl RawOnionHopData {
1095-
fn new(orig: msgs::OnionHopData) -> Self {
1089+
fn new(orig: msgs::OutboundPayload) -> Self {
10961090
Self { data: orig.encode() }
10971091
}
10981092
}

0 commit comments

Comments
 (0)