Skip to content

Commit e20d8c7

Browse files
committed
f - remove extra serialization in OnionHopData
1 parent fcbad48 commit e20d8c7

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

lightning/src/ln/msgs.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,19 +1944,13 @@ impl Writeable for OnionHopData {
19441944
custom_tlvs.push((5482373484, preimage_bytes));
19451945
}
19461946
custom_tlvs.sort_by_key(|(typ, _)| *typ);
1947-
let mut custom_tlv_stream = Vec::new();
1948-
for (typ, value) in custom_tlvs {
1949-
BigSize(typ).write(&mut custom_tlv_stream)?;
1950-
BigSize(value.len() as u64).write(&mut custom_tlv_stream)?;
1951-
custom_tlv_stream.write_all(&value)?;
1952-
}
19531947

19541948
_encode_varint_length_prefixed_tlv!(w, {
19551949
(2, HighZeroBytesDroppedBigSize(self.amt_to_forward), required),
19561950
(4, HighZeroBytesDroppedBigSize(self.outgoing_cltv_value), required),
19571951
(8, payment_data, option),
19581952
(16, payment_metadata.as_ref().map(|m| WithoutLength(m)), option)
1959-
}, &custom_tlv_stream);
1953+
}, &custom_tlvs);
19601954
},
19611955
}
19621956
Ok(())
@@ -2443,7 +2437,7 @@ mod tests {
24432437
use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
24442438
use crate::ln::msgs::{self, FinalOnionHopData, OnionErrorPacket, OnionHopDataFormat};
24452439
use crate::routing::gossip::{NodeAlias, NodeId};
2446-
use crate::util::ser::{Writeable, Writer, Readable, Hostname, TransactionU16LenLimited};
2440+
use crate::util::ser::{Writeable, Readable, Hostname, TransactionU16LenLimited};
24472441

24482442
use bitcoin::hashes::hex::FromHex;
24492443
use bitcoin::util::address::Address;

lightning/src/util/ser_macros.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,23 +191,35 @@ macro_rules! _get_varint_length_prefixed_tlv_length {
191191
#[doc(hidden)]
192192
#[macro_export]
193193
macro_rules! _encode_varint_length_prefixed_tlv {
194-
($stream: expr, {$(($type: expr, $field: expr, $fieldty: tt)),*}) => {
195-
_encode_varint_length_prefixed_tlv!($stream, {$(($type, $field, $fieldty)),*}, &[0u8; 0])
196-
};
197-
($stream: expr, {$(($type: expr, $field: expr, $fieldty: tt)),*}, $extra: expr) => { {
198-
// $extra should be a byte slice holding a valid TLV stream
194+
($stream: expr, {$(($type: expr, $field: expr, $fieldty: tt)),*}) => { {
195+
use alloc::vec::Vec;
196+
_encode_varint_length_prefixed_tlv!($stream, {$(($type, $field, $fieldty)),*}, Vec::<(u64, Vec<u8>)>::new())
197+
} };
198+
($stream: expr, {$(($type: expr, $field: expr, $fieldty: tt)),*}, $extra_tlvs: expr) => { {
199199
use $crate::util::ser::BigSize;
200200
let len = {
201201
#[allow(unused_mut)]
202202
let mut len = $crate::util::ser::LengthCalculatingWriter(0);
203203
$(
204204
$crate::_get_varint_length_prefixed_tlv_length!(len, $type, $field, $fieldty);
205205
)*
206-
len.0 + $extra.len()
206+
for (typ, value) in $extra_tlvs.iter() {
207+
$crate::_get_varint_length_prefixed_tlv_length!(len, *typ, *value, vec_type);
208+
}
209+
len.0
207210
};
208211
BigSize(len as u64).write($stream)?;
209212
$crate::encode_tlv_stream!($stream, { $(($type, $field, $fieldty)),* });
210-
$stream.write_all($extra)?;
213+
for (typ, value) in $extra_tlvs.iter() {
214+
$crate::_encode_tlv!($stream, *typ, *value, vec_type);
215+
}
216+
217+
#[cfg(debug_assertions)] {
218+
let mut last_seen: Option<u64> = None;
219+
for (typ, _) in $extra_tlvs.iter() {
220+
$crate::_check_encoded_tlv_order!(last_seen, *typ, vec_type);
221+
}
222+
}
211223
} };
212224
}
213225

@@ -772,6 +784,7 @@ macro_rules! _init_and_read_tlv_fields {
772784
/// For example,
773785
/// ```
774786
/// # use lightning::{impl_writeable_tlv_based, _encode_varint_length_prefixed_tlv};
787+
/// # extern crate alloc;
775788
/// struct LightningMessage {
776789
/// tlv_integer: u32,
777790
/// tlv_default_integer: u32,
@@ -1052,7 +1065,7 @@ mod tests {
10521065
use crate::io::{self, Cursor};
10531066
use crate::prelude::*;
10541067
use crate::ln::msgs::DecodeError;
1055-
use crate::util::ser::{Writer, Writeable, HighZeroBytesDroppedBigSize, VecWriter};
1068+
use crate::util::ser::{Writeable, HighZeroBytesDroppedBigSize, VecWriter};
10561069
use bitcoin::secp256k1::PublicKey;
10571070

10581071
// The BOLT TLV test cases don't include any tests which use our "required-value" logic since

0 commit comments

Comments
 (0)