@@ -89,11 +89,9 @@ pub struct ChannelMonitorUpdate {
89
89
/// [`ChannelMonitorUpdateStatus::InProgress`] have been applied to all copies of a given
90
90
/// ChannelMonitor when ChannelManager::channel_monitor_updated is called.
91
91
///
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.
97
95
///
98
96
/// [`ChannelMonitorUpdateStatus::InProgress`]: super::ChannelMonitorUpdateStatus::InProgress
99
97
pub update_id : u64 ,
@@ -104,15 +102,9 @@ pub struct ChannelMonitorUpdate {
104
102
pub channel_id : Option < ChannelId > ,
105
103
}
106
104
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 ;
116
108
117
109
impl Writeable for ChannelMonitorUpdate {
118
110
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
@@ -1553,6 +1545,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
1553
1545
1554
1546
/// Gets the update_id from the latest ChannelMonitorUpdate which was applied to this
1555
1547
/// ChannelMonitor.
1548
+ ///
1549
+ /// Note that for channels closed prior to LDK 0.1, this may return [`u64::MAX`].
1556
1550
pub fn get_latest_update_id ( & self ) -> u64 {
1557
1551
self . inner . lock ( ) . unwrap ( ) . get_latest_update_id ( )
1558
1552
}
@@ -1717,6 +1711,12 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
1717
1711
self . inner . lock ( ) . unwrap ( ) . get_cur_holder_commitment_number ( )
1718
1712
}
1719
1713
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
+
1720
1720
/// Gets the `node_id` of the counterparty for this channel.
1721
1721
///
1722
1722
/// 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> {
3110
3110
F :: Target : FeeEstimator ,
3111
3111
L :: Target : Logger ,
3112
3112
{
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)." ,
3115
3115
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)." ,
3118
3118
log_funding_info!( self ) , updates. updates. len( ) ) ;
3119
3119
} else {
3120
3120
log_info ! ( logger, "Applying update to monitor {}, bringing update_id from {} to {} with {} change(s)." ,
@@ -3137,14 +3137,14 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
3137
3137
// The `ChannelManager` may also queue redundant `ChannelForceClosed` updates if it still
3138
3138
// thinks the channel needs to have its commitment transaction broadcast, so we'll allow
3139
3139
// 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 {
3141
3141
assert_eq ! ( updates. updates. len( ) , 1 ) ;
3142
3142
match updates. updates [ 0 ] {
3143
3143
ChannelMonitorUpdateStep :: ChannelForceClosed { .. } => { } ,
3144
3144
// We should have already seen a `ChannelForceClosed` update if we're trying to
3145
3145
// provide a preimage at this point.
3146
3146
ChannelMonitorUpdateStep :: PaymentPreimage { .. } =>
3147
- debug_assert_eq ! ( self . latest_update_id , CLOSED_CHANNEL_UPDATE_ID ) ,
3147
+ debug_assert ! ( self . lockdown_from_offchain ) ,
3148
3148
_ => {
3149
3149
log_error ! ( logger, "Attempted to apply post-force-close ChannelMonitorUpdate of type {}" , updates. updates[ 0 ] . variant_name( ) ) ;
3150
3150
panic ! ( "Attempted to apply post-force-close ChannelMonitorUpdate that wasn't providing a payment preimage" ) ;
@@ -3224,17 +3224,29 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
3224
3224
self . counterparty_commitment_txs_from_update ( updates) ;
3225
3225
}
3226
3226
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
-
3233
3227
self . latest_update_id = updates. update_id ;
3234
3228
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 {
3238
3250
log_error ! ( logger, "Refusing Channel Monitor Update as counterparty attempted to update commitment after funding was spent" ) ;
3239
3251
Err ( ( ) )
3240
3252
} else { ret }
0 commit comments