@@ -21,6 +21,7 @@ use bitcoin::hash_types::{Txid, BlockHash};
21
21
use bitcoin:: secp256k1:: { Secp256k1 , ecdsa:: Signature } ;
22
22
use bitcoin:: secp256k1;
23
23
24
+ use crate :: chain:: keysinterface:: BaseSign ;
24
25
use crate :: ln:: msgs:: DecodeError ;
25
26
use crate :: ln:: PaymentPreimage ;
26
27
#[ cfg( anchors) ]
@@ -303,8 +304,12 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
303
304
}
304
305
}
305
306
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
+
308
313
let _ver = read_ver_prefix ! ( reader, SERIALIZATION_VERSION ) ;
309
314
310
315
let destination_script = Readable :: read ( reader) ?;
@@ -316,16 +321,21 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K> for OnchainTxHandler<K::Signer> {
316
321
317
322
let channel_parameters = Readable :: read ( reader) ?;
318
323
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.
319
326
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 {
327
+ let mut bytes_read = 0 ;
328
+ while bytes_read != keys_len as usize {
322
329
// Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
323
330
let mut data = [ 0 ; 1024 ] ;
324
- let read_slice = & mut data[ 0 ..cmp:: min ( 1024 , keys_len as usize - keys_data. len ( ) ) ] ;
331
+ let bytes_to_read = cmp:: min ( 1024 , keys_len as usize - bytes_read) ;
332
+ let read_slice = & mut data[ 0 ..bytes_to_read] ;
325
333
reader. read_exact ( read_slice) ?;
326
- keys_data . extend_from_slice ( read_slice ) ;
334
+ bytes_read += bytes_to_read ;
327
335
}
328
- let signer = keys_manager. read_chan_signer ( & keys_data) ?;
336
+
337
+ let mut signer = keys_manager. derive_channel_signer ( channel_value_satoshis, channel_keys_id) ;
338
+ signer. provide_channel_parameters ( & channel_parameters) ;
329
339
330
340
let pending_claim_requests_len: u64 = Readable :: read ( reader) ?;
331
341
let mut pending_claim_requests = HashMap :: with_capacity ( cmp:: min ( pending_claim_requests_len as usize , MAX_ALLOC_SIZE / 128 ) ) ;
0 commit comments