@@ -428,6 +428,53 @@ struct RemoteCommitmentTransaction {
428428 per_htlc : HashMap < Txid , Vec < HTLCOutputInCommitment > >
429429}
430430
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+
431478/// When ChannelMonitor discovers an onchain outpoint being a step of a channel and that it needs
432479/// to generate a tx to push channel state forward, we cache outpoint-solving tx material to build
433480/// a new bumped one in case of lenghty confirmation delay
@@ -915,17 +962,7 @@ impl<ChanSigner: ChannelKeys + Writeable> ChannelMonitor<ChanSigner> {
915962 self . current_remote_commitment_txid . write ( writer) ?;
916963 self . prev_remote_commitment_txid . write ( writer) ?;
917964
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) ?;
929966 self . funding_redeemscript . write ( writer) ?;
930967 self . channel_value_satoshis . write ( writer) ?;
931968
@@ -2281,31 +2318,7 @@ impl<ChanSigner: ChannelKeys + Readable> ReadableArgs<Arc<Logger>> for (BlockHas
22812318 let current_remote_commitment_txid = Readable :: read ( reader) ?;
22822319 let prev_remote_commitment_txid = Readable :: read ( reader) ?;
22832320
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) ?;
23092322 let funding_redeemscript = Readable :: read ( reader) ?;
23102323 let channel_value_satoshis = Readable :: read ( reader) ?;
23112324
0 commit comments