Skip to content

Implement serialize/deserialize for Router #271

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 17 additions & 25 deletions src/ln/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use secp256k1::{Secp256k1,Message,Signature};
use secp256k1;

use ln::msgs;
use ln::msgs::DecodeError;
use ln::msgs::{DecodeError, OptionalField};
use ln::channelmonitor::ChannelMonitor;
use ln::channelmanager::{PendingHTLCStatus, HTLCSource, HTLCFailReason, HTLCFailureMsg, PendingForwardHTLCInfo, RAACommitmentOrder, PaymentPreimage, PaymentHash};
use ln::chan_utils::{TxCreationKeys,HTLCOutputInCommitment,HTLC_SUCCESS_TX_WEIGHT,HTLC_TIMEOUT_TX_WEIGHT};
Expand Down Expand Up @@ -2946,7 +2946,7 @@ impl Channel {
htlc_basepoint: PublicKey::from_secret_key(&self.secp_ctx, &self.local_keys.htlc_base_key),
first_per_commitment_point: PublicKey::from_secret_key(&self.secp_ctx, &local_commitment_secret),
channel_flags: if self.config.announced_channel {1} else {0},
shutdown_scriptpubkey: None,
shutdown_scriptpubkey: OptionalField::Absent
}
}

Expand Down Expand Up @@ -2978,7 +2978,7 @@ impl Channel {
delayed_payment_basepoint: PublicKey::from_secret_key(&self.secp_ctx, &self.local_keys.delayed_payment_base_key),
htlc_basepoint: PublicKey::from_secret_key(&self.secp_ctx, &self.local_keys.htlc_base_key),
first_per_commitment_point: PublicKey::from_secret_key(&self.secp_ctx, &local_commitment_secret),
shutdown_scriptpubkey: None,
shutdown_scriptpubkey: OptionalField::Absent
}
}

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

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

macro_rules! read_option { () => {
match <u8 as Readable<R>>::read(reader)? {
0 => None,
1 => Some(Readable::read(reader)?),
_ => return Err(DecodeError::InvalidValue),
}
} }

let pending_outbound_htlc_count: u64 = Readable::read(reader)?;
let mut pending_outbound_htlcs = Vec::with_capacity(cmp::min(pending_outbound_htlc_count as usize, OUR_MAX_HTLCS as usize));
for _ in 0..pending_outbound_htlc_count {
Expand All @@ -3708,7 +3700,7 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
cltv_expiry: Readable::read(reader)?,
payment_hash: Readable::read(reader)?,
source: Readable::read(reader)?,
fail_reason: read_option!(),
fail_reason: Readable::read(reader)?,
state: match <u8 as Readable<R>>::read(reader)? {
0 => OutboundHTLCState::LocalAnnounced(Box::new(Readable::read(reader)?)),
1 => OutboundHTLCState::Committed,
Expand Down Expand Up @@ -3766,8 +3758,8 @@ impl<R : ::std::io::Read> ReadableArgs<R, Arc<Logger>> for Channel {
monitor_pending_failures.push((Readable::read(reader)?, Readable::read(reader)?, Readable::read(reader)?));
}

let pending_update_fee = read_option!();
let holding_cell_update_fee = read_option!();
let pending_update_fee = Readable::read(reader)?;
let holding_cell_update_fee = Readable::read(reader)?;

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

let funding_tx_confirmed_in = read_option!();
let short_channel_id = read_option!();
let funding_tx_confirmed_in = Readable::read(reader)?;
let short_channel_id = Readable::read(reader)?;

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

let their_funding_pubkey = read_option!();
let their_revocation_basepoint = read_option!();
let their_payment_basepoint = read_option!();
let their_delayed_payment_basepoint = read_option!();
let their_htlc_basepoint = read_option!();
let their_cur_commitment_point = read_option!();
let their_funding_pubkey = Readable::read(reader)?;
let their_revocation_basepoint = Readable::read(reader)?;
let their_payment_basepoint = Readable::read(reader)?;
let their_delayed_payment_basepoint = Readable::read(reader)?;
let their_htlc_basepoint = Readable::read(reader)?;
let their_cur_commitment_point = Readable::read(reader)?;

let their_prev_commitment_point = read_option!();
let their_prev_commitment_point = Readable::read(reader)?;
let their_node_id = Readable::read(reader)?;

let their_shutdown_scriptpubkey = read_option!();
let their_shutdown_scriptpubkey = Readable::read(reader)?;
let (monitor_last_block, channel_monitor) = ReadableArgs::read(reader, logger.clone())?;
// We drop the ChannelMonitor's last block connected hash cause we don't actually bother
// doing full block connection operations on the internal CHannelMonitor copies
Expand Down
14 changes: 2 additions & 12 deletions src/ln/channelmanager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2612,12 +2612,7 @@ const MIN_SERIALIZATION_VERSION: u8 = 1;

impl Writeable for PendingForwardHTLCInfo {
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
if let &Some(ref onion) = &self.onion_packet {
1u8.write(writer)?;
onion.write(writer)?;
} else {
0u8.write(writer)?;
}
self.onion_packet.write(writer)?;
self.incoming_shared_secret.write(writer)?;
self.payment_hash.write(writer)?;
self.short_channel_id.write(writer)?;
Expand All @@ -2629,13 +2624,8 @@ impl Writeable for PendingForwardHTLCInfo {

impl<R: ::std::io::Read> Readable<R> for PendingForwardHTLCInfo {
fn read(reader: &mut R) -> Result<PendingForwardHTLCInfo, DecodeError> {
let onion_packet = match <u8 as Readable<R>>::read(reader)? {
0 => None,
1 => Some(msgs::OnionPacket::read(reader)?),
_ => return Err(DecodeError::InvalidValue),
};
Ok(PendingForwardHTLCInfo {
onion_packet,
onion_packet: Readable::read(reader)?,
incoming_shared_secret: Readable::read(reader)?,
payment_hash: Readable::read(reader)?,
short_channel_id: Readable::read(reader)?,
Expand Down
29 changes: 7 additions & 22 deletions src/ln/channelmonitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1960,13 +1960,6 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
}
}
}
macro_rules! read_option { () => {
match <u8 as Readable<R>>::read(reader)? {
0 => None,
1 => Some(Readable::read(reader)?),
_ => return Err(DecodeError::InvalidValue),
}
} }

let _ver: u8 = Readable::read(reader)?;
let min_ver: u8 = Readable::read(reader)?;
Expand All @@ -1983,25 +1976,17 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
let delayed_payment_base_key = Readable::read(reader)?;
let payment_base_key = Readable::read(reader)?;
let shutdown_pubkey = Readable::read(reader)?;
let prev_latest_per_commitment_point = match <u8 as Readable<R>>::read(reader)? {
0 => None,
1 => Some(Readable::read(reader)?),
_ => return Err(DecodeError::InvalidValue),
};
let latest_per_commitment_point = match <u8 as Readable<R>>::read(reader)? {
0 => None,
1 => Some(Readable::read(reader)?),
_ => return Err(DecodeError::InvalidValue),
};
let prev_latest_per_commitment_point = Readable::read(reader)?;
let latest_per_commitment_point = Readable::read(reader)?;
// Technically this can fail and serialize fail a round-trip, but only for serialization of
// barely-init'd ChannelMonitors that we can't do anything with.
let outpoint = OutPoint {
txid: Readable::read(reader)?,
index: Readable::read(reader)?,
};
let funding_info = Some((outpoint, Readable::read(reader)?));
let current_remote_commitment_txid = read_option!();
let prev_remote_commitment_txid = read_option!();
let current_remote_commitment_txid = Readable::read(reader)?;
let prev_remote_commitment_txid = Readable::read(reader)?;
Storage::Local {
revocation_base_key,
htlc_base_key,
Expand Down Expand Up @@ -2052,7 +2037,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
let amount_msat: u64 = Readable::read(reader)?;
let cltv_expiry: u32 = Readable::read(reader)?;
let payment_hash: PaymentHash = Readable::read(reader)?;
let transaction_output_index: Option<u32> = read_option!();
let transaction_output_index: Option<u32> = Readable::read(reader)?;

HTLCOutputInCommitment {
offered, amount_msat, cltv_expiry, payment_hash, transaction_output_index
Expand All @@ -2068,7 +2053,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
let htlcs_count: u64 = Readable::read(reader)?;
let mut htlcs = Vec::with_capacity(cmp::min(htlcs_count as usize, MAX_ALLOC_SIZE / 32));
for _ in 0..htlcs_count {
htlcs.push((read_htlc_in_commitment!(), read_option!().map(|o: HTLCSource| Box::new(o))));
htlcs.push((read_htlc_in_commitment!(), <Option<HTLCSource> as Readable<R>>::read(reader)?.map(|o: HTLCSource| Box::new(o))));
}
if let Some(_) = remote_claimable_outpoints.insert(txid, htlcs) {
return Err(DecodeError::InvalidValue);
Expand Down Expand Up @@ -2131,7 +2116,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for (Sha256dHash, ChannelM
1 => Some((Readable::read(reader)?, Readable::read(reader)?)),
_ => return Err(DecodeError::InvalidValue),
};
htlcs.push((htlc, sigs, read_option!()));
htlcs.push((htlc, sigs, Readable::read(reader)?));
}

LocalSignedTx {
Expand Down
Loading