Merge pull request #2930 from jbesraa/Add-PaymentHash-to-Record
[rust-lightning] / lightning / src / chain / chainmonitor.rs
index 06052dc84de52dd3d7257e55ec0aa4bed5ccc9e2..b47fd39087b3dbe92a29d1507b2ee8c952db3e96 100644 (file)
@@ -31,11 +31,10 @@ use crate::chain::{ChannelMonitorUpdateStatus, Filter, WatchedOutput};
 use crate::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
 use crate::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, Balance, MonitorEvent, TransactionOutputs, WithChannelMonitor};
 use crate::chain::transaction::{OutPoint, TransactionData};
-use crate::ln::ChannelId;
+use crate::ln::types::ChannelId;
 use crate::sign::ecdsa::WriteableEcdsaChannelSigner;
 use crate::events;
 use crate::events::{Event, EventHandler};
-use crate::util::atomic_counter::AtomicCounter;
 use crate::util::logger::{Logger, WithContext};
 use crate::util::errors::APIError;
 use crate::util::wakers::{Future, Notifier};
@@ -149,7 +148,7 @@ pub trait Persist<ChannelSigner: WriteableEcdsaChannelSigner> {
        /// The [`ChannelMonitorUpdate::update_id`] or [`ChannelMonitor::get_latest_update_id`] uniquely
        /// links this call to [`ChainMonitor::channel_monitor_updated`].
        /// For [`Persist::update_persisted_channel`], it is only necessary to call [`ChainMonitor::channel_monitor_updated`]
-       /// when an [`ChannelMonitorUpdate`] is provided and when you return [`ChannelMonitorUpdateStatus::InProgress`].
+       /// when a [`ChannelMonitorUpdate`] is provided and when you return [`ChannelMonitorUpdateStatus::InProgress`].
        ///
        /// See [`Writeable::write`] on [`ChannelMonitor`] for writing out a `ChannelMonitor`,
        /// [`Writeable::write`] on [`ChannelMonitorUpdate`] for writing out an update, and
@@ -221,10 +220,6 @@ pub struct ChainMonitor<ChannelSigner: WriteableEcdsaChannelSigner, C: Deref, T:
         P::Target: Persist<ChannelSigner>,
 {
        monitors: RwLock<HashMap<OutPoint, MonitorHolder<ChannelSigner>>>,
-       /// When we generate a monitor update for a chain-event monitor persistence, we need a
-       /// unique ID, which we calculate by simply getting the next value from this counter. Note that
-       /// the ID is never persisted so it's ok that they reset on restart.
-       sync_persistence_id: AtomicCounter,
        chain_source: Option<C>,
        broadcaster: T,
        logger: L,
@@ -236,6 +231,8 @@ pub struct ChainMonitor<ChannelSigner: WriteableEcdsaChannelSigner, C: Deref, T:
        /// The best block height seen, used as a proxy for the passage of time.
        highest_chain_height: AtomicUsize,
 
+       /// A [`Notifier`] used to wake up the background processor in case we have any [`Event`]s for
+       /// it to give to users (or [`MonitorEvent`]s for `ChannelManager` to process).
        event_notifier: Notifier,
 }
 
@@ -304,7 +301,7 @@ where C::Target: chain::Filter,
                monitor_state: &MonitorHolder<ChannelSigner>
        ) -> Result<(), ()> where FN: Fn(&ChannelMonitor<ChannelSigner>, &TransactionData) -> Vec<TransactionOutputs> {
                let monitor = &monitor_state.monitor;
-               let logger = WithChannelMonitor::from(&self.logger, &monitor);
+               let logger = WithChannelMonitor::from(&self.logger, &monitor, None);
                let mut txn_outputs;
                {
                        txn_outputs = process(monitor, txdata);
@@ -315,7 +312,7 @@ where C::Target: chain::Filter,
                                                log_funding_info!(monitor)
                                        ),
                                ChannelMonitorUpdateStatus::InProgress => {
-                                       log_debug!(logger, "Channel Monitor sync for channel {} in progress.", log_funding_info!(monitor));
+                                       log_trace!(logger, "Channel Monitor sync for channel {} in progress.", log_funding_info!(monitor));
                                },
                                ChannelMonitorUpdateStatus::UnrecoverableError => {
                                        return Err(());
@@ -353,7 +350,6 @@ where C::Target: chain::Filter,
        pub fn new(chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P) -> Self {
                Self {
                        monitors: RwLock::new(new_hash_map()),
-                       sync_persistence_id: AtomicCounter::new(),
                        chain_source,
                        broadcaster,
                        logger,
@@ -603,7 +599,7 @@ where C::Target: chain::Filter,
        pub fn archive_fully_resolved_channel_monitors(&self) {
                let mut have_monitors_to_prune = false;
                for (_, monitor_holder) in self.monitors.read().unwrap().iter() {
-                       let logger = WithChannelMonitor::from(&self.logger, &monitor_holder.monitor);
+                       let logger = WithChannelMonitor::from(&self.logger, &monitor_holder.monitor, None);
                        if monitor_holder.monitor.is_fully_resolved(&logger) {
                                have_monitors_to_prune = true;
                        }
@@ -611,7 +607,7 @@ where C::Target: chain::Filter,
                if have_monitors_to_prune {
                        let mut monitors = self.monitors.write().unwrap();
                        monitors.retain(|funding_txo, monitor_holder| {
-                               let logger = WithChannelMonitor::from(&self.logger, &monitor_holder.monitor);
+                               let logger = WithChannelMonitor::from(&self.logger, &monitor_holder.monitor, None);
                                if monitor_holder.monitor.is_fully_resolved(&logger) {
                                        log_info!(logger,
                                                "Archiving fully resolved ChannelMonitor for funding txo {}",
@@ -642,6 +638,8 @@ where
                        monitor.block_connected(
                                header, txdata, height, &*self.broadcaster, &*self.fee_estimator, &self.logger)
                });
+               // Assume we may have some new events and wake the event processor
+               self.event_notifier.notify();
        }
 
        fn block_disconnected(&self, header: &Header, height: u32) {
@@ -669,6 +667,8 @@ where
                        monitor.transactions_confirmed(
                                header, txdata, height, &*self.broadcaster, &*self.fee_estimator, &self.logger)
                });
+               // Assume we may have some new events and wake the event processor
+               self.event_notifier.notify();
        }
 
        fn transaction_unconfirmed(&self, txid: &Txid) {
@@ -689,6 +689,8 @@ where
                                header, height, &*self.broadcaster, &*self.fee_estimator, &self.logger
                        )
                });
+               // Assume we may have some new events and wake the event processor
+               self.event_notifier.notify();
        }
 
        fn get_relevant_txids(&self) -> Vec<(Txid, u32, Option<BlockHash>)> {
@@ -713,7 +715,7 @@ where C::Target: chain::Filter,
            P::Target: Persist<ChannelSigner>,
 {
        fn watch_channel(&self, funding_outpoint: OutPoint, monitor: ChannelMonitor<ChannelSigner>) -> Result<ChannelMonitorUpdateStatus, ()> {
-               let logger = WithChannelMonitor::from(&self.logger, &monitor);
+               let logger = WithChannelMonitor::from(&self.logger, &monitor, None);
                let mut monitors = self.monitors.write().unwrap();
                let entry = match monitors.entry(funding_outpoint) {
                        hash_map::Entry::Occupied(_) => {
@@ -758,7 +760,7 @@ where C::Target: chain::Filter,
                let monitors = self.monitors.read().unwrap();
                match monitors.get(&funding_txo) {
                        None => {
-                               let logger = WithContext::from(&self.logger, update.counterparty_node_id, Some(channel_id));
+                               let logger = WithContext::from(&self.logger, update.counterparty_node_id, Some(channel_id), None);
                                log_error!(logger, "Failed to update channel monitor: no such monitor registered");
 
                                // We should never ever trigger this from within ChannelManager. Technically a
@@ -771,7 +773,7 @@ where C::Target: chain::Filter,
                        },
                        Some(monitor_state) => {
                                let monitor = &monitor_state.monitor;
-                               let logger = WithChannelMonitor::from(&self.logger, &monitor);
+                               let logger = WithChannelMonitor::from(&self.logger, &monitor, None);
                                log_trace!(logger, "Updating ChannelMonitor to id {} for channel {}", update.update_id, log_funding_info!(monitor));
                                let update_res = monitor.update_monitor(update, &self.broadcaster, &self.fee_estimator, &self.logger);
 
@@ -990,7 +992,6 @@ mod tests {
                let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
                create_announced_chan_between_nodes(&nodes, 0, 1);
 
-               chanmon_cfgs[0].persister.chain_sync_monitor_persistences.lock().unwrap().clear();
                chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::UnrecoverableError);
 
                assert!(std::panic::catch_unwind(|| {