@@ -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) ]
@@ -35,7 +36,7 @@ use crate::chain::keysinterface::{Sign, KeysInterface};
3536use crate :: chain:: package:: PackageSolvingData ;
3637use crate :: chain:: package:: PackageTemplate ;
3738use 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 } ;
3940use crate :: util:: byte_utils;
4041
4142use 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 ;
253254const MIN_SERIALIZATION_VERSION : u8 = 1 ;
254255
255256impl < 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