@@ -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) ]
@@ -35,7 +36,7 @@ use crate::chain::keysinterface::{Sign, KeysInterface};
35
36
use crate :: chain:: package:: PackageSolvingData ;
36
37
use crate :: chain:: package:: PackageTemplate ;
37
38
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 } ;
39
40
use crate :: util:: byte_utils;
40
41
41
42
use crate :: io;
@@ -249,7 +250,7 @@ pub struct OnchainTxHandler<ChannelSigner: Sign> {
249
250
pub ( super ) secp_ctx : Secp256k1 < secp256k1:: All > ,
250
251
}
251
252
252
- const SERIALIZATION_VERSION : u8 = 1 ;
253
+ const SERIALIZATION_VERSION : u8 = 2 ;
253
254
const MIN_SERIALIZATION_VERSION : u8 = 1 ;
254
255
255
256
impl < ChannelSigner : Sign > OnchainTxHandler < ChannelSigner > {
@@ -264,13 +265,6 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
264
265
265
266
self . channel_transaction_parameters . write ( writer) ?;
266
267
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
-
274
268
writer. write_all ( & byte_utils:: be64_to_array ( self . pending_claim_requests . len ( ) as u64 ) ) ?;
275
269
for ( ref ancestor_claim_txid, request) in self . pending_claim_requests . iter ( ) {
276
270
ancestor_claim_txid. write ( writer) ?;
@@ -303,9 +297,13 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
303
297
}
304
298
}
305
299
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 ) ;
309
307
310
308
let destination_script = Readable :: read ( reader) ?;
311
309
@@ -316,16 +314,22 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K> for OnchainTxHandler<K::Signer> {
316
314
317
315
let channel_parameters = Readable :: read ( reader) ?;
318
316
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) ;
327
331
}
328
- let signer = keys_manager . read_chan_signer ( & keys_data ) ? ;
332
+ signer. ready_channel ( & channel_parameters ) ;
329
333
330
334
let pending_claim_requests_len: u64 = Readable :: read ( reader) ?;
331
335
let mut pending_claim_requests = HashMap :: with_capacity ( cmp:: min ( pending_claim_requests_len as usize , MAX_ALLOC_SIZE / 128 ) ) ;
0 commit comments