Skip to content

Commit 605b5d2

Browse files
author
Antoine Riard
committed
Implement Writeable/Readable for Option<T>
1 parent e953453 commit 605b5d2

File tree

7 files changed

+66
-106
lines changed

7 files changed

+66
-106
lines changed

src/ln/channel.rs

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3689,14 +3689,6 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
36893689
});
36903690
}
36913691

3692-
macro_rules! read_option { () => {
3693-
match <u8 as Readable<R>>::read(reader)? {
3694-
0 => None,
3695-
1 => Some(Readable::read(reader)?),
3696-
_ => return Err(DecodeError::InvalidValue { byte: None }),
3697-
}
3698-
} }
3699-
37003692
let pending_outbound_htlc_count: u64 = Readable::read(reader)?;
37013693
let mut pending_outbound_htlcs = Vec::with_capacity(cmp::min(pending_outbound_htlc_count as usize, OUR_MAX_HTLCS as usize));
37023694
for _ in 0..pending_outbound_htlc_count {
@@ -3706,7 +3698,7 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
37063698
cltv_expiry: Readable::read(reader)?,
37073699
payment_hash: Readable::read(reader)?,
37083700
source: Readable::read(reader)?,
3709-
fail_reason: read_option!(),
3701+
fail_reason: Readable::read(reader)?,
37103702
state: match <u8 as Readable<R>>::read(reader)? {
37113703
0 => OutboundHTLCState::LocalAnnounced(Box::new(Readable::read(reader)?)),
37123704
1 => OutboundHTLCState::Committed,
@@ -3764,8 +3756,8 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
37643756
monitor_pending_failures.push((Readable::read(reader)?, Readable::read(reader)?, Readable::read(reader)?));
37653757
}
37663758

3767-
let pending_update_fee = read_option!();
3768-
let holding_cell_update_fee = read_option!();
3759+
let pending_update_fee = Readable::read(reader)?;
3760+
let holding_cell_update_fee = Readable::read(reader)?;
37693761

37703762
let next_local_htlc_id = Readable::read(reader)?;
37713763
let next_remote_htlc_id = Readable::read(reader)?;
@@ -3787,8 +3779,8 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
37873779
_ => return Err(DecodeError::InvalidValue { byte: None }),
37883780
};
37893781

3790-
let funding_tx_confirmed_in = read_option!();
3791-
let short_channel_id = read_option!();
3782+
let funding_tx_confirmed_in = Readable::read(reader)?;
3783+
let short_channel_id = Readable::read(reader)?;
37923784

37933785
let last_block_connected = Readable::read(reader)?;
37943786
let funding_tx_confirmations = Readable::read(reader)?;
@@ -3803,17 +3795,17 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
38033795
let their_max_accepted_htlcs = Readable::read(reader)?;
38043796
let minimum_depth = Readable::read(reader)?;
38053797

3806-
let their_funding_pubkey = read_option!();
3807-
let their_revocation_basepoint = read_option!();
3808-
let their_payment_basepoint = read_option!();
3809-
let their_delayed_payment_basepoint = read_option!();
3810-
let their_htlc_basepoint = read_option!();
3811-
let their_cur_commitment_point = read_option!();
3798+
let their_funding_pubkey = Readable::read(reader)?;
3799+
let their_revocation_basepoint = Readable::read(reader)?;
3800+
let their_payment_basepoint = Readable::read(reader)?;
3801+
let their_delayed_payment_basepoint = Readable::read(reader)?;
3802+
let their_htlc_basepoint = Readable::read(reader)?;
3803+
let their_cur_commitment_point = Readable::read(reader)?;
38123804

3813-
let their_prev_commitment_point = read_option!();
3805+
let their_prev_commitment_point = Readable::read(reader)?;
38143806
let their_node_id = Readable::read(reader)?;
38153807

3816-
let their_shutdown_scriptpubkey = read_option!();
3808+
let their_shutdown_scriptpubkey = Readable::read(reader)?;
38173809
let (monitor_last_block, channel_monitor) = ReadableArgs::read(reader, logger.clone())?;
38183810
// We drop the ChannelMonitor's last block connected hash cause we don't actually bother
38193811
// doing full block connection operations on the internal CHannelMonitor copies

src/ln/channelmanager.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2612,12 +2612,7 @@ const MIN_SERIALIZATION_VERSION: u8 = 1;
26122612

26132613
impl Writeable for PendingForwardHTLCInfo {
26142614
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
2615-
if let &Some(ref onion) = &self.onion_packet {
2616-
1u8.write(writer)?;
2617-
onion.write(writer)?;
2618-
} else {
2619-
0u8.write(writer)?;
2620-
}
2615+
self.onion_packet.write(writer)?;
26212616
self.incoming_shared_secret.write(writer)?;
26222617
self.payment_hash.write(writer)?;
26232618
self.short_channel_id.write(writer)?;
@@ -2629,13 +2624,8 @@ impl Writeable for PendingForwardHTLCInfo {
26292624

26302625
impl<R: ::std::io::Read> Readable<R> for PendingForwardHTLCInfo {
26312626
fn read(reader: &mut R) -> Result<PendingForwardHTLCInfo, DecodeError> {
2632-
let onion_packet = match <u8 as Readable<R>>::read(reader)? {
2633-
0 => None,
2634-
1 => Some(msgs::OnionPacket::read(reader)?),
2635-
_ => return Err(DecodeError::InvalidValue { byte: None }),
2636-
};
26372627
Ok(PendingForwardHTLCInfo {
2638-
onion_packet,
2628+
onion_packet: Readable::read(reader)?,
26392629
incoming_shared_secret: Readable::read(reader)?,
26402630
payment_hash: Readable::read(reader)?,
26412631
short_channel_id: Readable::read(reader)?,

src/ln/channelmonitor.rs

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,33 +1925,17 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
19251925
let delayed_payment_base_key = Readable::read(reader)?;
19261926
let payment_base_key = Readable::read(reader)?;
19271927
let shutdown_pubkey = Readable::read(reader)?;
1928-
let prev_latest_per_commitment_point = match <u8 as Readable<R>>::read(reader)? {
1929-
0 => None,
1930-
1 => Some(Readable::read(reader)?),
1931-
_ => return Err(DecodeError::InvalidValue { byte: None }),
1932-
};
1933-
let latest_per_commitment_point = match <u8 as Readable<R>>::read(reader)? {
1934-
0 => None,
1935-
1 => Some(Readable::read(reader)?),
1936-
_ => return Err(DecodeError::InvalidValue { byte: None }),
1937-
};
1928+
let prev_latest_per_commitment_point = Readable::read(reader)?;
1929+
let latest_per_commitment_point = Readable::read(reader)?;
19381930
// Technically this can fail and serialize fail a round-trip, but only for serialization of
19391931
// barely-init'd ChannelMonitors that we can't do anything with.
19401932
let outpoint = OutPoint {
19411933
txid: Readable::read(reader)?,
19421934
index: Readable::read(reader)?,
19431935
};
19441936
let funding_info = Some((outpoint, Readable::read(reader)?));
1945-
let current_remote_commitment_txid = match <u8 as Readable<R>>::read(reader)? {
1946-
0 => None,
1947-
1 => Some(Readable::read(reader)?),
1948-
_ => return Err(DecodeError::InvalidValue { byte: None }),
1949-
};
1950-
let prev_remote_commitment_txid = match <u8 as Readable<R>>::read(reader)? {
1951-
0 => None,
1952-
1 => Some(Readable::read(reader)?),
1953-
_ => return Err(DecodeError::InvalidValue { byte: None }),
1954-
};
1937+
let current_remote_commitment_txid = Readable::read(reader)?;
1938+
let prev_remote_commitment_txid = Readable::read(reader)?;
19551939
Storage::Local {
19561940
revocation_base_key,
19571941
htlc_base_key,
@@ -2014,13 +1998,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
20141998
macro_rules! read_htlc_source {
20151999
() => {
20162000
{
2017-
(Readable::read(reader)?, Readable::read(reader)?,
2018-
match <u8 as Readable<R>>::read(reader)? {
2019-
0 => None,
2020-
1 => Some(Readable::read(reader)?),
2021-
_ => return Err(DecodeError::InvalidValue { byte: None }),
2022-
}
2023-
)
2001+
(Readable::read(reader)?, Readable::read(reader)?, Readable::read(reader)?)
20242002
}
20252003
}
20262004
}

src/ln/msgs.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -784,8 +784,8 @@ impl From<::std::io::Error> for DecodeError {
784784
}
785785

786786
impl_writeable_len_match!(AcceptChannel, {
787-
{AcceptChannel{ shutdown_scriptpubkey: Some(ref script), ..}, 270 + 2 + script.len()},
788-
{_, 270}
787+
{AcceptChannel{ shutdown_scriptpubkey: Some(ref script), ..}, 271 + 2 + script.len()},
788+
{_, 271}
789789
}, {
790790
temporary_channel_id,
791791
dust_limit_satoshis,
@@ -905,8 +905,8 @@ impl_writeable_len_match!(Init, {
905905
});
906906

907907
impl_writeable_len_match!(OpenChannel, {
908-
{ OpenChannel { shutdown_scriptpubkey: Some(ref script), .. }, 319 + 2 + script.len() },
909-
{ OpenChannel { shutdown_scriptpubkey: None, .. }, 319 }
908+
{ OpenChannel { shutdown_scriptpubkey: Some(ref script), .. }, 320 + 2 + script.len() },
909+
{ OpenChannel { shutdown_scriptpubkey: None, .. }, 320 }
910910
}, {
911911
chain_hash,
912912
temporary_channel_id,

src/ln/peer_handler.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,14 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
478478
log_debug!(self, "Got a channel/node announcement with an known required feature flag, you may want to udpate!");
479479
continue;
480480
},
481-
msgs::DecodeError::InvalidValue { .. } => return Err(PeerHandleError{ no_connection_possible: false }),
482-
msgs::DecodeError::ShortRead => return Err(PeerHandleError{ no_connection_possible: false }),
481+
msgs::DecodeError::InvalidValue { .. } => {
482+
log_debug!(self, "Got an invalid value while deserializing message");
483+
return Err(PeerHandleError{ no_connection_possible: false });
484+
},
485+
msgs::DecodeError::ShortRead => {
486+
log_debug!(self, "Deserialization failed due to shortness of message");
487+
return Err(PeerHandleError{ no_connection_possible: false });
488+
},
483489
msgs::DecodeError::ExtraAddressesPerType => {
484490
log_debug!(self, "Error decoding message, ignoring due to lnd spec incompatibility. See https://github.com/lightningnetwork/lnd/issues/1407");
485491
continue;

src/ln/router.rs

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,7 @@ impl<R: ::std::io::Read> Readable<R> for DirectionalChannelInfo {
126126
let htlc_minimum_msat = Readable::read(reader)?;
127127
let fee_base_msat = Readable::read(reader)?;
128128
let fee_proportional_millionths = Readable::read(reader)?;
129-
let last_update_message = match <u8 as Readable<R>>::read(reader)? {
130-
0 => None,
131-
1 => Some(msgs::ChannelUpdate::read(reader)?),
132-
_ => return Err(DecodeError::InvalidValue { byte: None }),
133-
};
129+
let last_update_message = Readable::read(reader)?;
134130
Ok(DirectionalChannelInfo {
135131
src_node_id,
136132
last_update,
@@ -182,11 +178,7 @@ impl<R: ::std::io::Read> Readable<R> for ChannelInfo {
182178
let features = Readable::read(reader)?;
183179
let one_to_two = Readable::read(reader)?;
184180
let two_to_one = Readable::read(reader)?;
185-
let announcement_message = match <u8 as Readable<R>>::read(reader)? {
186-
0 => None,
187-
1 => Some(msgs::ChannelAnnouncement::read(reader)?),
188-
_ => return Err(DecodeError::InvalidValue { byte: None }),
189-
};
181+
let announcement_message = Readable::read(reader)?;
190182
Ok(ChannelInfo {
191183
features,
192184
one_to_two,
@@ -268,13 +260,7 @@ impl<R: ::std::io::Read> Readable<R> for NodeInfo {
268260
for _ in 0..addresses_count {
269261
addresses.push(Readable::read(reader)?);
270262
}
271-
let announcement_message = match <u8 as Readable<R>>::read(reader)? {
272-
0 => None,
273-
1 => Some(msgs::NodeAnnouncement::read(reader)?),
274-
_ => return Err(DecodeError::InvalidValue { byte: None }),
275-
276-
277-
};
263+
let announcement_message = Readable::read(reader)?;
278264
Ok(NodeInfo {
279265
channels,
280266
lowest_inbound_channel_fee_base_msat,

src/util/ser.rs

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -306,29 +306,6 @@ impl<R: Read> Readable<R> for Script {
306306
}
307307
}
308308

309-
impl Writeable for Option<Script> {
310-
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
311-
if let &Some(ref script) = self {
312-
script.write(w)?;
313-
}
314-
Ok(())
315-
}
316-
}
317-
318-
impl<R: Read> Readable<R> for Option<Script> {
319-
fn read(r: &mut R) -> Result<Self, DecodeError> {
320-
match <u16 as Readable<R>>::read(r) {
321-
Ok(len) => {
322-
let mut buf = vec![0; len as usize];
323-
r.read_exact(&mut buf)?;
324-
Ok(Some(Script::from(buf)))
325-
},
326-
Err(DecodeError::ShortRead) => Ok(None),
327-
Err(e) => Err(e)
328-
}
329-
}
330-
}
331-
332309
impl Writeable for PublicKey {
333310
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
334311
self.serialize().write(w)
@@ -417,3 +394,34 @@ impl<R: Read> Readable<R> for PaymentHash {
417394
Ok(PaymentHash(buf))
418395
}
419396
}
397+
398+
impl<T: Writeable> Writeable for Option<T> {
399+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
400+
match *self {
401+
None => 0u8.write(w)?,
402+
Some(ref data) => {
403+
1u8.write(w)?;
404+
data.write(w)?;
405+
}
406+
}
407+
Ok(())
408+
}
409+
}
410+
411+
impl<R, T> Readable<R> for Option<T>
412+
where R: Read,
413+
T: Readable<R>
414+
{
415+
fn read(r: &mut R) -> Result<Self, DecodeError> {
416+
match <u8 as Readable<R>>::read(r) {
417+
Ok(res) => {
418+
match res {
419+
0 => Ok(None),
420+
1 => Ok(Some(Readable::read(r)?)),
421+
_ => return Err(DecodeError::InvalidValue { byte: None }),
422+
}
423+
},
424+
Err(_) => return Ok(None),
425+
}
426+
}
427+
}

0 commit comments

Comments
 (0)