Skip to content

Commit c689888

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 1c7c967 commit c689888

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3789,7 +3789,9 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K>
37893789
return Err(DecodeError::InvalidValue);
37903790
}
37913791
}
3792-
let onchain_tx_handler: OnchainTxHandler<K::Signer> = ReadableArgs::read(reader, keys_manager)?;
3792+
let onchain_tx_handler: OnchainTxHandler<K::Signer> = ReadableArgs::read(
3793+
reader, (keys_manager, channel_value_satoshis, channel_keys_id)
3794+
)?;
37933795

37943796
let lockdown_from_offchain = Readable::read(reader)?;
37953797
let holder_tx_signed = Readable::read(reader)?;

lightning/src/chain/onchaintx.rs

Lines changed: 12 additions & 3 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)]
@@ -303,8 +304,12 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
303304
}
304305
}
305306

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> {
307+
impl<'a, K: KeysInterface> ReadableArgs<(&'a K, u64, [u8; 32])> for OnchainTxHandler<K::Signer> {
308+
fn read<R: io::Read>(reader: &mut R, args: (&'a K, u64, [u8; 32])) -> Result<Self, DecodeError> {
309+
let keys_manager = args.0;
310+
let channel_value_satoshis = args.1;
311+
let channel_keys_id = args.2;
312+
308313
let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
309314

310315
let destination_script = Readable::read(reader)?;
@@ -316,6 +321,8 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K> for OnchainTxHandler<K::Signer> {
316321

317322
let channel_parameters = Readable::read(reader)?;
318323

324+
// Read the serialized signer bytes, but don't deserialize them, as we'll obtain our signer
325+
// by re-deriving the private key material.
319326
let keys_len: u32 = Readable::read(reader)?;
320327
let mut keys_data = Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE));
321328
while keys_data.len() != keys_len as usize {
@@ -325,7 +332,9 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K> for OnchainTxHandler<K::Signer> {
325332
reader.read_exact(read_slice)?;
326333
keys_data.extend_from_slice(read_slice);
327334
}
328-
let signer = keys_manager.read_chan_signer(&keys_data)?;
335+
336+
let mut signer = keys_manager.derive_channel_signer(channel_value_satoshis, channel_keys_id);
337+
signer.provide_channel_parameters(&channel_parameters);
329338

330339
let pending_claim_requests_len: u64 = Readable::read(reader)?;
331340
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)