Skip to content

Commit 263bf9e

Browse files
committed
Use TLVs inside of serialization of Event variants
1 parent 2eb7db9 commit 263bf9e

File tree

3 files changed

+99
-41
lines changed

3 files changed

+99
-41
lines changed

lightning/src/util/events.rs

Lines changed: 95 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use ln::msgs;
1818
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
1919
use chain::keysinterface::SpendableOutputDescriptor;
20-
use util::ser::{Writeable, Writer, MaybeReadable, Readable};
20+
use util::ser::{Writeable, Writer, MaybeReadable, Readable, VecReadWrapper, VecWriteWrapper};
2121

2222
use bitcoin::blockdata::script::Script;
2323

@@ -146,14 +146,20 @@ impl Writeable for Event {
146146
},
147147
&Event::PaymentReceived { ref payment_hash, ref payment_preimage, ref payment_secret, ref amt, ref user_payment_id } => {
148148
1u8.write(writer)?;
149-
payment_hash.write(writer)?;
150-
payment_preimage.write(writer)?;
151-
payment_secret.write(writer)?;
152-
amt.write(writer)?;
153-
user_payment_id.write(writer)?;
149+
write_tlv_fields!(writer, {
150+
(0, payment_hash),
151+
(2, payment_secret),
152+
(4, amt),
153+
(6, user_payment_id),
154+
}, {
155+
(8, payment_preimage),
156+
});
154157
},
155158
&Event::PaymentSent { ref payment_preimage } => {
156159
2u8.write(writer)?;
160+
write_tlv_fields!(writer, {
161+
(0, payment_preimage),
162+
}, {});
157163
payment_preimage.write(writer)?;
158164
},
159165
&Event::PaymentFailed { ref payment_hash, ref rejected_by_dest,
@@ -163,24 +169,26 @@ impl Writeable for Event {
163169
ref error_data,
164170
} => {
165171
3u8.write(writer)?;
166-
payment_hash.write(writer)?;
167-
rejected_by_dest.write(writer)?;
168172
#[cfg(test)]
169173
error_code.write(writer)?;
170174
#[cfg(test)]
171175
error_data.write(writer)?;
176+
write_tlv_fields!(writer, {
177+
(0, payment_hash),
178+
(2, rejected_by_dest),
179+
}, {});
172180
},
173181
&Event::PendingHTLCsForwardable { time_forwardable: _ } => {
174182
4u8.write(writer)?;
183+
write_tlv_fields!(writer, {}, {});
175184
// We don't write the time_fordwardable out at all, as we presume when the user
176185
// deserializes us at least that much time has elapsed.
177186
},
178187
&Event::SpendableOutputs { ref outputs } => {
179188
5u8.write(writer)?;
180-
(outputs.len() as u64).write(writer)?;
181-
for output in outputs.iter() {
182-
output.write(writer)?;
183-
}
189+
write_tlv_fields!(writer, {
190+
(0, VecWriteWrapper(outputs)),
191+
}, {});
184192
},
185193
}
186194
Ok(())
@@ -190,34 +198,84 @@ impl MaybeReadable for Event {
190198
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Option<Self>, msgs::DecodeError> {
191199
match Readable::read(reader)? {
192200
0u8 => Ok(None),
193-
1u8 => Ok(Some(Event::PaymentReceived {
194-
payment_hash: Readable::read(reader)?,
195-
payment_preimage: Readable::read(reader)?,
196-
payment_secret: Readable::read(reader)?,
197-
amt: Readable::read(reader)?,
198-
user_payment_id: Readable::read(reader)?,
199-
})),
200-
2u8 => Ok(Some(Event::PaymentSent {
201-
payment_preimage: Readable::read(reader)?,
202-
})),
203-
3u8 => Ok(Some(Event::PaymentFailed {
204-
payment_hash: Readable::read(reader)?,
205-
rejected_by_dest: Readable::read(reader)?,
201+
1u8 => {
202+
let f = || {
203+
let mut payment_hash = PaymentHash([0; 32]);
204+
let mut payment_preimage = None;
205+
let mut payment_secret = PaymentSecret([0; 32]);
206+
let mut amt = 0;
207+
let mut user_payment_id = 0;
208+
read_tlv_fields!(reader, {
209+
(0, payment_hash),
210+
(2, payment_secret),
211+
(4, amt),
212+
(6, user_payment_id),
213+
}, {
214+
(8, payment_preimage),
215+
});
216+
Ok(Some(Event::PaymentReceived {
217+
payment_hash,
218+
payment_preimage,
219+
payment_secret,
220+
amt,
221+
user_payment_id,
222+
}))
223+
};
224+
f()
225+
},
226+
2u8 => {
227+
let f = || {
228+
let mut payment_preimage = PaymentPreimage([0; 32]);
229+
read_tlv_fields!(reader, {
230+
(0, payment_preimage),
231+
}, {});
232+
Ok(Some(Event::PaymentSent {
233+
payment_preimage,
234+
}))
235+
};
236+
f()
237+
},
238+
3u8 => {
239+
let f = || {
206240
#[cfg(test)]
207-
error_code: Readable::read(reader)?,
241+
let error_code = Readable::read(reader)?;
208242
#[cfg(test)]
209-
error_data: Readable::read(reader)?,
210-
})),
211-
4u8 => Ok(Some(Event::PendingHTLCsForwardable {
212-
time_forwardable: Duration::from_secs(0)
213-
})),
243+
let error_data = Readable::read(reader)?;
244+
let mut payment_hash = PaymentHash([0; 32]);
245+
let mut rejected_by_dest = false;
246+
read_tlv_fields!(reader, {
247+
(0, payment_hash),
248+
(2, rejected_by_dest),
249+
}, {});
250+
Ok(Some(Event::PaymentFailed {
251+
payment_hash,
252+
rejected_by_dest,
253+
#[cfg(test)]
254+
error_code,
255+
#[cfg(test)]
256+
error_data,
257+
}))
258+
};
259+
f()
260+
},
261+
4u8 => {
262+
let f = || {
263+
read_tlv_fields!(reader, {}, {});
264+
Ok(Some(Event::PendingHTLCsForwardable {
265+
time_forwardable: Duration::from_secs(0)
266+
}))
267+
};
268+
f()
269+
},
214270
5u8 => {
215-
let outputs_len: u64 = Readable::read(reader)?;
216-
let mut outputs = Vec::new();
217-
for _ in 0..outputs_len {
218-
outputs.push(Readable::read(reader)?);
219-
}
220-
Ok(Some(Event::SpendableOutputs { outputs }))
271+
let f = || {
272+
let mut outputs = VecReadWrapper(Vec::new());
273+
read_tlv_fields!(reader, {
274+
(0,outputs),
275+
}, {});
276+
Ok(Some(Event::SpendableOutputs { outputs: outputs.0 }))
277+
};
278+
f()
221279
},
222280
_ => Err(msgs::DecodeError::InvalidValue)
223281
}

lightning/src/util/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
#[macro_use]
1313
pub(crate) mod fuzz_wrappers;
1414

15+
#[macro_use]
16+
pub(crate) mod ser_macros;
17+
1518
pub mod events;
1619
pub mod errors;
1720
pub mod ser;
@@ -29,9 +32,6 @@ pub(crate) mod chacha20poly1305rfc;
2932
pub(crate) mod transaction_utils;
3033
pub(crate) mod scid_utils;
3134

32-
#[macro_use]
33-
pub(crate) mod ser_macros;
34-
3535
/// Logging macro utilities.
3636
#[macro_use]
3737
pub(crate) mod macro_logger;

lightning/src/util/ser_macros.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ macro_rules! read_tlv_fields {
317317
let tlv_len = ::util::ser::BigSize::read($stream)?;
318318
let mut rd = ::util::ser::FixedLengthReader::new($stream, tlv_len.0);
319319
decode_tlv!(&mut rd, {$(($reqtype, $reqfield)),*}, {$(($type, $field)),*});
320-
rd.eat_remaining().map_err(|_| DecodeError::ShortRead)?;
320+
rd.eat_remaining().map_err(|_| ::ln::msgs::DecodeError::ShortRead)?;
321321
} }
322322
}
323323

0 commit comments

Comments
 (0)