diff --git a/fuzz/src/msg_targets/utils.rs b/fuzz/src/msg_targets/utils.rs index 2a7731ccd13..6125e5afd61 100644 --- a/fuzz/src/msg_targets/utils.rs +++ b/fuzz/src/msg_targets/utils.rs @@ -28,7 +28,7 @@ macro_rules! test_msg { { use lightning::util::ser::{Writeable, Readable}; let mut r = ::std::io::Cursor::new($data); - if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) { + if let Ok(msg) = <$MsgType as Readable>::read(&mut r) { let p = r.position() as usize; let mut w = VecWriter(Vec::new()); msg.write(&mut w).unwrap(); @@ -48,11 +48,11 @@ macro_rules! test_msg_simple { { use lightning::util::ser::{Writeable, Readable}; let mut r = ::std::io::Cursor::new($data); - if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) { + if let Ok(msg) = <$MsgType as Readable>::read(&mut r) { let mut w = VecWriter(Vec::new()); msg.write(&mut w).unwrap(); - let msg = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut ::std::io::Cursor::new(&w.0)).unwrap(); + let msg = <$MsgType as Readable>::read(&mut ::std::io::Cursor::new(&w.0)).unwrap(); let mut w_two = VecWriter(Vec::new()); msg.write(&mut w_two).unwrap(); assert_eq!(&w.0[..], &w_two.0[..]); @@ -69,7 +69,7 @@ macro_rules! test_msg_exact { { use lightning::util::ser::{Writeable, Readable}; let mut r = ::std::io::Cursor::new($data); - if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) { + if let Ok(msg) = <$MsgType as Readable>::read(&mut r) { let mut w = VecWriter(Vec::new()); msg.write(&mut w).unwrap(); assert_eq!(&r.into_inner()[..], &w.0[..]); @@ -86,7 +86,7 @@ macro_rules! test_msg_hole { { use lightning::util::ser::{Writeable, Readable}; let mut r = ::std::io::Cursor::new($data); - if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) { + if let Ok(msg) = <$MsgType as Readable>::read(&mut r) { let mut w = VecWriter(Vec::new()); msg.write(&mut w).unwrap(); let p = w.0.len() as usize; diff --git a/lightning/src/chain/keysinterface.rs b/lightning/src/chain/keysinterface.rs index 544df015a8f..43a044524e4 100644 --- a/lightning/src/chain/keysinterface.rs +++ b/lightning/src/chain/keysinterface.rs @@ -115,8 +115,8 @@ impl Writeable for SpendableOutputDescriptor { } } -impl Readable for SpendableOutputDescriptor { - fn read(reader: &mut R) -> Result { +impl Readable for SpendableOutputDescriptor { + fn read(reader: &mut R) -> Result { match Readable::read(reader)? { 0u8 => Ok(SpendableOutputDescriptor::StaticOutput { outpoint: Readable::read(reader)?, @@ -381,8 +381,8 @@ impl Writeable for InMemoryChannelKeys { } } -impl Readable for InMemoryChannelKeys { - fn read(reader: &mut R) -> Result { +impl Readable for InMemoryChannelKeys { + fn read(reader: &mut R) -> Result { let funding_key = Readable::read(reader)?; let revocation_base_key = Readable::read(reader)?; let payment_base_key = Readable::read(reader)?; diff --git a/lightning/src/ln/chan_utils.rs b/lightning/src/ln/chan_utils.rs index 3fd489fa1a9..561448c8fbf 100644 --- a/lightning/src/ln/chan_utils.rs +++ b/lightning/src/ln/chan_utils.rs @@ -156,8 +156,8 @@ impl Writeable for CounterpartyCommitmentSecrets { Ok(()) } } -impl Readable for CounterpartyCommitmentSecrets { - fn read(reader: &mut R) -> Result { +impl Readable for CounterpartyCommitmentSecrets { + fn read(reader: &mut R) -> Result { let mut old_secrets = [([0; 32], 1 << 48); 49]; for &mut (ref mut secret, ref mut idx) in old_secrets.iter_mut() { *secret = Readable::read(reader)?; @@ -607,8 +607,8 @@ impl Writeable for LocalCommitmentTransaction { Ok(()) } } -impl Readable for LocalCommitmentTransaction { - fn read(reader: &mut R) -> Result { +impl Readable for LocalCommitmentTransaction { + fn read(reader: &mut R) -> Result { let tx = match Transaction::consensus_decode(reader.by_ref()) { Ok(tx) => tx, Err(e) => match e { diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index 2e4f49ce837..f155a0bd295 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -3811,9 +3811,9 @@ impl Writeable for InboundHTLCRemovalReason { } } -impl Readable for InboundHTLCRemovalReason { - fn read(reader: &mut R) -> Result { - Ok(match >::read(reader)? { +impl Readable for InboundHTLCRemovalReason { + fn read(reader: &mut R) -> Result { + Ok(match ::read(reader)? { 0 => InboundHTLCRemovalReason::FailRelay(Readable::read(reader)?), 1 => InboundHTLCRemovalReason::FailMalformed((Readable::read(reader)?, Readable::read(reader)?)), 2 => InboundHTLCRemovalReason::Fulfill(Readable::read(reader)?), @@ -3883,18 +3883,6 @@ impl Writeable for Channel { } } - macro_rules! write_option { - ($thing: expr) => { - match &$thing { - &None => 0u8.write(writer)?, - &Some(ref v) => { - 1u8.write(writer)?; - v.write(writer)?; - }, - } - } - } - (self.pending_outbound_htlcs.len() as u64).write(writer)?; for htlc in self.pending_outbound_htlcs.iter() { htlc.htlc_id.write(writer)?; @@ -3912,15 +3900,15 @@ impl Writeable for Channel { }, &OutboundHTLCState::RemoteRemoved(ref fail_reason) => { 2u8.write(writer)?; - write_option!(*fail_reason); + fail_reason.write(writer)?; }, &OutboundHTLCState::AwaitingRemoteRevokeToRemove(ref fail_reason) => { 3u8.write(writer)?; - write_option!(*fail_reason); + fail_reason.write(writer)?; }, &OutboundHTLCState::AwaitingRemovedRemoteRevoke(ref fail_reason) => { 4u8.write(writer)?; - write_option!(*fail_reason); + fail_reason.write(writer)?; }, } } @@ -3971,8 +3959,8 @@ impl Writeable for Channel { fail_reason.write(writer)?; } - write_option!(self.pending_update_fee); - write_option!(self.holding_cell_update_fee); + self.pending_update_fee.write(writer)?; + self.holding_cell_update_fee.write(writer)?; self.next_local_htlc_id.write(writer)?; (self.next_remote_htlc_id - dropped_inbound_htlcs).write(writer)?; @@ -3989,9 +3977,9 @@ impl Writeable for Channel { None => 0u8.write(writer)?, } - write_option!(self.funding_txo); - write_option!(self.funding_tx_confirmed_in); - write_option!(self.short_channel_id); + self.funding_txo.write(writer)?; + self.funding_tx_confirmed_in.write(writer)?; + self.short_channel_id.write(writer)?; self.last_block_connected.write(writer)?; self.funding_tx_confirmations.write(writer)?; @@ -4007,13 +3995,13 @@ impl Writeable for Channel { self.their_max_accepted_htlcs.write(writer)?; self.minimum_depth.write(writer)?; - write_option!(self.their_pubkeys); - write_option!(self.their_cur_commitment_point); + self.their_pubkeys.write(writer)?; + self.their_cur_commitment_point.write(writer)?; - write_option!(self.their_prev_commitment_point); + self.their_prev_commitment_point.write(writer)?; self.their_node_id.write(writer)?; - write_option!(self.their_shutdown_scriptpubkey); + self.their_shutdown_scriptpubkey.write(writer)?; self.commitment_secrets.write(writer)?; @@ -4022,8 +4010,8 @@ impl Writeable for Channel { } } -impl> ReadableArgs> for Channel { - fn read(reader: &mut R, logger: Arc) -> Result { +impl ReadableArgs> for Channel { + fn read(reader: &mut R, logger: Arc) -> Result { let _ver: u8 = Readable::read(reader)?; let min_ver: u8 = Readable::read(reader)?; if min_ver > SERIALIZATION_VERSION { @@ -4056,7 +4044,7 @@ impl> ReadableArgs>::read(reader)? { + state: match ::read(reader)? { 1 => InboundHTLCState::AwaitingRemoteRevokeToAnnounce(Readable::read(reader)?), 2 => InboundHTLCState::AwaitingAnnouncedRemoteRevoke(Readable::read(reader)?), 3 => InboundHTLCState::Committed, @@ -4075,7 +4063,7 @@ impl> ReadableArgs>::read(reader)? { + state: match ::read(reader)? { 0 => OutboundHTLCState::LocalAnnounced(Box::new(Readable::read(reader)?)), 1 => OutboundHTLCState::Committed, 2 => OutboundHTLCState::RemoteRemoved(Readable::read(reader)?), @@ -4089,7 +4077,7 @@ impl> ReadableArgs>::read(reader)? { + holding_cell_htlc_updates.push(match ::read(reader)? { 0 => HTLCUpdateAwaitingACK::AddHTLC { amount_msat: Readable::read(reader)?, cltv_expiry: Readable::read(reader)?, @@ -4109,7 +4097,7 @@ impl> ReadableArgs>::read(reader)? { + let resend_order = match ::read(reader)? { 0 => RAACommitmentOrder::CommitmentFirst, 1 => RAACommitmentOrder::RevokeAndACKFirst, _ => return Err(DecodeError::InvalidValue), @@ -4139,7 +4127,7 @@ impl> ReadableArgs>::read(reader)? { + let last_sent_closing_fee = match ::read(reader)? { 0 => None, 1 => Some((Readable::read(reader)?, Readable::read(reader)?, Readable::read(reader)?)), _ => return Err(DecodeError::InvalidValue), diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 63e32c1a57b..5f7e903fd20 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -3062,8 +3062,8 @@ impl Writeable for PendingHTLCInfo { } } -impl Readable for PendingHTLCInfo { - fn read(reader: &mut R) -> Result { +impl Readable for PendingHTLCInfo { + fn read(reader: &mut R) -> Result { Ok(PendingHTLCInfo { onion_packet: Readable::read(reader)?, incoming_shared_secret: Readable::read(reader)?, @@ -3091,9 +3091,9 @@ impl Writeable for HTLCFailureMsg { } } -impl Readable for HTLCFailureMsg { - fn read(reader: &mut R) -> Result { - match >::read(reader)? { +impl Readable for HTLCFailureMsg { + fn read(reader: &mut R) -> Result { + match ::read(reader)? { 0 => Ok(HTLCFailureMsg::Relay(Readable::read(reader)?)), 1 => Ok(HTLCFailureMsg::Malformed(Readable::read(reader)?)), _ => Err(DecodeError::InvalidValue), @@ -3117,9 +3117,9 @@ impl Writeable for PendingHTLCStatus { } } -impl Readable for PendingHTLCStatus { - fn read(reader: &mut R) -> Result { - match >::read(reader)? { +impl Readable for PendingHTLCStatus { + fn read(reader: &mut R) -> Result { + match ::read(reader)? { 0 => Ok(PendingHTLCStatus::Forward(Readable::read(reader)?)), 1 => Ok(PendingHTLCStatus::Fail(Readable::read(reader)?)), _ => Err(DecodeError::InvalidValue), @@ -3151,9 +3151,9 @@ impl Writeable for HTLCSource { } } -impl Readable for HTLCSource { - fn read(reader: &mut R) -> Result { - match >::read(reader)? { +impl Readable for HTLCSource { + fn read(reader: &mut R) -> Result { + match ::read(reader)? { 0 => Ok(HTLCSource::PreviousHopData(Readable::read(reader)?)), 1 => Ok(HTLCSource::OutboundRoute { route: Readable::read(reader)?, @@ -3182,9 +3182,9 @@ impl Writeable for HTLCFailReason { } } -impl Readable for HTLCFailReason { - fn read(reader: &mut R) -> Result { - match >::read(reader)? { +impl Readable for HTLCFailReason { + fn read(reader: &mut R) -> Result { + match ::read(reader)? { 0 => Ok(HTLCFailReason::LightningError { err: Readable::read(reader)? }), 1 => Ok(HTLCFailReason::Reason { failure_code: Readable::read(reader)?, @@ -3214,9 +3214,9 @@ impl Writeable for HTLCForwardInfo { } } -impl Readable for HTLCForwardInfo { - fn read(reader: &mut R) -> Result { - match >::read(reader)? { +impl Readable for HTLCForwardInfo { + fn read(reader: &mut R) -> Result { + match ::read(reader)? { 0 => Ok(HTLCForwardInfo::AddHTLC { prev_short_channel_id: Readable::read(reader)?, prev_htlc_id: Readable::read(reader)?, @@ -3353,14 +3353,29 @@ pub struct ChannelManagerReadArgs<'a, ChanSigner: 'a + ChannelKeys, M: Deref, T: pub channel_monitors: &'a mut HashMap>, } -impl<'a, R : ::std::io::Read, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref> - ReadableArgs> for (Sha256dHash, ChannelManager) +// Implement ReadableArgs for an Arc'd ChannelManager to make it a bit easier to work with the +// SipmleArcChannelManager type: +impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref> + ReadableArgs> for (Sha256dHash, Arc>) where M::Target: ManyChannelMonitor, T::Target: BroadcasterInterface, K::Target: KeysInterface, F::Target: FeeEstimator, { - fn read(reader: &mut R, args: ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>) -> Result { + fn read(reader: &mut R, args: ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>) -> Result { + let (blockhash, chan_manager) = <(Sha256dHash, ChannelManager)>::read(reader, args)?; + Ok((blockhash, Arc::new(chan_manager))) + } +} + +impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref> + ReadableArgs> for (Sha256dHash, ChannelManager) + where M::Target: ManyChannelMonitor, + T::Target: BroadcasterInterface, + K::Target: KeysInterface, + F::Target: FeeEstimator, +{ + fn read(reader: &mut R, args: ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>) -> Result { let _ver: u8 = Readable::read(reader)?; let min_ver: u8 = Readable::read(reader)?; if min_ver > SERIALIZATION_VERSION { diff --git a/lightning/src/ln/channelmonitor.rs b/lightning/src/ln/channelmonitor.rs index 1bc8c76b49e..b1e8428bd0a 100644 --- a/lightning/src/ln/channelmonitor.rs +++ b/lightning/src/ln/channelmonitor.rs @@ -72,8 +72,8 @@ impl Writeable for ChannelMonitorUpdate { Ok(()) } } -impl Readable for ChannelMonitorUpdate { - fn read(r: &mut R) -> Result { +impl Readable for ChannelMonitorUpdate { + fn read(r: &mut R) -> Result { let update_id: u64 = Readable::read(r)?; let len: u64 = Readable::read(r)?; let mut updates = Vec::with_capacity(cmp::min(len as usize, MAX_ALLOC_SIZE / ::std::mem::size_of::())); @@ -489,11 +489,7 @@ impl Writeable for InputMaterial { script.write(writer)?; pubkey.write(writer)?; writer.write_all(&key[..])?; - if *is_htlc { - writer.write_all(&[0; 1])?; - } else { - writer.write_all(&[1; 1])?; - } + is_htlc.write(writer)?; writer.write_all(&byte_utils::be64_to_array(*amount))?; }, &InputMaterial::RemoteHTLC { ref script, ref key, ref preimage, ref amount, ref locktime } => { @@ -517,18 +513,14 @@ impl Writeable for InputMaterial { } } -impl Readable for InputMaterial { - fn read(reader: &mut R) -> Result { - let input_material = match >::read(reader)? { +impl Readable for InputMaterial { + fn read(reader: &mut R) -> Result { + let input_material = match ::read(reader)? { 0 => { let script = Readable::read(reader)?; let pubkey = Readable::read(reader)?; let key = Readable::read(reader)?; - let is_htlc = match >::read(reader)? { - 0 => true, - 1 => false, - _ => return Err(DecodeError::InvalidValue), - }; + let is_htlc = Readable::read(reader)?; let amount = Readable::read(reader)?; InputMaterial::Revoked { script, @@ -624,8 +616,8 @@ impl Writeable for ClaimTxBumpMaterial { } } -impl Readable for ClaimTxBumpMaterial { - fn read(reader: &mut R) -> Result { +impl Readable for ClaimTxBumpMaterial { + fn read(reader: &mut R) -> Result { let height_timer = Readable::read(reader)?; let feerate_previous = Readable::read(reader)?; let soonest_timelock = Readable::read(reader)?; @@ -698,13 +690,7 @@ impl Writeable for ChannelMonitorUpdateStep { (htlc_outputs.len() as u64).write(w)?; for &(ref output, ref source) in htlc_outputs.iter() { output.write(w)?; - match source { - &None => 0u8.write(w)?, - &Some(ref s) => { - 1u8.write(w)?; - s.write(w)?; - }, - } + source.as_ref().map(|b| b.as_ref()).write(w)?; } }, &ChannelMonitorUpdateStep::PaymentPreimage { ref payment_preimage } => { @@ -724,8 +710,8 @@ impl Writeable for ChannelMonitorUpdateStep { Ok(()) } } -impl Readable for ChannelMonitorUpdateStep { - fn read(r: &mut R) -> Result { +impl Readable for ChannelMonitorUpdateStep { + fn read(r: &mut R) -> Result { match Readable::read(r)? { 0u8 => { Ok(ChannelMonitorUpdateStep::LatestLocalCommitmentTXInfo { @@ -751,7 +737,7 @@ impl Readable for ChannelMonitorUpdateStep { let len: u64 = Readable::read(r)?; let mut res = Vec::new(); for _ in 0..len { - res.push((Readable::read(r)?, as Readable>::read(r)?.map(|o| Box::new(o)))); + res.push((Readable::read(r)?, as Readable>::read(r)?.map(|o| Box::new(o)))); } res }, @@ -973,18 +959,6 @@ impl ChannelMonitor { // Set in initial Channel-object creation, so should always be set by now: U48(self.commitment_transaction_number_obscure_factor).write(writer)?; - macro_rules! write_option { - ($thing: expr) => { - match $thing { - &Some(ref t) => { - 1u8.write(writer)?; - t.write(writer)?; - }, - &None => 0u8.write(writer)?, - } - } - } - match self.key_storage { Storage::Local { ref keys, ref funding_key, ref revocation_base_key, ref htlc_base_key, ref delayed_payment_base_key, ref payment_base_key, ref shutdown_pubkey, ref funding_info, ref current_remote_commitment_txid, ref prev_remote_commitment_txid } => { writer.write_all(&[0; 1])?; @@ -1055,7 +1029,7 @@ impl ChannelMonitor { writer.write_all(&byte_utils::be64_to_array(htlc_infos.len() as u64))?; for &(ref htlc_output, ref htlc_source) in htlc_infos.iter() { serialize_htlc_in_commitment!(htlc_output); - write_option!(htlc_source); + htlc_source.as_ref().map(|b| b.as_ref()).write(writer)?; } } @@ -1098,7 +1072,7 @@ impl ChannelMonitor { } else { 0u8.write(writer)?; } - write_option!(htlc_source); + htlc_source.write(writer)?; } } } @@ -3191,8 +3165,8 @@ impl ChannelMonitor { const MAX_ALLOC_SIZE: usize = 64*1024; -impl> ReadableArgs> for (Sha256dHash, ChannelMonitor) { - fn read(reader: &mut R, logger: Arc) -> Result { +impl ReadableArgs> for (Sha256dHash, ChannelMonitor) { + fn read(reader: &mut R, logger: Arc) -> Result { let secp_ctx = Secp256k1::new(); macro_rules! unwrap_obj { ($key: expr) => { @@ -3210,9 +3184,9 @@ impl> ReadableArgs>::read(reader)?.0; + let commitment_transaction_number_obscure_factor = ::read(reader)?.0; - let key_storage = match >::read(reader)? { + let key_storage = match ::read(reader)? { 0 => { let keys = Readable::read(reader)?; let funding_key = Readable::read(reader)?; @@ -3252,7 +3226,7 @@ impl> ReadableArgs>::read(reader)?.0; + let first_idx = ::read(reader)?.0; if first_idx == 0 { None } else { @@ -3294,7 +3268,7 @@ impl> ReadableArgs as Readable>::read(reader)?.map(|o: HTLCSource| Box::new(o)))); + htlcs.push((read_htlc_in_commitment!(), as Readable>::read(reader)?.map(|o: HTLCSource| Box::new(o)))); } if let Some(_) = remote_claimable_outpoints.insert(txid, htlcs) { return Err(DecodeError::InvalidValue); @@ -3305,8 +3279,8 @@ impl> ReadableArgs>::read(reader)?.0; - let outputs_count = >::read(reader)?; + let commitment_number = ::read(reader)?.0; + let outputs_count = ::read(reader)?; let mut outputs = Vec::with_capacity(cmp::min(outputs_count as usize, MAX_ALLOC_SIZE / 8)); for _ in 0..outputs_count { outputs.push(Readable::read(reader)?); @@ -3320,7 +3294,7 @@ impl> ReadableArgs>::read(reader)?.0; + let commitment_number = ::read(reader)?.0; if let Some(_) = remote_hash_commitment_number.insert(payment_hash, commitment_number) { return Err(DecodeError::InvalidValue); } @@ -3329,7 +3303,7 @@ impl> ReadableArgs { { - let tx = >::read(reader)?; + let tx = ::read(reader)?; let revocation_key = Readable::read(reader)?; let a_htlc_key = Readable::read(reader)?; let b_htlc_key = Readable::read(reader)?; @@ -3341,7 +3315,7 @@ impl> ReadableArgs>::read(reader)? { + let sigs = match ::read(reader)? { 0 => None, 1 => Some(Readable::read(reader)?), _ => return Err(DecodeError::InvalidValue), @@ -3358,7 +3332,7 @@ impl> ReadableArgs>::read(reader)? { + let prev_local_signed_commitment_tx = match ::read(reader)? { 0 => None, 1 => { Some(read_local_tx!()) @@ -3366,7 +3340,7 @@ impl> ReadableArgs return Err(DecodeError::InvalidValue), }; - let current_local_signed_commitment_tx = match >::read(reader)? { + let current_local_signed_commitment_tx = match ::read(reader)? { 0 => None, 1 => { Some(read_local_tx!()) @@ -3374,7 +3348,7 @@ impl> ReadableArgs return Err(DecodeError::InvalidValue), }; - let current_remote_commitment_number = >::read(reader)?.0; + let current_remote_commitment_number = ::read(reader)?.0; let payment_preimages_len: u64 = Readable::read(reader)?; let mut payment_preimages = HashMap::with_capacity(cmp::min(payment_preimages_len as usize, MAX_ALLOC_SIZE / 32)); @@ -3402,7 +3376,7 @@ impl> ReadableArgs>::read(reader)? { + let to_remote_rescue = match ::read(reader)? { 0 => None, 1 => { let to_remote_script = Readable::read(reader)?; @@ -3434,7 +3408,7 @@ impl> ReadableArgs>::read(reader)? { + let ev = match ::read(reader)? { 0 => { let claim_request = Readable::read(reader)?; OnchainEvent::Claim { diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index 61a862c0c55..990e0478c4d 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -283,8 +283,8 @@ impl Writeable for Features { } } -impl Readable for Features { - fn read(r: &mut R) -> Result { +impl Readable for Features { + fn read(r: &mut R) -> Result { let mut flags: Vec = Readable::read(r)?; flags.reverse(); // Swap to little-endian Ok(Self { diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs index 25927a8ee4c..655e3681de0 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -6,7 +6,7 @@ use chain::transaction::OutPoint; use chain::keysinterface::KeysInterface; use ln::channelmanager::{ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentPreimage, PaymentHash}; use ln::channelmonitor::{ChannelMonitor, ManyChannelMonitor}; -use ln::router::{Route, Router}; +use ln::router::{Route, Router, RouterReadArgs}; use ln::features::InitFeatures; use ln::msgs; use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler}; @@ -97,6 +97,36 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> { assert!(self.node.get_and_clear_pending_events().is_empty()); assert!(self.chan_monitor.added_monitors.lock().unwrap().is_empty()); + // Check that if we serialize the Router, we can deserialize it again. + { + let mut w = test_utils::TestVecWriter(Vec::new()); + self.router.write(&mut w).unwrap(); + let deserialized_router = Router::read(&mut ::std::io::Cursor::new(&w.0), RouterReadArgs { + chain_monitor: Arc::clone(&self.chain_monitor) as Arc, + logger: Arc::clone(&self.logger) as Arc + }).unwrap(); + let mut chan_progress = 0; + loop { + let orig_announcements = self.router.get_next_channel_announcements(chan_progress, 255); + let deserialized_announcements = deserialized_router.get_next_channel_announcements(chan_progress, 255); + assert!(orig_announcements == deserialized_announcements); + chan_progress = match orig_announcements.last() { + Some(announcement) => announcement.0.contents.short_channel_id + 1, + None => break, + }; + } + let mut node_progress = None; + loop { + let orig_announcements = self.router.get_next_node_announcements(node_progress.as_ref(), 255); + let deserialized_announcements = deserialized_router.get_next_node_announcements(node_progress.as_ref(), 255); + assert!(orig_announcements == deserialized_announcements); + node_progress = match orig_announcements.last() { + Some(announcement) => Some(announcement.contents.node_id), + None => break, + }; + } + } + // Check that if we serialize and then deserialize all our channel monitors we get the // same set of outputs to watch for on chain as we have now. Note that if we write // tests that fully close channels and remove the monitors at some point this may break. diff --git a/lightning/src/ln/msgs.rs b/lightning/src/ln/msgs.rs index b50e35b96dc..8d23ac9a8e5 100644 --- a/lightning/src/ln/msgs.rs +++ b/lightning/src/ln/msgs.rs @@ -336,9 +336,9 @@ impl Writeable for NetAddress { } } -impl Readable for Result { - fn read(reader: &mut R) -> Result, DecodeError> { - let byte = >::read(reader)?; +impl Readable for Result { + fn read(reader: &mut R) -> Result, DecodeError> { + let byte = ::read(reader)?; match byte { 1 => { Ok(Ok(NetAddress::IPv4 { @@ -718,9 +718,9 @@ impl Writeable for OptionalField