Skip to content

Commit 58d3b14

Browse files
author
Antoine Riard
committed
Implement Writeable/Readable for Option<T>
Add OptionalField in OpenChannel, AcceptChannel ChannelReestablish to avoid serialization implementation conflicts
1 parent 2539cd4 commit 58d3b14

File tree

7 files changed

+117
-115
lines changed

7 files changed

+117
-115
lines changed

src/ln/channel.rs

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use secp256k1::{Secp256k1,Message,Signature};
1515
use secp256k1;
1616

1717
use ln::msgs;
18-
use ln::msgs::DecodeError;
18+
use ln::msgs::{DecodeError, OptionalField};
1919
use ln::channelmonitor::ChannelMonitor;
2020
use ln::channelmanager::{PendingHTLCStatus, HTLCSource, HTLCFailReason, HTLCFailureMsg, PendingForwardHTLCInfo, RAACommitmentOrder, PaymentPreimage, PaymentHash};
2121
use ln::chan_utils::{TxCreationKeys,HTLCOutputInCommitment,HTLC_SUCCESS_TX_WEIGHT,HTLC_TIMEOUT_TX_WEIGHT};
@@ -2946,7 +2946,7 @@ impl Channel {
29462946
htlc_basepoint: PublicKey::from_secret_key(&self.secp_ctx, &self.local_keys.htlc_base_key),
29472947
first_per_commitment_point: PublicKey::from_secret_key(&self.secp_ctx, &local_commitment_secret),
29482948
channel_flags: if self.config.announced_channel {1} else {0},
2949-
shutdown_scriptpubkey: None,
2949+
shutdown_scriptpubkey: OptionalField::Absent
29502950
}
29512951
}
29522952

@@ -2978,7 +2978,7 @@ impl Channel {
29782978
delayed_payment_basepoint: PublicKey::from_secret_key(&self.secp_ctx, &self.local_keys.delayed_payment_base_key),
29792979
htlc_basepoint: PublicKey::from_secret_key(&self.secp_ctx, &self.local_keys.htlc_base_key),
29802980
first_per_commitment_point: PublicKey::from_secret_key(&self.secp_ctx, &local_commitment_secret),
2981-
shutdown_scriptpubkey: None,
2981+
shutdown_scriptpubkey: OptionalField::Absent
29822982
}
29832983
}
29842984

@@ -3106,7 +3106,7 @@ impl Channel {
31063106
// dropped this channel on disconnect as it hasn't yet reached FundingSent so we can't
31073107
// overflow here.
31083108
next_remote_commitment_number: INITIAL_COMMITMENT_NUMBER - self.cur_remote_commitment_transaction_number - 1,
3109-
data_loss_protect: None,
3109+
data_loss_protect: OptionalField::Absent,
31103110
}
31113111
}
31123112

@@ -3691,14 +3691,6 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
36913691
});
36923692
}
36933693

3694-
macro_rules! read_option { () => {
3695-
match <u8 as Readable<R>>::read(reader)? {
3696-
0 => None,
3697-
1 => Some(Readable::read(reader)?),
3698-
_ => return Err(DecodeError::InvalidValue),
3699-
}
3700-
} }
3701-
37023694
let pending_outbound_htlc_count: u64 = Readable::read(reader)?;
37033695
let mut pending_outbound_htlcs = Vec::with_capacity(cmp::min(pending_outbound_htlc_count as usize, OUR_MAX_HTLCS as usize));
37043696
for _ in 0..pending_outbound_htlc_count {
@@ -3708,7 +3700,7 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
37083700
cltv_expiry: Readable::read(reader)?,
37093701
payment_hash: Readable::read(reader)?,
37103702
source: Readable::read(reader)?,
3711-
fail_reason: read_option!(),
3703+
fail_reason: Readable::read(reader)?,
37123704
state: match <u8 as Readable<R>>::read(reader)? {
37133705
0 => OutboundHTLCState::LocalAnnounced(Box::new(Readable::read(reader)?)),
37143706
1 => OutboundHTLCState::Committed,
@@ -3766,8 +3758,8 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
37663758
monitor_pending_failures.push((Readable::read(reader)?, Readable::read(reader)?, Readable::read(reader)?));
37673759
}
37683760

3769-
let pending_update_fee = read_option!();
3770-
let holding_cell_update_fee = read_option!();
3761+
let pending_update_fee = Readable::read(reader)?;
3762+
let holding_cell_update_fee = Readable::read(reader)?;
37713763

37723764
let next_local_htlc_id = Readable::read(reader)?;
37733765
let next_remote_htlc_id = Readable::read(reader)?;
@@ -3789,8 +3781,8 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
37893781
_ => return Err(DecodeError::InvalidValue),
37903782
};
37913783

3792-
let funding_tx_confirmed_in = read_option!();
3793-
let short_channel_id = read_option!();
3784+
let funding_tx_confirmed_in = Readable::read(reader)?;
3785+
let short_channel_id = Readable::read(reader)?;
37943786

37953787
let last_block_connected = Readable::read(reader)?;
37963788
let funding_tx_confirmations = Readable::read(reader)?;
@@ -3805,17 +3797,17 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
38053797
let their_max_accepted_htlcs = Readable::read(reader)?;
38063798
let minimum_depth = Readable::read(reader)?;
38073799

3808-
let their_funding_pubkey = read_option!();
3809-
let their_revocation_basepoint = read_option!();
3810-
let their_payment_basepoint = read_option!();
3811-
let their_delayed_payment_basepoint = read_option!();
3812-
let their_htlc_basepoint = read_option!();
3813-
let their_cur_commitment_point = read_option!();
3800+
let their_funding_pubkey = Readable::read(reader)?;
3801+
let their_revocation_basepoint = Readable::read(reader)?;
3802+
let their_payment_basepoint = Readable::read(reader)?;
3803+
let their_delayed_payment_basepoint = Readable::read(reader)?;
3804+
let their_htlc_basepoint = Readable::read(reader)?;
3805+
let their_cur_commitment_point = Readable::read(reader)?;
38143806

3815-
let their_prev_commitment_point = read_option!();
3807+
let their_prev_commitment_point = Readable::read(reader)?;
38163808
let their_node_id = Readable::read(reader)?;
38173809

3818-
let their_shutdown_scriptpubkey = read_option!();
3810+
let their_shutdown_scriptpubkey = Readable::read(reader)?;
38193811
let (monitor_last_block, channel_monitor) = ReadableArgs::read(reader, logger.clone())?;
38203812
// We drop the ChannelMonitor's last block connected hash cause we don't actually bother
38213813
// 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),
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: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,13 +1960,6 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
19601960
}
19611961
}
19621962
}
1963-
macro_rules! read_option { () => {
1964-
match <u8 as Readable<R>>::read(reader)? {
1965-
0 => None,
1966-
1 => Some(Readable::read(reader)?),
1967-
_ => return Err(DecodeError::InvalidValue),
1968-
}
1969-
} }
19701963

19711964
let _ver: u8 = Readable::read(reader)?;
19721965
let min_ver: u8 = Readable::read(reader)?;
@@ -1983,25 +1976,17 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
19831976
let delayed_payment_base_key = Readable::read(reader)?;
19841977
let payment_base_key = Readable::read(reader)?;
19851978
let shutdown_pubkey = Readable::read(reader)?;
1986-
let prev_latest_per_commitment_point = match <u8 as Readable<R>>::read(reader)? {
1987-
0 => None,
1988-
1 => Some(Readable::read(reader)?),
1989-
_ => return Err(DecodeError::InvalidValue),
1990-
};
1991-
let latest_per_commitment_point = match <u8 as Readable<R>>::read(reader)? {
1992-
0 => None,
1993-
1 => Some(Readable::read(reader)?),
1994-
_ => return Err(DecodeError::InvalidValue),
1995-
};
1979+
let prev_latest_per_commitment_point = Readable::read(reader)?;
1980+
let latest_per_commitment_point = Readable::read(reader)?;
19961981
// Technically this can fail and serialize fail a round-trip, but only for serialization of
19971982
// barely-init'd ChannelMonitors that we can't do anything with.
19981983
let outpoint = OutPoint {
19991984
txid: Readable::read(reader)?,
20001985
index: Readable::read(reader)?,
20011986
};
20021987
let funding_info = Some((outpoint, Readable::read(reader)?));
2003-
let current_remote_commitment_txid = read_option!();
2004-
let prev_remote_commitment_txid = read_option!();
1988+
let current_remote_commitment_txid = Readable::read(reader)?;
1989+
let prev_remote_commitment_txid = Readable::read(reader)?;
20051990
Storage::Local {
20061991
revocation_base_key,
20071992
htlc_base_key,
@@ -2052,7 +2037,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
20522037
let amount_msat: u64 = Readable::read(reader)?;
20532038
let cltv_expiry: u32 = Readable::read(reader)?;
20542039
let payment_hash: PaymentHash = Readable::read(reader)?;
2055-
let transaction_output_index: Option<u32> = read_option!();
2040+
let transaction_output_index: Option<u32> = Readable::read(reader)?;
20562041

20572042
HTLCOutputInCommitment {
20582043
offered, amount_msat, cltv_expiry, payment_hash, transaction_output_index
@@ -2068,7 +2053,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
20682053
let htlcs_count: u64 = Readable::read(reader)?;
20692054
let mut htlcs = Vec::with_capacity(cmp::min(htlcs_count as usize, MAX_ALLOC_SIZE / 32));
20702055
for _ in 0..htlcs_count {
2071-
htlcs.push((read_htlc_in_commitment!(), read_option!().map(|o: HTLCSource| Box::new(o))));
2056+
htlcs.push((read_htlc_in_commitment!(), <Option<HTLCSource> as Readable<R>>::read(reader)?.map(|o: HTLCSource| Box::new(o))));
20722057
}
20732058
if let Some(_) = remote_claimable_outpoints.insert(txid, htlcs) {
20742059
return Err(DecodeError::InvalidValue);
@@ -2131,7 +2116,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
21312116
1 => Some((Readable::read(reader)?, Readable::read(reader)?)),
21322117
_ => return Err(DecodeError::InvalidValue),
21332118
};
2134-
htlcs.push((htlc, sigs, read_option!()));
2119+
htlcs.push((htlc, sigs, Readable::read(reader)?));
21352120
}
21362121

21372122
LocalSignedTx {

src/ln/msgs.rs

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ pub struct OpenChannel {
190190
pub(crate) htlc_basepoint: PublicKey,
191191
pub(crate) first_per_commitment_point: PublicKey,
192192
pub(crate) channel_flags: u8,
193-
pub(crate) shutdown_scriptpubkey: Option<Script>,
193+
pub(crate) shutdown_scriptpubkey: OptionalField<Script>,
194194
}
195195

196196
/// An accept_channel message to be sent or received from a peer
@@ -210,7 +210,7 @@ pub struct AcceptChannel {
210210
pub(crate) delayed_payment_basepoint: PublicKey,
211211
pub(crate) htlc_basepoint: PublicKey,
212212
pub(crate) first_per_commitment_point: PublicKey,
213-
pub(crate) shutdown_scriptpubkey: Option<Script>,
213+
pub(crate) shutdown_scriptpubkey: OptionalField<Script>
214214
}
215215

216216
/// A funding_created message to be sent or received from a peer
@@ -322,7 +322,7 @@ pub struct ChannelReestablish {
322322
pub(crate) channel_id: [u8; 32],
323323
pub(crate) next_local_commitment_number: u64,
324324
pub(crate) next_remote_commitment_number: u64,
325-
pub(crate) data_loss_protect: Option<DataLossProtect>,
325+
pub(crate) data_loss_protect: OptionalField<DataLossProtect>,
326326
}
327327

328328
/// An announcement_signatures message to be sent or received from a peer
@@ -603,6 +603,16 @@ pub enum HTLCFailChannelUpdate {
603603
}
604604
}
605605

606+
/// Messages could have optional fields to use with extended features
607+
/// Due to serialization issues, we encapsulate it in enum
608+
#[derive(Clone, PartialEq)]
609+
pub enum OptionalField<T> {
610+
/// Optional field is included in message
611+
Present(T),
612+
/// Optional field is absent in message
613+
Absent
614+
}
615+
606616
/// A trait to describe an object which can receive channel messages.
607617
///
608618
/// Messages MAY be called in parallel when they originate from different their_node_ids, however
@@ -781,8 +791,34 @@ impl From<::std::io::Error> for DecodeError {
781791
}
782792
}
783793

794+
impl Writeable for OptionalField<Script> {
795+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
796+
match *self {
797+
OptionalField::Present(ref script) => {
798+
script.write(w)?;
799+
},
800+
OptionalField::Absent => {}
801+
}
802+
Ok(())
803+
}
804+
}
805+
806+
impl<R: Read> Readable<R> for OptionalField<Script> {
807+
fn read(r: &mut R) -> Result<Self, DecodeError> {
808+
match <u16 as Readable<R>>::read(r) {
809+
Ok(len) => {
810+
let mut buf = vec![0; len as usize];
811+
r.read_exact(&mut buf)?;
812+
Ok(OptionalField::Present(Script::from(buf)))
813+
},
814+
Err(DecodeError::ShortRead) => Ok(OptionalField::Absent),
815+
Err(e) => Err(e)
816+
}
817+
}
818+
}
819+
784820
impl_writeable_len_match!(AcceptChannel, {
785-
{AcceptChannel{ shutdown_scriptpubkey: Some(ref script), ..}, 270 + 2 + script.len()},
821+
{AcceptChannel{ shutdown_scriptpubkey: OptionalField::Present(ref script), .. }, 270 + 2 + script.len()},
786822
{_, 270}
787823
}, {
788824
temporary_channel_id,
@@ -811,13 +847,16 @@ impl_writeable!(AnnouncementSignatures, 32+8+64*2, {
811847

812848
impl Writeable for ChannelReestablish {
813849
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
814-
w.size_hint(if self.data_loss_protect.is_some() { 32+2*8+33+32 } else { 32+2*8 });
850+
w.size_hint(if let OptionalField::Present(..) = self.data_loss_protect { 32+2*8+33+32 } else { 32+2*8 });
815851
self.channel_id.write(w)?;
816852
self.next_local_commitment_number.write(w)?;
817853
self.next_remote_commitment_number.write(w)?;
818-
if let Some(ref data_loss_protect) = self.data_loss_protect {
819-
data_loss_protect.your_last_per_commitment_secret.write(w)?;
820-
data_loss_protect.my_current_per_commitment_point.write(w)?;
854+
match self.data_loss_protect {
855+
OptionalField::Present(ref data_loss_protect) => {
856+
(*data_loss_protect).your_last_per_commitment_secret.write(w)?;
857+
(*data_loss_protect).my_current_per_commitment_point.write(w)?;
858+
},
859+
OptionalField::Absent => {}
821860
}
822861
Ok(())
823862
}
@@ -832,11 +871,11 @@ impl<R: Read> Readable<R> for ChannelReestablish{
832871
data_loss_protect: {
833872
match <[u8; 32] as Readable<R>>::read(r) {
834873
Ok(your_last_per_commitment_secret) =>
835-
Some(DataLossProtect {
874+
OptionalField::Present(DataLossProtect {
836875
your_last_per_commitment_secret,
837876
my_current_per_commitment_point: Readable::read(r)?,
838877
}),
839-
Err(DecodeError::ShortRead) => None,
878+
Err(DecodeError::ShortRead) => OptionalField::Absent,
840879
Err(e) => return Err(e)
841880
}
842881
}
@@ -903,8 +942,8 @@ impl_writeable_len_match!(Init, {
903942
});
904943

905944
impl_writeable_len_match!(OpenChannel, {
906-
{ OpenChannel { shutdown_scriptpubkey: Some(ref script), .. }, 319 + 2 + script.len() },
907-
{ OpenChannel { shutdown_scriptpubkey: None, .. }, 319 }
945+
{ OpenChannel { shutdown_scriptpubkey: OptionalField::Present(ref script), .. }, 319 + 2 + script.len() },
946+
{ _, 319 }
908947
}, {
909948
chain_hash,
910949
temporary_channel_id,
@@ -1355,6 +1394,7 @@ impl_writeable_len_match!(NodeAnnouncement, {
13551394
mod tests {
13561395
use hex;
13571396
use ln::msgs;
1397+
use ln::msgs::OptionalField;
13581398
use util::ser::Writeable;
13591399
use secp256k1::key::{PublicKey,SecretKey};
13601400
use secp256k1::Secp256k1;
@@ -1365,7 +1405,7 @@ mod tests {
13651405
channel_id: [4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0],
13661406
next_local_commitment_number: 3,
13671407
next_remote_commitment_number: 4,
1368-
data_loss_protect: None,
1408+
data_loss_protect: OptionalField::Absent,
13691409
};
13701410

13711411
let encoded_value = cr.encode();
@@ -1386,7 +1426,7 @@ mod tests {
13861426
channel_id: [4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0],
13871427
next_local_commitment_number: 3,
13881428
next_remote_commitment_number: 4,
1389-
data_loss_protect: Some(msgs::DataLossProtect { your_last_per_commitment_secret: [9;32], my_current_per_commitment_point: public_key}),
1429+
data_loss_protect: OptionalField::Present(msgs::DataLossProtect { your_last_per_commitment_secret: [9;32], my_current_per_commitment_point: public_key}),
13901430
};
13911431

13921432
let encoded_value = cr.encode();

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;

0 commit comments

Comments
 (0)