@@ -21,6 +21,7 @@ use bitcoin::hash_types::{Txid, BlockHash};
2121use bitcoin:: secp256k1:: { Secp256k1 , ecdsa:: Signature } ;
2222use bitcoin:: secp256k1;
2323
24+ use crate :: chain:: keysinterface:: BaseSign ;
2425use crate :: ln:: msgs:: DecodeError ;
2526use 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,16 +321,21 @@ 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) ?;
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 {
322329 // Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
323330 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] ;
325333 reader. read_exact ( read_slice) ?;
326- keys_data . extend_from_slice ( read_slice ) ;
334+ bytes_read += bytes_to_read ;
327335 }
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) ;
329339
330340 let pending_claim_requests_len: u64 = Readable :: read ( reader) ?;
331341 let mut pending_claim_requests = HashMap :: with_capacity ( cmp:: min ( pending_claim_requests_len as usize , MAX_ALLOC_SIZE / 128 ) ) ;
0 commit comments