@@ -428,6 +428,53 @@ struct RemoteCommitmentTransaction {
428
428
per_htlc : HashMap < Txid , Vec < HTLCOutputInCommitment > >
429
429
}
430
430
431
+ impl Writeable for RemoteCommitmentTransaction {
432
+ fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
433
+ self . remote_delayed_payment_base_key . write ( w) ?;
434
+ self . remote_htlc_base_key . write ( w) ?;
435
+ w. write_all ( & byte_utils:: be16_to_array ( self . on_remote_tx_csv ) ) ?;
436
+ w. write_all ( & byte_utils:: be64_to_array ( self . per_htlc . len ( ) as u64 ) ) ?;
437
+ for ( ref txid, ref htlcs) in self . per_htlc . iter ( ) {
438
+ w. write_all ( & txid[ ..] ) ?;
439
+ w. write_all ( & byte_utils:: be64_to_array ( htlcs. len ( ) as u64 ) ) ?;
440
+ for & ref htlc in htlcs. iter ( ) {
441
+ htlc. write ( w) ?;
442
+ }
443
+ }
444
+ Ok ( ( ) )
445
+ }
446
+ }
447
+ impl Readable for RemoteCommitmentTransaction {
448
+ fn read < R : :: std:: io:: Read > ( r : & mut R ) -> Result < Self , DecodeError > {
449
+ let remote_commitment_transaction = {
450
+ let remote_delayed_payment_base_key = Readable :: read ( r) ?;
451
+ let remote_htlc_base_key = Readable :: read ( r) ?;
452
+ let on_remote_tx_csv: u16 = Readable :: read ( r) ?;
453
+ let per_htlc_len: u64 = Readable :: read ( r) ?;
454
+ let mut per_htlc = HashMap :: with_capacity ( cmp:: min ( per_htlc_len as usize , MAX_ALLOC_SIZE / 64 ) ) ;
455
+ for _ in 0 ..per_htlc_len {
456
+ let txid: Txid = Readable :: read ( r) ?;
457
+ let htlcs_count: u64 = Readable :: read ( r) ?;
458
+ let mut htlcs = Vec :: with_capacity ( cmp:: min ( htlcs_count as usize , MAX_ALLOC_SIZE / 32 ) ) ;
459
+ for _ in 0 ..htlcs_count {
460
+ let htlc = Readable :: read ( r) ?;
461
+ htlcs. push ( htlc) ;
462
+ }
463
+ if let Some ( _) = per_htlc. insert ( txid, htlcs) {
464
+ return Err ( DecodeError :: InvalidValue ) ;
465
+ }
466
+ }
467
+ RemoteCommitmentTransaction {
468
+ remote_delayed_payment_base_key,
469
+ remote_htlc_base_key,
470
+ on_remote_tx_csv,
471
+ per_htlc,
472
+ }
473
+ } ;
474
+ Ok ( remote_commitment_transaction)
475
+ }
476
+ }
477
+
431
478
/// When ChannelMonitor discovers an onchain outpoint being a step of a channel and that it needs
432
479
/// to generate a tx to push channel state forward, we cache outpoint-solving tx material to build
433
480
/// a new bumped one in case of lenghty confirmation delay
@@ -915,17 +962,7 @@ impl<ChanSigner: ChannelKeys + Writeable> ChannelMonitor<ChanSigner> {
915
962
self . current_remote_commitment_txid . write ( writer) ?;
916
963
self . prev_remote_commitment_txid . write ( writer) ?;
917
964
918
- self . remote_tx_cache . remote_delayed_payment_base_key . write ( writer) ?;
919
- self . remote_tx_cache . remote_htlc_base_key . write ( writer) ?;
920
- writer. write_all ( & byte_utils:: be16_to_array ( self . remote_tx_cache . on_remote_tx_csv ) ) ?;
921
- writer. write_all ( & byte_utils:: be64_to_array ( self . remote_tx_cache . per_htlc . len ( ) as u64 ) ) ?;
922
- for ( ref txid, ref htlcs) in self . remote_tx_cache . per_htlc . iter ( ) {
923
- writer. write_all ( & txid[ ..] ) ?;
924
- writer. write_all ( & byte_utils:: be64_to_array ( htlcs. len ( ) as u64 ) ) ?;
925
- for & ref htlc in htlcs. iter ( ) {
926
- htlc. write ( writer) ?;
927
- }
928
- }
965
+ self . remote_tx_cache . write ( writer) ?;
929
966
self . funding_redeemscript . write ( writer) ?;
930
967
self . channel_value_satoshis . write ( writer) ?;
931
968
@@ -2281,31 +2318,7 @@ impl<ChanSigner: ChannelKeys + Readable> ReadableArgs<Arc<Logger>> for (BlockHas
2281
2318
let current_remote_commitment_txid = Readable :: read ( reader) ?;
2282
2319
let prev_remote_commitment_txid = Readable :: read ( reader) ?;
2283
2320
2284
- let remote_tx_cache = {
2285
- let remote_delayed_payment_base_key = Readable :: read ( reader) ?;
2286
- let remote_htlc_base_key = Readable :: read ( reader) ?;
2287
- let on_remote_tx_csv: u16 = Readable :: read ( reader) ?;
2288
- let per_htlc_len: u64 = Readable :: read ( reader) ?;
2289
- let mut per_htlc = HashMap :: with_capacity ( cmp:: min ( per_htlc_len as usize , MAX_ALLOC_SIZE / 64 ) ) ;
2290
- for _ in 0 ..per_htlc_len {
2291
- let txid: Txid = Readable :: read ( reader) ?;
2292
- let htlcs_count: u64 = Readable :: read ( reader) ?;
2293
- let mut htlcs = Vec :: with_capacity ( cmp:: min ( htlcs_count as usize , MAX_ALLOC_SIZE / 32 ) ) ;
2294
- for _ in 0 ..htlcs_count {
2295
- let htlc = Readable :: read ( reader) ?;
2296
- htlcs. push ( htlc) ;
2297
- }
2298
- if let Some ( _) = per_htlc. insert ( txid, htlcs) {
2299
- return Err ( DecodeError :: InvalidValue ) ;
2300
- }
2301
- }
2302
- RemoteCommitmentTransaction {
2303
- remote_delayed_payment_base_key,
2304
- remote_htlc_base_key,
2305
- on_remote_tx_csv,
2306
- per_htlc,
2307
- }
2308
- } ;
2321
+ let remote_tx_cache = Readable :: read ( reader) ?;
2309
2322
let funding_redeemscript = Readable :: read ( reader) ?;
2310
2323
let channel_value_satoshis = Readable :: read ( reader) ?;
2311
2324
0 commit comments