@@ -2695,19 +2695,16 @@ impl<Signer: Sign> Channel<Signer> {
2695
2695
}
2696
2696
}
2697
2697
2698
- /// Removes any uncommitted HTLCs, to be used on peer disconnection, including any pending
2699
- /// HTLCs that we intended to add but haven't as we were waiting on a remote revoke.
2700
- /// Returns the set of PendingHTLCStatuses from remote uncommitted HTLCs (which we're
2701
- /// implicitly dropping) and the payment_hashes of HTLCs we tried to add but are dropping.
2698
+ /// Removes any uncommitted inbound HTLCs and resets the state of uncommitted outbound HTLC
2699
+ /// updates, to be used on peer disconnection. After this, update_*_htlc messages need to be
2700
+ /// resent.
2702
2701
/// No further message handling calls may be made until a channel_reestablish dance has
2703
2702
/// completed.
2704
- pub fn remove_uncommitted_htlcs_and_mark_paused < L : Deref > ( & mut self , logger : & L ) -> Vec < ( HTLCSource , PaymentHash ) > where L :: Target : Logger {
2705
- let mut outbound_drops = Vec :: new ( ) ;
2706
-
2703
+ pub fn remove_uncommitted_htlcs_and_mark_paused < L : Deref > ( & mut self , logger : & L ) where L :: Target : Logger {
2707
2704
assert_eq ! ( self . channel_state & ChannelState :: ShutdownComplete as u32 , 0 ) ;
2708
2705
if self . channel_state < ChannelState :: FundingSent as u32 {
2709
2706
self . channel_state = ChannelState :: ShutdownComplete as u32 ;
2710
- return outbound_drops ;
2707
+ return ;
2711
2708
}
2712
2709
// Upon reconnect we have to start the closing_signed dance over, but shutdown messages
2713
2710
// will be retransmitted.
@@ -2750,23 +2747,8 @@ impl<Signer: Sign> Channel<Signer> {
2750
2747
}
2751
2748
}
2752
2749
2753
- self . holding_cell_htlc_updates . retain ( |htlc_update| {
2754
- match htlc_update {
2755
- // Note that currently on channel reestablish we assert that there are
2756
- // no holding cell HTLC update_adds, so if in the future we stop
2757
- // dropping added HTLCs here and failing them backwards, then there will
2758
- // need to be corresponding changes made in the Channel's re-establish
2759
- // logic.
2760
- & HTLCUpdateAwaitingACK :: AddHTLC { ref payment_hash, ref source, .. } => {
2761
- outbound_drops. push ( ( source. clone ( ) , payment_hash. clone ( ) ) ) ;
2762
- false
2763
- } ,
2764
- & HTLCUpdateAwaitingACK :: ClaimHTLC { ..} | & HTLCUpdateAwaitingACK :: FailHTLC { ..} => true ,
2765
- }
2766
- } ) ;
2767
2750
self . channel_state |= ChannelState :: PeerDisconnected as u32 ;
2768
- log_debug ! ( logger, "Peer disconnection resulted in {} remote-announced HTLC drops and {} waiting-to-locally-announced HTLC drops on channel {}" , outbound_drops. len( ) , inbound_drop_count, log_bytes!( self . channel_id( ) ) ) ;
2769
- outbound_drops
2751
+ log_debug ! ( logger, "Peer disconnection resulted in {} remote-announced HTLC drops on channel {}" , inbound_drop_count, log_bytes!( self . channel_id( ) ) ) ;
2770
2752
}
2771
2753
2772
2754
/// Indicates that a ChannelMonitor update failed to be stored by the client and further
@@ -2925,7 +2907,7 @@ impl<Signer: Sign> Channel<Signer> {
2925
2907
2926
2908
/// May panic if some calls other than message-handling calls (which will all Err immediately)
2927
2909
/// have been called between remove_uncommitted_htlcs_and_mark_paused and this call.
2928
- pub fn channel_reestablish < L : Deref > ( & mut self , msg : & msgs:: ChannelReestablish , logger : & L ) -> Result < ( Option < msgs:: FundingLocked > , Option < msgs:: RevokeAndACK > , Option < msgs:: CommitmentUpdate > , Option < ChannelMonitorUpdate > , RAACommitmentOrder , Option < msgs:: Shutdown > ) , ChannelError > where L :: Target : Logger {
2910
+ pub fn channel_reestablish < L : Deref > ( & mut self , msg : & msgs:: ChannelReestablish , logger : & L ) -> Result < ( Option < msgs:: FundingLocked > , Option < msgs:: RevokeAndACK > , Option < msgs:: CommitmentUpdate > , Option < ChannelMonitorUpdate > , RAACommitmentOrder , Vec < ( HTLCSource , PaymentHash ) > , Option < msgs:: Shutdown > ) , ChannelError > where L :: Target : Logger {
2929
2911
if self . channel_state & ( ChannelState :: PeerDisconnected as u32 ) == 0 {
2930
2912
// While BOLT 2 doesn't indicate explicitly we should error this channel here, it
2931
2913
// almost certainly indicates we are going to end up out-of-sync in some way, so we
@@ -2976,15 +2958,15 @@ impl<Signer: Sign> Channel<Signer> {
2976
2958
return Err ( ChannelError :: Close ( "Peer claimed they saw a revoke_and_ack but we haven't sent funding_locked yet" . to_owned ( ) ) ) ;
2977
2959
}
2978
2960
// Short circuit the whole handler as there is nothing we can resend them
2979
- return Ok ( ( None , None , None , None , RAACommitmentOrder :: CommitmentFirst , shutdown_msg) ) ;
2961
+ return Ok ( ( None , None , None , None , RAACommitmentOrder :: CommitmentFirst , Vec :: new ( ) , shutdown_msg) ) ;
2980
2962
}
2981
2963
2982
2964
// We have OurFundingLocked set!
2983
2965
let next_per_commitment_point = self . holder_signer . get_per_commitment_point ( self . cur_holder_commitment_transaction_number , & self . secp_ctx ) ;
2984
2966
return Ok ( ( Some ( msgs:: FundingLocked {
2985
2967
channel_id : self . channel_id ( ) ,
2986
2968
next_per_commitment_point,
2987
- } ) , None , None , None , RAACommitmentOrder :: CommitmentFirst , shutdown_msg) ) ;
2969
+ } ) , None , None , None , RAACommitmentOrder :: CommitmentFirst , Vec :: new ( ) , shutdown_msg) ) ;
2988
2970
}
2989
2971
2990
2972
let required_revoke = if msg. next_remote_commitment_number + 1 == INITIAL_COMMITMENT_NUMBER - self . cur_holder_commitment_transaction_number {
@@ -3025,14 +3007,6 @@ impl<Signer: Sign> Channel<Signer> {
3025
3007
}
3026
3008
3027
3009
if ( self . channel_state & ( ChannelState :: AwaitingRemoteRevoke as u32 | ChannelState :: MonitorUpdateFailed as u32 ) ) == 0 {
3028
- // Note that if in the future we no longer drop holding cell update_adds on peer
3029
- // disconnect, this logic will need to be updated.
3030
- for htlc_update in self . holding_cell_htlc_updates . iter ( ) {
3031
- if let & HTLCUpdateAwaitingACK :: AddHTLC { .. } = htlc_update {
3032
- debug_assert ! ( false , "There shouldn't be any add-HTLCs in the holding cell now because they should have been dropped on peer disconnect. Panic here because said HTLCs won't be handled correctly." ) ;
3033
- }
3034
- }
3035
-
3036
3010
// We're up-to-date and not waiting on a remote revoke (if we are our
3037
3011
// channel_reestablish should result in them sending a revoke_and_ack), but we may
3038
3012
// have received some updates while we were disconnected. Free the holding cell
@@ -3041,20 +3015,14 @@ impl<Signer: Sign> Channel<Signer> {
3041
3015
Err ( ChannelError :: Close ( msg) ) => return Err ( ChannelError :: Close ( msg) ) ,
3042
3016
Err ( ChannelError :: Ignore ( _) ) | Err ( ChannelError :: CloseDelayBroadcast ( _) ) => panic ! ( "Got non-channel-failing result from free_holding_cell_htlcs" ) ,
3043
3017
Ok ( ( Some ( ( commitment_update, monitor_update) ) , htlcs_to_fail) ) => {
3044
- // If in the future we no longer drop holding cell update_adds on peer
3045
- // disconnect, we may be handed some HTLCs to fail backwards here.
3046
- assert ! ( htlcs_to_fail. is_empty( ) ) ;
3047
- return Ok ( ( resend_funding_locked, required_revoke, Some ( commitment_update) , Some ( monitor_update) , self . resend_order . clone ( ) , shutdown_msg) ) ;
3018
+ return Ok ( ( resend_funding_locked, required_revoke, Some ( commitment_update) , Some ( monitor_update) , self . resend_order . clone ( ) , htlcs_to_fail, shutdown_msg) ) ;
3048
3019
} ,
3049
3020
Ok ( ( None , htlcs_to_fail) ) => {
3050
- // If in the future we no longer drop holding cell update_adds on peer
3051
- // disconnect, we may be handed some HTLCs to fail backwards here.
3052
- assert ! ( htlcs_to_fail. is_empty( ) ) ;
3053
- return Ok ( ( resend_funding_locked, required_revoke, None , None , self . resend_order . clone ( ) , shutdown_msg) ) ;
3021
+ return Ok ( ( resend_funding_locked, required_revoke, None , None , self . resend_order . clone ( ) , htlcs_to_fail, shutdown_msg) ) ;
3054
3022
} ,
3055
3023
}
3056
3024
} else {
3057
- return Ok ( ( resend_funding_locked, required_revoke, None , None , self . resend_order . clone ( ) , shutdown_msg) ) ;
3025
+ return Ok ( ( resend_funding_locked, required_revoke, None , None , self . resend_order . clone ( ) , Vec :: new ( ) , shutdown_msg) ) ;
3058
3026
}
3059
3027
} else if msg. next_local_commitment_number == next_counterparty_commitment_number - 1 {
3060
3028
if required_revoke. is_some ( ) {
@@ -3065,10 +3033,10 @@ impl<Signer: Sign> Channel<Signer> {
3065
3033
3066
3034
if self . channel_state & ( ChannelState :: MonitorUpdateFailed as u32 ) != 0 {
3067
3035
self . monitor_pending_commitment_signed = true ;
3068
- return Ok ( ( resend_funding_locked, None , None , None , self . resend_order . clone ( ) , shutdown_msg) ) ;
3036
+ return Ok ( ( resend_funding_locked, None , None , None , self . resend_order . clone ( ) , Vec :: new ( ) , shutdown_msg) ) ;
3069
3037
}
3070
3038
3071
- return Ok ( ( resend_funding_locked, required_revoke, Some ( self . get_last_commitment_update ( logger) ) , None , self . resend_order . clone ( ) , shutdown_msg) ) ;
3039
+ return Ok ( ( resend_funding_locked, required_revoke, Some ( self . get_last_commitment_update ( logger) ) , None , self . resend_order . clone ( ) , Vec :: new ( ) , shutdown_msg) ) ;
3072
3040
} else {
3073
3041
return Err ( ChannelError :: Close ( "Peer attempted to reestablish channel with a very old remote commitment transaction" . to_owned ( ) ) ) ;
3074
3042
}
@@ -4404,7 +4372,7 @@ impl Readable for ChannelUpdateStatus {
4404
4372
impl < Signer : Sign > Writeable for Channel < Signer > {
4405
4373
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
4406
4374
// Note that we write out as if remove_uncommitted_htlcs_and_mark_paused had just been
4407
- // called but include holding cell updates (and obviously we don't modify self) .
4375
+ // called.
4408
4376
4409
4377
writer. write_all ( & [ SERIALIZATION_VERSION ; 1 ] ) ?;
4410
4378
writer. write_all ( & [ MIN_SERIALIZATION_VERSION ; 1 ] ) ?;
0 commit comments