Skip to content

Commit c7761cf

Browse files
author
Antoine Riard
committed
Imp Writer/Reader for RemoteCommitmentTransaction
1 parent b289384 commit c7761cf

File tree

1 file changed

+49
-36
lines changed

1 file changed

+49
-36
lines changed

lightning/src/ln/channelmonitor.rs

+49-36
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,53 @@ struct RemoteCommitmentTransaction {
428428
per_htlc: HashMap<Txid, Vec<HTLCOutputInCommitment>>
429429
}
430430

431+
impl Writeable for RemoteCommitmentTransaction {
432+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
433+
self.remote_delayed_payment_base_key.write(w)?;
434+
self.remote_htlc_base_key.write(w)?;
435+
w.write_all(&byte_utils::be16_to_array(self.on_remote_tx_csv))?;
436+
w.write_all(&byte_utils::be64_to_array(self.per_htlc.len() as u64))?;
437+
for (ref txid, ref htlcs) in self.per_htlc.iter() {
438+
w.write_all(&txid[..])?;
439+
w.write_all(&byte_utils::be64_to_array(htlcs.len() as u64))?;
440+
for &ref htlc in htlcs.iter() {
441+
htlc.write(w)?;
442+
}
443+
}
444+
Ok(())
445+
}
446+
}
447+
impl Readable for RemoteCommitmentTransaction {
448+
fn read<R: ::std::io::Read>(r: &mut R) -> Result<Self, DecodeError> {
449+
let remote_commitment_transaction = {
450+
let remote_delayed_payment_base_key = Readable::read(r)?;
451+
let remote_htlc_base_key = Readable::read(r)?;
452+
let on_remote_tx_csv: u16 = Readable::read(r)?;
453+
let per_htlc_len: u64 = Readable::read(r)?;
454+
let mut per_htlc = HashMap::with_capacity(cmp::min(per_htlc_len as usize, MAX_ALLOC_SIZE / 64));
455+
for _ in 0..per_htlc_len {
456+
let txid: Txid = Readable::read(r)?;
457+
let htlcs_count: u64 = Readable::read(r)?;
458+
let mut htlcs = Vec::with_capacity(cmp::min(htlcs_count as usize, MAX_ALLOC_SIZE / 32));
459+
for _ in 0..htlcs_count {
460+
let htlc = Readable::read(r)?;
461+
htlcs.push(htlc);
462+
}
463+
if let Some(_) = per_htlc.insert(txid, htlcs) {
464+
return Err(DecodeError::InvalidValue);
465+
}
466+
}
467+
RemoteCommitmentTransaction {
468+
remote_delayed_payment_base_key,
469+
remote_htlc_base_key,
470+
on_remote_tx_csv,
471+
per_htlc,
472+
}
473+
};
474+
Ok(remote_commitment_transaction)
475+
}
476+
}
477+
431478
/// When ChannelMonitor discovers an onchain outpoint being a step of a channel and that it needs
432479
/// to generate a tx to push channel state forward, we cache outpoint-solving tx material to build
433480
/// a new bumped one in case of lenghty confirmation delay
@@ -915,17 +962,7 @@ impl<ChanSigner: ChannelKeys + Writeable> ChannelMonitor<ChanSigner> {
915962
self.current_remote_commitment_txid.write(writer)?;
916963
self.prev_remote_commitment_txid.write(writer)?;
917964

918-
self.remote_tx_cache.remote_delayed_payment_base_key.write(writer)?;
919-
self.remote_tx_cache.remote_htlc_base_key.write(writer)?;
920-
writer.write_all(&byte_utils::be16_to_array(self.remote_tx_cache.on_remote_tx_csv))?;
921-
writer.write_all(&byte_utils::be64_to_array(self.remote_tx_cache.per_htlc.len() as u64))?;
922-
for (ref txid, ref htlcs) in self.remote_tx_cache.per_htlc.iter() {
923-
writer.write_all(&txid[..])?;
924-
writer.write_all(&byte_utils::be64_to_array(htlcs.len() as u64))?;
925-
for &ref htlc in htlcs.iter() {
926-
htlc.write(writer)?;
927-
}
928-
}
965+
self.remote_tx_cache.write(writer)?;
929966
self.funding_redeemscript.write(writer)?;
930967
self.channel_value_satoshis.write(writer)?;
931968

@@ -2281,31 +2318,7 @@ impl<ChanSigner: ChannelKeys + Readable> ReadableArgs<Arc<Logger>> for (BlockHas
22812318
let current_remote_commitment_txid = Readable::read(reader)?;
22822319
let prev_remote_commitment_txid = Readable::read(reader)?;
22832320

2284-
let remote_tx_cache = {
2285-
let remote_delayed_payment_base_key = Readable::read(reader)?;
2286-
let remote_htlc_base_key = Readable::read(reader)?;
2287-
let on_remote_tx_csv: u16 = Readable::read(reader)?;
2288-
let per_htlc_len: u64 = Readable::read(reader)?;
2289-
let mut per_htlc = HashMap::with_capacity(cmp::min(per_htlc_len as usize, MAX_ALLOC_SIZE / 64));
2290-
for _ in 0..per_htlc_len {
2291-
let txid: Txid = Readable::read(reader)?;
2292-
let htlcs_count: u64 = Readable::read(reader)?;
2293-
let mut htlcs = Vec::with_capacity(cmp::min(htlcs_count as usize, MAX_ALLOC_SIZE / 32));
2294-
for _ in 0..htlcs_count {
2295-
let htlc = Readable::read(reader)?;
2296-
htlcs.push(htlc);
2297-
}
2298-
if let Some(_) = per_htlc.insert(txid, htlcs) {
2299-
return Err(DecodeError::InvalidValue);
2300-
}
2301-
}
2302-
RemoteCommitmentTransaction {
2303-
remote_delayed_payment_base_key,
2304-
remote_htlc_base_key,
2305-
on_remote_tx_csv,
2306-
per_htlc,
2307-
}
2308-
};
2321+
let remote_tx_cache = Readable::read(reader)?;
23092322
let funding_redeemscript = Readable::read(reader)?;
23102323
let channel_value_satoshis = Readable::read(reader)?;
23112324

0 commit comments

Comments
 (0)