Skip to content

Commit f337555

Browse files
committed
Re-derive signers upon deserializing OnchainTxHandler
Similar to the previous commit, we introduce a new serialization version that doesn't store a monitor's signer. Since the monitor already knows of a channel's `channel_keys_id`, there's no need to store any new data to re-derive all private key material for said channel.
1 parent 867f168 commit f337555

File tree

2 files changed

+28
-22
lines changed

2 files changed

+28
-22
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3750,7 +3750,9 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K>
37503750
return Err(DecodeError::InvalidValue);
37513751
}
37523752
}
3753-
let onchain_tx_handler: OnchainTxHandler<K::Signer> = ReadableArgs::read(reader, keys_manager)?;
3753+
let onchain_tx_handler: OnchainTxHandler<K::Signer> = ReadableArgs::read(
3754+
reader, (keys_manager, channel_value_satoshis, channel_keys_id)
3755+
)?;
37543756

37553757
let lockdown_from_offchain = Readable::read(reader)?;
37563758
let holder_tx_signed = Readable::read(reader)?;

lightning/src/chain/onchaintx.rs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use bitcoin::hash_types::{Txid, BlockHash};
2121
use bitcoin::secp256k1::{Secp256k1, ecdsa::Signature};
2222
use bitcoin::secp256k1;
2323

24+
use crate::chain::keysinterface::BaseSign;
2425
use crate::ln::msgs::DecodeError;
2526
use crate::ln::PaymentPreimage;
2627
#[cfg(anchors)]
@@ -35,7 +36,7 @@ use crate::chain::keysinterface::{Sign, KeysInterface};
3536
use crate::chain::package::PackageSolvingData;
3637
use crate::chain::package::PackageTemplate;
3738
use crate::util::logger::Logger;
38-
use crate::util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable, VecWriter};
39+
use crate::util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable};
3940
use crate::util::byte_utils;
4041

4142
use crate::io;
@@ -249,7 +250,7 @@ pub struct OnchainTxHandler<ChannelSigner: Sign> {
249250
pub(super) secp_ctx: Secp256k1<secp256k1::All>,
250251
}
251252

252-
const SERIALIZATION_VERSION: u8 = 1;
253+
const SERIALIZATION_VERSION: u8 = 2;
253254
const MIN_SERIALIZATION_VERSION: u8 = 1;
254255

255256
impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
@@ -264,13 +265,6 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
264265

265266
self.channel_transaction_parameters.write(writer)?;
266267

267-
let mut key_data = VecWriter(Vec::new());
268-
self.signer.write(&mut key_data)?;
269-
assert!(key_data.0.len() < core::usize::MAX);
270-
assert!(key_data.0.len() < core::u32::MAX as usize);
271-
(key_data.0.len() as u32).write(writer)?;
272-
writer.write_all(&key_data.0[..])?;
273-
274268
writer.write_all(&byte_utils::be64_to_array(self.pending_claim_requests.len() as u64))?;
275269
for (ref ancestor_claim_txid, request) in self.pending_claim_requests.iter() {
276270
ancestor_claim_txid.write(writer)?;
@@ -303,9 +297,13 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
303297
}
304298
}
305299

306-
impl<'a, K: KeysInterface> ReadableArgs<&'a K> for OnchainTxHandler<K::Signer> {
307-
fn read<R: io::Read>(reader: &mut R, keys_manager: &'a K) -> Result<Self, DecodeError> {
308-
let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
300+
impl<'a, K: KeysInterface> ReadableArgs<(&'a K, u64, [u8; 32])> for OnchainTxHandler<K::Signer> {
301+
fn read<R: io::Read>(reader: &mut R, args: (&'a K, u64, [u8; 32])) -> Result<Self, DecodeError> {
302+
let keys_manager = args.0;
303+
let channel_value_satoshis = args.1;
304+
let channel_keys_id = args.2;
305+
306+
let ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
309307

310308
let destination_script = Readable::read(reader)?;
311309

@@ -316,16 +314,22 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K> for OnchainTxHandler<K::Signer> {
316314

317315
let channel_parameters = Readable::read(reader)?;
318316

319-
let keys_len: u32 = Readable::read(reader)?;
320-
let mut keys_data = Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE));
321-
while keys_data.len() != keys_len as usize {
322-
// Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
323-
let mut data = [0; 1024];
324-
let read_slice = &mut data[0..cmp::min(1024, keys_len as usize - keys_data.len())];
325-
reader.read_exact(read_slice)?;
326-
keys_data.extend_from_slice(read_slice);
317+
let mut signer: K::Signer;
318+
if ver <= 1 {
319+
let keys_len: u32 = Readable::read(reader)?;
320+
let mut keys_data = Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE));
321+
while keys_data.len() != keys_len as usize {
322+
// Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
323+
let mut data = [0; 1024];
324+
let read_slice = &mut data[0..cmp::min(1024, keys_len as usize - keys_data.len())];
325+
reader.read_exact(read_slice)?;
326+
keys_data.extend_from_slice(read_slice);
327+
}
328+
signer = keys_manager.read_chan_signer(&keys_data)?;
329+
} else {
330+
signer = keys_manager.derive_channel_signer(channel_value_satoshis, channel_keys_id);
327331
}
328-
let signer = keys_manager.read_chan_signer(&keys_data)?;
332+
signer.ready_channel(&channel_parameters);
329333

330334
let pending_claim_requests_len: u64 = Readable::read(reader)?;
331335
let mut pending_claim_requests = HashMap::with_capacity(cmp::min(pending_claim_requests_len as usize, MAX_ALLOC_SIZE / 128));

0 commit comments

Comments
 (0)