Skip to content

Commit 4f4e84e

Browse files
authored
Merge pull request #2562 from TheBlueMatt/2023-08-no-perm-fail
Drop the ChannelMonitorUpdateStatus::PermanentFailure variant
2 parents f2fe95e + f254c56 commit 4f4e84e

15 files changed

+412
-603
lines changed

fuzz/src/chanmon_consistency.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ impl TestChainMonitor {
138138
}
139139
}
140140
impl chain::Watch<TestChannelSigner> for TestChainMonitor {
141-
fn watch_channel(&self, funding_txo: OutPoint, monitor: channelmonitor::ChannelMonitor<TestChannelSigner>) -> chain::ChannelMonitorUpdateStatus {
141+
fn watch_channel(&self, funding_txo: OutPoint, monitor: channelmonitor::ChannelMonitor<TestChannelSigner>) -> Result<chain::ChannelMonitorUpdateStatus, ()> {
142142
let mut ser = VecWriter(Vec::new());
143143
monitor.write(&mut ser).unwrap();
144144
if let Some(_) = self.latest_monitors.lock().unwrap().insert(funding_txo, (monitor.get_latest_update_id(), ser.0)) {
@@ -500,7 +500,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
500500
let res = (<(BlockHash, ChanMan)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, chain_monitor.clone());
501501
for (funding_txo, mon) in monitors.drain() {
502502
assert_eq!(chain_monitor.chain_monitor.watch_channel(funding_txo, mon),
503-
ChannelMonitorUpdateStatus::Completed);
503+
Ok(ChannelMonitorUpdateStatus::Completed));
504504
}
505505
res
506506
} }

lightning-persister/src/fs_store.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ mod tests {
436436
}
437437

438438
// Test that if the store's path to channel data is read-only, writing a
439-
// monitor to it results in the store returning a PermanentFailure.
439+
// monitor to it results in the store returning an InProgress.
440440
// Windows ignores the read-only flag for folders, so this test is Unix-only.
441441
#[cfg(not(target_os = "windows"))]
442442
#[test]
@@ -470,7 +470,7 @@ mod tests {
470470
index: 0
471471
};
472472
match store.persist_new_channel(test_txo, &added_monitors[0].1, update_id.2) {
473-
ChannelMonitorUpdateStatus::PermanentFailure => {},
473+
ChannelMonitorUpdateStatus::UnrecoverableError => {},
474474
_ => panic!("unexpected result from persisting new channel")
475475
}
476476

@@ -507,7 +507,7 @@ mod tests {
507507
index: 0
508508
};
509509
match store.persist_new_channel(test_txo, &added_monitors[0].1, update_id.2) {
510-
ChannelMonitorUpdateStatus::PermanentFailure => {},
510+
ChannelMonitorUpdateStatus::UnrecoverableError => {},
511511
_ => panic!("unexpected result from persisting new channel")
512512
}
513513

lightning/src/chain/chainmonitor.rs

+106-98
Large diffs are not rendered by default.

lightning/src/chain/channelmonitor.rs

+22-33
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ pub enum MonitorEvent {
134134
HTLCEvent(HTLCUpdate),
135135

136136
/// A monitor event that the Channel's commitment transaction was confirmed.
137-
CommitmentTxConfirmed(OutPoint),
137+
HolderForceClosed(OutPoint),
138138

139139
/// Indicates a [`ChannelMonitor`] update has completed. See
140140
/// [`ChannelMonitorUpdateStatus::InProgress`] for more information on how this is used.
@@ -150,24 +150,18 @@ pub enum MonitorEvent {
150150
/// same [`ChannelMonitor`] have been applied and persisted.
151151
monitor_update_id: u64,
152152
},
153-
154-
/// Indicates a [`ChannelMonitor`] update has failed. See
155-
/// [`ChannelMonitorUpdateStatus::PermanentFailure`] for more information on how this is used.
156-
///
157-
/// [`ChannelMonitorUpdateStatus::PermanentFailure`]: super::ChannelMonitorUpdateStatus::PermanentFailure
158-
UpdateFailed(OutPoint),
159153
}
160154
impl_writeable_tlv_based_enum_upgradable!(MonitorEvent,
161-
// Note that Completed and UpdateFailed are currently never serialized to disk as they are
162-
// generated only in ChainMonitor
155+
// Note that Completed is currently never serialized to disk as it is generated only in
156+
// ChainMonitor.
163157
(0, Completed) => {
164158
(0, funding_txo, required),
165159
(2, monitor_update_id, required),
166160
},
167161
;
168162
(2, HTLCEvent),
169-
(4, CommitmentTxConfirmed),
170-
(6, UpdateFailed),
163+
(4, HolderForceClosed),
164+
// 6 was `UpdateFailed` until LDK 0.0.117
171165
);
172166

173167
/// Simple structure sent back by `chain::Watch` when an HTLC from a forward channel is detected on
@@ -1037,7 +1031,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for ChannelMonitorImpl<Signe
10371031

10381032
writer.write_all(&(self.pending_monitor_events.iter().filter(|ev| match ev {
10391033
MonitorEvent::HTLCEvent(_) => true,
1040-
MonitorEvent::CommitmentTxConfirmed(_) => true,
1034+
MonitorEvent::HolderForceClosed(_) => true,
10411035
_ => false,
10421036
}).count() as u64).to_be_bytes())?;
10431037
for event in self.pending_monitor_events.iter() {
@@ -1046,7 +1040,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for ChannelMonitorImpl<Signe
10461040
0u8.write(writer)?;
10471041
upd.write(writer)?;
10481042
},
1049-
MonitorEvent::CommitmentTxConfirmed(_) => 1u8.write(writer)?,
1043+
MonitorEvent::HolderForceClosed(_) => 1u8.write(writer)?,
10501044
_ => {}, // Covered in the TLV writes below
10511045
}
10521046
}
@@ -1488,21 +1482,20 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitor<Signer> {
14881482
self.inner.lock().unwrap().counterparty_node_id
14891483
}
14901484

1491-
/// Used by ChannelManager deserialization to broadcast the latest holder state if its copy of
1492-
/// the Channel was out-of-date.
1485+
/// Used by [`ChannelManager`] deserialization to broadcast the latest holder state if its copy
1486+
/// of the channel state was out-of-date.
14931487
///
14941488
/// You may also use this to broadcast the latest local commitment transaction, either because
1495-
/// a monitor update failed with [`ChannelMonitorUpdateStatus::PermanentFailure`] or because we've
1496-
/// fallen behind (i.e. we've received proof that our counterparty side knows a revocation
1497-
/// secret we gave them that they shouldn't know).
1489+
/// a monitor update failed or because we've fallen behind (i.e. we've received proof that our
1490+
/// counterparty side knows a revocation secret we gave them that they shouldn't know).
14981491
///
14991492
/// Broadcasting these transactions in the second case is UNSAFE, as they allow counterparty
15001493
/// side to punish you. Nevertheless you may want to broadcast them if counterparty doesn't
15011494
/// close channel with their commitment transaction after a substantial amount of time. Best
15021495
/// may be to contact the other node operator out-of-band to coordinate other options available
1503-
/// to you. In any-case, the choice is up to you.
1496+
/// to you.
15041497
///
1505-
/// [`ChannelMonitorUpdateStatus::PermanentFailure`]: super::ChannelMonitorUpdateStatus::PermanentFailure
1498+
/// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
15061499
pub fn get_latest_holder_commitment_txn<L: Deref>(&self, logger: &L) -> Vec<Transaction>
15071500
where L::Target: Logger {
15081501
self.inner.lock().unwrap().get_latest_holder_commitment_txn(logger)
@@ -2533,7 +2526,7 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
25332526
txs.push(tx);
25342527
}
25352528
broadcaster.broadcast_transactions(&txs);
2536-
self.pending_monitor_events.push(MonitorEvent::CommitmentTxConfirmed(self.funding_info.0));
2529+
self.pending_monitor_events.push(MonitorEvent::HolderForceClosed(self.funding_info.0));
25372530
}
25382531

25392532
pub fn update_monitor<B: Deref, F: Deref, L: Deref>(&mut self, updates: &ChannelMonitorUpdate, broadcaster: &B, fee_estimator: F, logger: &L) -> Result<(), ()>
@@ -2599,6 +2592,7 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
25992592
ChannelMonitorUpdateStep::CommitmentSecret { idx, secret } => {
26002593
log_trace!(logger, "Updating ChannelMonitor with commitment secret");
26012594
if let Err(e) = self.provide_secret(*idx, *secret) {
2595+
debug_assert!(false, "Latest counterparty commitment secret was invalid");
26022596
log_error!(logger, "Providing latest counterparty commitment secret failed/was refused:");
26032597
log_error!(logger, " {}", e);
26042598
ret = Err(());
@@ -2645,7 +2639,7 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
26452639
log_error!(logger, " in channel monitor for channel {}!", &self.funding_info.0.to_channel_id());
26462640
log_error!(logger, " Read the docs for ChannelMonitor::get_latest_holder_commitment_txn and take manual action!");
26472641
} else {
2648-
// If we generated a MonitorEvent::CommitmentTxConfirmed, the ChannelManager
2642+
// If we generated a MonitorEvent::HolderForceClosed, the ChannelManager
26492643
// will still give us a ChannelForceClosed event with !should_broadcast, but we
26502644
// shouldn't print the scary warning above.
26512645
log_info!(logger, "Channel off-chain state closed after we broadcasted our latest commitment transaction.");
@@ -3490,7 +3484,7 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
34903484
let funding_outp = HolderFundingOutput::build(self.funding_redeemscript.clone(), self.channel_value_satoshis, self.onchain_tx_handler.channel_type_features().clone());
34913485
let commitment_package = PackageTemplate::build_package(self.funding_info.0.txid.clone(), self.funding_info.0.index as u32, PackageSolvingData::HolderFundingOutput(funding_outp), self.best_block.height(), self.best_block.height());
34923486
claimable_outpoints.push(commitment_package);
3493-
self.pending_monitor_events.push(MonitorEvent::CommitmentTxConfirmed(self.funding_info.0));
3487+
self.pending_monitor_events.push(MonitorEvent::HolderForceClosed(self.funding_info.0));
34943488
// Although we aren't signing the transaction directly here, the transaction will be signed
34953489
// in the claim that is queued to OnchainTxHandler. We set holder_tx_signed here to reject
34963490
// new channel updates.
@@ -4254,7 +4248,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
42544248
for _ in 0..pending_monitor_events_len {
42554249
let ev = match <u8 as Readable>::read(reader)? {
42564250
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
4257-
1 => MonitorEvent::CommitmentTxConfirmed(funding_info.0),
4251+
1 => MonitorEvent::HolderForceClosed(funding_info.0),
42584252
_ => return Err(DecodeError::InvalidValue)
42594253
};
42604254
pending_monitor_events.as_mut().unwrap().push(ev);
@@ -4413,13 +4407,12 @@ mod tests {
44134407
use crate::chain::chaininterface::LowerBoundedFeeEstimator;
44144408

44154409
use super::ChannelMonitorUpdateStep;
4416-
use crate::{check_added_monitors, check_closed_broadcast, check_closed_event, check_spends, get_local_commitment_txn, get_monitor, get_route_and_payment_hash, unwrap_send_err};
4410+
use crate::{check_added_monitors, check_spends, get_local_commitment_txn, get_monitor, get_route_and_payment_hash, unwrap_send_err};
44174411
use crate::chain::{BestBlock, Confirm};
44184412
use crate::chain::channelmonitor::ChannelMonitor;
44194413
use crate::chain::package::{weight_offered_htlc, weight_received_htlc, weight_revoked_offered_htlc, weight_revoked_received_htlc, WEIGHT_REVOKED_OUTPUT};
44204414
use crate::chain::transaction::OutPoint;
44214415
use crate::sign::InMemorySigner;
4422-
use crate::events::ClosureReason;
44234416
use crate::ln::{PaymentPreimage, PaymentHash};
44244417
use crate::ln::chan_utils;
44254418
use crate::ln::chan_utils::{HTLCOutputInCommitment, ChannelPublicKeys, ChannelTransactionParameters, HolderCommitmentTransaction, CounterpartyChannelTransactionParameters};
@@ -4485,18 +4478,14 @@ mod tests {
44854478
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], 100_000);
44864479
unwrap_send_err!(nodes[1].node.send_payment_with_route(&route, payment_hash,
44874480
RecipientOnionFields::secret_only(payment_secret), PaymentId(payment_hash.0)
4488-
), true, APIError::ChannelUnavailable { ref err },
4489-
assert!(err.contains("ChannelMonitor storage failure")));
4490-
check_added_monitors!(nodes[1], 2); // After the failure we generate a close-channel monitor update
4491-
check_closed_broadcast!(nodes[1], true);
4492-
check_closed_event!(nodes[1], 1, ClosureReason::ProcessingError { err: "ChannelMonitor storage failure".to_string() },
4493-
[nodes[0].node.get_our_node_id()], 100000);
4481+
), false, APIError::MonitorUpdateInProgress, {});
4482+
check_added_monitors!(nodes[1], 1);
44944483

44954484
// Build a new ChannelMonitorUpdate which contains both the failing commitment tx update
44964485
// and provides the claim preimages for the two pending HTLCs. The first update generates
44974486
// an error, but the point of this test is to ensure the later updates are still applied.
44984487
let monitor_updates = nodes[1].chain_monitor.monitor_updates.lock().unwrap();
4499-
let mut replay_update = monitor_updates.get(&channel.2).unwrap().iter().rev().skip(1).next().unwrap().clone();
4488+
let mut replay_update = monitor_updates.get(&channel.2).unwrap().iter().rev().next().unwrap().clone();
45004489
assert_eq!(replay_update.updates.len(), 1);
45014490
if let ChannelMonitorUpdateStep::LatestCounterpartyCommitmentTXInfo { .. } = replay_update.updates[0] {
45024491
} else { panic!(); }

0 commit comments

Comments
 (0)