@@ -89,11 +89,9 @@ pub struct ChannelMonitorUpdate {
8989 /// [`ChannelMonitorUpdateStatus::InProgress`] have been applied to all copies of a given
9090 /// ChannelMonitor when ChannelManager::channel_monitor_updated is called.
9191 ///
92- /// The only instances we allow where update_id values are not strictly increasing have a
93- /// special update ID of [`CLOSED_CHANNEL_UPDATE_ID`]. This update ID is used for updates that
94- /// will force close the channel by broadcasting the latest commitment transaction or
95- /// special post-force-close updates, like providing preimages necessary to claim outputs on the
96- /// broadcast commitment transaction. See its docs for more details.
92+ /// Note that for [`ChannelMonitorUpdate`]s generated on LDK versions prior to 0.1 after the
93+ /// channel was closed, this value may be [`u64::MAX`]. In that case, multiple updates may
94+ /// appear with the same ID, and all should be replayed.
9795 ///
9896 /// [`ChannelMonitorUpdateStatus::InProgress`]: super::ChannelMonitorUpdateStatus::InProgress
9997 pub update_id : u64 ,
@@ -104,15 +102,9 @@ pub struct ChannelMonitorUpdate {
104102 pub channel_id : Option < ChannelId > ,
105103}
106104
107- /// The update ID used for a [`ChannelMonitorUpdate`] that is either:
108- ///
109- /// (1) attempting to force close the channel by broadcasting our latest commitment transaction or
110- /// (2) providing a preimage (after the channel has been force closed) from a forward link that
111- /// allows us to spend an HTLC output on this channel's (the backward link's) broadcasted
112- /// commitment transaction.
113- ///
114- /// No other [`ChannelMonitorUpdate`]s are allowed after force-close.
115- pub const CLOSED_CHANNEL_UPDATE_ID : u64 = core:: u64:: MAX ;
105+ /// LDK prior to 0.1 used this constant as the [`ChannelMonitorUpdate::update_id`] for any
106+ /// [`ChannelMonitorUpdate`]s which were generated after the channel was closed.
107+ const LEGACY_CLOSED_CHANNEL_UPDATE_ID : u64 = core:: u64:: MAX ;
116108
117109impl Writeable for ChannelMonitorUpdate {
118110 fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
@@ -1553,6 +1545,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
15531545
15541546 /// Gets the update_id from the latest ChannelMonitorUpdate which was applied to this
15551547 /// ChannelMonitor.
1548+ ///
1549+ /// Note that for channels closed prior to LDK 0.1, this may return [`u64::MAX`].
15561550 pub fn get_latest_update_id ( & self ) -> u64 {
15571551 self . inner . lock ( ) . unwrap ( ) . get_latest_update_id ( )
15581552 }
@@ -1717,6 +1711,12 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
17171711 self . inner . lock ( ) . unwrap ( ) . get_cur_holder_commitment_number ( )
17181712 }
17191713
1714+ /// Gets whether we've been notified that this channel is closed by the `ChannelManager` (i.e.
1715+ /// via a [`ChannelMonitorUpdateStep::ChannelForceClosed`]).
1716+ pub ( crate ) fn offchain_closed ( & self ) -> bool {
1717+ self . inner . lock ( ) . unwrap ( ) . lockdown_from_offchain
1718+ }
1719+
17201720 /// Gets the `node_id` of the counterparty for this channel.
17211721 ///
17221722 /// Will be `None` for channels constructed on LDK versions prior to 0.0.110 and always `Some`
@@ -3110,11 +3110,11 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
31103110 F :: Target : FeeEstimator ,
31113111 L :: Target : Logger ,
31123112 {
3113- if self . latest_update_id == CLOSED_CHANNEL_UPDATE_ID && updates. update_id == CLOSED_CHANNEL_UPDATE_ID {
3114- log_info ! ( logger, "Applying post-force-closed update to monitor {} with {} change(s)." ,
3113+ if self . latest_update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID && updates. update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID {
3114+ log_info ! ( logger, "Applying pre-0.1 post-force-closed update to monitor {} with {} change(s)." ,
31153115 log_funding_info!( self ) , updates. updates. len( ) ) ;
3116- } else if updates. update_id == CLOSED_CHANNEL_UPDATE_ID {
3117- log_info ! ( logger, "Applying force close update to monitor {} with {} change(s)." ,
3116+ } else if updates. update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID {
3117+ log_info ! ( logger, "Applying pre-0.1 force close update to monitor {} with {} change(s)." ,
31183118 log_funding_info!( self ) , updates. updates. len( ) ) ;
31193119 } else {
31203120 log_info ! ( logger, "Applying update to monitor {}, bringing update_id from {} to {} with {} change(s)." ,
@@ -3137,14 +3137,14 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
31373137 // The `ChannelManager` may also queue redundant `ChannelForceClosed` updates if it still
31383138 // thinks the channel needs to have its commitment transaction broadcast, so we'll allow
31393139 // them as well.
3140- if updates. update_id == CLOSED_CHANNEL_UPDATE_ID {
3140+ if updates. update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID || self . lockdown_from_offchain {
31413141 assert_eq ! ( updates. updates. len( ) , 1 ) ;
31423142 match updates. updates [ 0 ] {
31433143 ChannelMonitorUpdateStep :: ChannelForceClosed { .. } => { } ,
31443144 // We should have already seen a `ChannelForceClosed` update if we're trying to
31453145 // provide a preimage at this point.
31463146 ChannelMonitorUpdateStep :: PaymentPreimage { .. } =>
3147- debug_assert_eq ! ( self . latest_update_id , CLOSED_CHANNEL_UPDATE_ID ) ,
3147+ debug_assert ! ( self . lockdown_from_offchain ) ,
31483148 _ => {
31493149 log_error ! ( logger, "Attempted to apply post-force-close ChannelMonitorUpdate of type {}" , updates. updates[ 0 ] . variant_name( ) ) ;
31503150 panic ! ( "Attempted to apply post-force-close ChannelMonitorUpdate that wasn't providing a payment preimage" ) ;
@@ -3224,17 +3224,29 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
32243224 self . counterparty_commitment_txs_from_update ( updates) ;
32253225 }
32263226
3227- // If the updates succeeded and we were in an already closed channel state, then there's no
3228- // need to refuse any updates we expect to receive afer seeing a confirmed commitment.
3229- if ret. is_ok ( ) && updates. update_id == CLOSED_CHANNEL_UPDATE_ID && self . latest_update_id == updates. update_id {
3230- return Ok ( ( ) ) ;
3231- }
3232-
32333227 self . latest_update_id = updates. update_id ;
32343228
3235- // Refuse updates after we've detected a spend onchain, but only if we haven't processed a
3236- // force closed monitor update yet.
3237- if ret. is_ok ( ) && self . funding_spend_seen && self . latest_update_id != CLOSED_CHANNEL_UPDATE_ID {
3229+ // Refuse updates after we've detected a spend onchain (or if the channel was otherwise
3230+ // closed), but only if the update isn't the kind of update we expect to see after channel
3231+ // closure.
3232+ let mut is_pre_close_update = false ;
3233+ for update in updates. updates . iter ( ) {
3234+ match update {
3235+ ChannelMonitorUpdateStep :: LatestHolderCommitmentTXInfo { .. }
3236+ |ChannelMonitorUpdateStep :: LatestCounterpartyCommitmentTXInfo { .. }
3237+ |ChannelMonitorUpdateStep :: ShutdownScript { .. }
3238+ |ChannelMonitorUpdateStep :: CommitmentSecret { .. } =>
3239+ is_pre_close_update = true ,
3240+ // After a channel is closed, we don't communicate with our peer about it, so the
3241+ // only things we will update is getting a new preimage (from a different channel)
3242+ // or being told that the channel is closed. All other updates are generated while
3243+ // talking to our peer.
3244+ ChannelMonitorUpdateStep :: PaymentPreimage { .. } => { } ,
3245+ ChannelMonitorUpdateStep :: ChannelForceClosed { .. } => { } ,
3246+ }
3247+ }
3248+
3249+ if ret. is_ok ( ) && ( self . funding_spend_seen || self . lockdown_from_offchain ) && is_pre_close_update {
32383250 log_error ! ( logger, "Refusing Channel Monitor Update as counterparty attempted to update commitment after funding was spent" ) ;
32393251 Err ( ( ) )
32403252 } else { ret }
0 commit comments