Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
1fbb58b
Split up some tests that have many variants
valentinewallace Mar 17, 2026
aa46635
Remove unnecessary pending_monitor_events clone
valentinewallace Mar 19, 2026
a1aced2
Add persistent_monitor_events flag to monitors/manager
valentinewallace Mar 17, 2026
08f69bd
Add helper to push monitor events
valentinewallace Mar 18, 2026
dace19b
Rename pending_monitor_events to _legacy
valentinewallace Mar 18, 2026
72122dc
Add chain::Watch ack_monitor_event API
valentinewallace Mar 16, 2026
b407750
Add monitor event ids
valentinewallace Mar 18, 2026
bb7047d
Add MonitorUpdateCompletionAction::AckMonitorEvents
valentinewallace Mar 16, 2026
2147800
Ack all monitor events besides HTLCUpdate
valentinewallace Mar 16, 2026
db5eda2
Fix replay of monitor events for outbounds
valentinewallace Mar 16, 2026
a3942d7
Fix replay of preimage monitor events for fwds
valentinewallace Mar 16, 2026
5028f72
Track monitor event id in HTLCForwardInfo::Fail*
valentinewallace Mar 16, 2026
080ffd2
Add monitor_event_source to holding cell HTLC fails
valentinewallace Mar 16, 2026
b972c47
Pipe monitor event source HTLCForwardInfo -> holding cell htlcs
valentinewallace Mar 16, 2026
49fc649
Ack monitor events on check_free_peer_holding_cells
valentinewallace Mar 16, 2026
946f2de
Ack monitor events on revoke_and_ack
valentinewallace Mar 17, 2026
616608c
Ack monitor event when inbound edge is closed
valentinewallace Mar 17, 2026
fe7fd57
Ack monitor events when failing-to-fail-backwards
valentinewallace Mar 17, 2026
2eba975
Support persistent monitor events
valentinewallace Mar 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion fuzz/src/chanmon_consistency.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ use lightning::chain;
use lightning::chain::chaininterface::{
BroadcasterInterface, ConfirmationTarget, FeeEstimator, TransactionType,
};
use lightning::chain::chainmonitor::MonitorEventSource;
use lightning::chain::channelmonitor::{ChannelMonitor, MonitorEvent};
use lightning::chain::transaction::OutPoint;
use lightning::chain::{
Expand Down Expand Up @@ -363,9 +364,13 @@ impl chain::Watch<TestChannelSigner> for TestChainMonitor {

fn release_pending_monitor_events(
&self,
) -> Vec<(OutPoint, ChannelId, Vec<MonitorEvent>, PublicKey)> {
) -> Vec<(OutPoint, ChannelId, Vec<(u64, MonitorEvent)>, PublicKey)> {
return self.chain_monitor.release_pending_monitor_events();
}

fn ack_monitor_event(&self, source: MonitorEventSource) {
self.chain_monitor.ack_monitor_event(source);
}
}

struct KeyProvider {
Expand Down
53 changes: 31 additions & 22 deletions lightning/src/chain/chainmonitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,21 @@ use core::iter::Cycle;
use core::ops::Deref;
use core::sync::atomic::{AtomicUsize, Ordering};

/// Identifies the source of a [`MonitorEvent`] for acknowledgment via
/// [`chain::Watch::ack_monitor_event`] once the event has been processed.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct MonitorEventSource {
/// The event ID assigned by the [`ChannelMonitor`].
pub event_id: u64,
/// The channel from which the [`MonitorEvent`] originated.
pub channel_id: ChannelId,
}

impl_writeable_tlv_based!(MonitorEventSource, {
(0, event_id, required),
(2, channel_id, required),
});

/// A pending operation queued for later execution when `ChainMonitor` is in deferred mode.
enum PendingMonitorOp<ChannelSigner: EcdsaChannelSigner> {
/// A new monitor to insert and persist.
Expand Down Expand Up @@ -367,9 +382,6 @@ pub struct ChainMonitor<
fee_estimator: F,
persister: P,
_entropy_source: ES,
/// "User-provided" (ie persistence-completion/-failed) [`MonitorEvent`]s. These came directly
/// from the user and not from a [`ChannelMonitor`].
pending_monitor_events: Mutex<Vec<(OutPoint, ChannelId, Vec<MonitorEvent>, PublicKey)>>,
/// The best block height seen, used as a proxy for the passage of time.
highest_chain_height: AtomicUsize,

Expand Down Expand Up @@ -437,7 +449,6 @@ where
logger,
fee_estimator: feeest,
_entropy_source,
pending_monitor_events: Mutex::new(Vec::new()),
highest_chain_height: AtomicUsize::new(0),
event_notifier: Arc::clone(&event_notifier),
persister: AsyncPersister { persister, event_notifier },
Expand Down Expand Up @@ -656,7 +667,6 @@ where
fee_estimator: feeest,
persister,
_entropy_source,
pending_monitor_events: Mutex::new(Vec::new()),
highest_chain_height: AtomicUsize::new(0),
event_notifier: Arc::new(Notifier::new()),
pending_send_only_events: Mutex::new(Vec::new()),
Expand Down Expand Up @@ -801,16 +811,11 @@ where
return Ok(());
}
let funding_txo = monitor_data.monitor.get_funding_txo();
self.pending_monitor_events.lock().unwrap().push((
monitor_data.monitor.push_monitor_event(MonitorEvent::Completed {
funding_txo,
channel_id,
vec![MonitorEvent::Completed {
funding_txo,
channel_id,
monitor_update_id: monitor_data.monitor.get_latest_update_id(),
}],
monitor_data.monitor.get_counterparty_node_id(),
));
monitor_update_id: monitor_data.monitor.get_latest_update_id(),
});

self.event_notifier.notify();
Ok(())
Expand All @@ -823,14 +828,11 @@ where
pub fn force_channel_monitor_updated(&self, channel_id: ChannelId, monitor_update_id: u64) {
let monitors = self.monitors.read().unwrap();
let monitor = &monitors.get(&channel_id).unwrap().monitor;
let counterparty_node_id = monitor.get_counterparty_node_id();
let funding_txo = monitor.get_funding_txo();
self.pending_monitor_events.lock().unwrap().push((
funding_txo,
monitor.push_monitor_event(MonitorEvent::Completed {
funding_txo: monitor.get_funding_txo(),
channel_id,
vec![MonitorEvent::Completed { funding_txo, channel_id, monitor_update_id }],
counterparty_node_id,
));
monitor_update_id,
});
self.event_notifier.notify();
}

Expand Down Expand Up @@ -1610,11 +1612,11 @@ where

fn release_pending_monitor_events(
&self,
) -> Vec<(OutPoint, ChannelId, Vec<MonitorEvent>, PublicKey)> {
) -> Vec<(OutPoint, ChannelId, Vec<(u64, MonitorEvent)>, PublicKey)> {
for (channel_id, update_id) in self.persister.get_and_clear_completed_updates() {
let _ = self.channel_monitor_updated(channel_id, update_id);
}
let mut pending_monitor_events = self.pending_monitor_events.lock().unwrap().split_off(0);
let mut pending_monitor_events = Vec::new();
for monitor_state in self.monitors.read().unwrap().values() {
let monitor_events = monitor_state.monitor.get_and_clear_pending_monitor_events();
if monitor_events.len() > 0 {
Expand All @@ -1631,6 +1633,13 @@ where
}
pending_monitor_events
}

fn ack_monitor_event(&self, source: MonitorEventSource) {
let monitors = self.monitors.read().unwrap();
if let Some(monitor_state) = monitors.get(&source.channel_id) {
monitor_state.monitor.ack_monitor_event(source.event_id);
}
}
}

impl<
Expand Down
Loading
Loading