@@ -36,6 +36,7 @@ use crate::sign::ecdsa::EcdsaChannelSigner;
3636use crate :: events:: { self , Event , EventHandler , ReplayEvent } ;
3737use crate :: util:: logger:: { Logger , WithContext } ;
3838use crate :: util:: errors:: APIError ;
39+ use crate :: util:: persist:: MonitorName ;
3940use crate :: util:: wakers:: { Future , Notifier } ;
4041use crate :: ln:: channel_state:: ChannelDetails ;
4142
@@ -104,9 +105,9 @@ pub trait Persist<ChannelSigner: EcdsaChannelSigner> {
104105 /// Persist a new channel's data in response to a [`chain::Watch::watch_channel`] call. This is
105106 /// called by [`ChannelManager`] for new channels, or may be called directly, e.g. on startup.
106107 ///
107- /// The data can be stored any way you want, but the identifier provided by LDK is the
108- /// channel's outpoint (and it is up to you to maintain a correct mapping between the outpoint
109- /// and the stored channel data). Note that you **must** persist every new monitor to disk.
108+ /// The data can be stored any way you want, so long as [`ChannelMonitor::persistence_key`] is
109+ /// used to maintain a correct mapping with the stored channel data. Note that you **must**
110+ /// persist every new monitor to disk.
110111 ///
111112 /// The [`ChannelMonitor::get_latest_update_id`] uniquely links this call to [`ChainMonitor::channel_monitor_updated`].
112113 /// For [`Persist::persist_new_channel`], it is only necessary to call [`ChainMonitor::channel_monitor_updated`]
@@ -117,7 +118,7 @@ pub trait Persist<ChannelSigner: EcdsaChannelSigner> {
117118 ///
118119 /// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
119120 /// [`Writeable::write`]: crate::util::ser::Writeable::write
120- fn persist_new_channel ( & self , channel_funding_outpoint : OutPoint , monitor : & ChannelMonitor < ChannelSigner > ) -> ChannelMonitorUpdateStatus ;
121+ fn persist_new_channel ( & self , monitor : & ChannelMonitor < ChannelSigner > ) -> ChannelMonitorUpdateStatus ;
121122
122123 /// Update one channel's data. The provided [`ChannelMonitor`] has already applied the given
123124 /// update.
@@ -156,7 +157,7 @@ pub trait Persist<ChannelSigner: EcdsaChannelSigner> {
156157 /// [`ChannelMonitorUpdateStatus`] for requirements when returning errors.
157158 ///
158159 /// [`Writeable::write`]: crate::util::ser::Writeable::write
159- fn update_persisted_channel ( & self , channel_funding_outpoint : OutPoint , monitor_update : Option < & ChannelMonitorUpdate > , monitor : & ChannelMonitor < ChannelSigner > ) -> ChannelMonitorUpdateStatus ;
160+ fn update_persisted_channel ( & self , monitor_update : Option < & ChannelMonitorUpdate > , monitor : & ChannelMonitor < ChannelSigner > ) -> ChannelMonitorUpdateStatus ;
160161 /// Prevents the channel monitor from being loaded on startup.
161162 ///
162163 /// Archiving the data in a backup location (rather than deleting it fully) is useful for
@@ -168,7 +169,7 @@ pub trait Persist<ChannelSigner: EcdsaChannelSigner> {
168169 /// the archive process. Additionally, because the archive operation could be retried on
169170 /// restart, this method must in that case be idempotent, ensuring it can handle scenarios where
170171 /// the monitor already exists in the archive.
171- fn archive_persisted_channel ( & self , channel_funding_outpoint : OutPoint ) ;
172+ fn archive_persisted_channel ( & self , monitor_name : MonitorName ) ;
172173}
173174
174175struct MonitorHolder < ChannelSigner : EcdsaChannelSigner > {
@@ -342,8 +343,7 @@ where C::Target: chain::Filter,
342343 // `ChannelMonitorUpdate` after a channel persist for a channel with the same
343344 // `latest_update_id`.
344345 let _pending_monitor_updates = monitor_state. pending_monitor_updates . lock ( ) . unwrap ( ) ;
345- let funding_txo = monitor. get_funding_txo ( ) . 0 ;
346- match self . persister . update_persisted_channel ( funding_txo, None , monitor) {
346+ match self . persister . update_persisted_channel ( None , monitor) {
347347 ChannelMonitorUpdateStatus :: Completed =>
348348 log_trace ! ( logger, "Finished syncing Channel Monitor for channel {} for block-data" ,
349349 log_funding_info!( monitor)
@@ -642,7 +642,7 @@ where C::Target: chain::Filter,
642642 have_monitors_to_prune = true ;
643643 }
644644 if needs_persistence {
645- self . persister . update_persisted_channel ( monitor_holder . monitor . get_funding_txo ( ) . 0 , None , & monitor_holder. monitor ) ;
645+ self . persister . update_persisted_channel ( None , & monitor_holder. monitor ) ;
646646 }
647647 }
648648 if have_monitors_to_prune {
@@ -655,7 +655,7 @@ where C::Target: chain::Filter,
655655 "Archiving fully resolved ChannelMonitor for channel ID {}" ,
656656 channel_id
657657 ) ;
658- self . persister . archive_persisted_channel ( monitor_holder. monitor . get_funding_txo ( ) . 0 ) ;
658+ self . persister . archive_persisted_channel ( monitor_holder. monitor . persistence_key ( ) ) ;
659659 false
660660 } else {
661661 true
@@ -769,7 +769,7 @@ where C::Target: chain::Filter,
769769 log_trace ! ( logger, "Got new ChannelMonitor for channel {}" , log_funding_info!( monitor) ) ;
770770 let update_id = monitor. get_latest_update_id ( ) ;
771771 let mut pending_monitor_updates = Vec :: new ( ) ;
772- let persist_res = self . persister . persist_new_channel ( monitor . get_funding_txo ( ) . 0 , & monitor) ;
772+ let persist_res = self . persister . persist_new_channel ( & monitor) ;
773773 match persist_res {
774774 ChannelMonitorUpdateStatus :: InProgress => {
775775 log_info ! ( logger, "Persistence of new ChannelMonitor for channel {} in progress" , log_funding_info!( monitor) ) ;
@@ -825,17 +825,16 @@ where C::Target: chain::Filter,
825825 let update_res = monitor. update_monitor ( update, & self . broadcaster , & self . fee_estimator , & self . logger ) ;
826826
827827 let update_id = update. update_id ;
828- let funding_txo = monitor. get_funding_txo ( ) . 0 ;
829828 let persist_res = if update_res. is_err ( ) {
830829 // Even if updating the monitor returns an error, the monitor's state will
831830 // still be changed. Therefore, we should persist the updated monitor despite the error.
832831 // We don't want to persist a `monitor_update` which results in a failure to apply later
833832 // while reading `channel_monitor` with updates from storage. Instead, we should persist
834833 // the entire `channel_monitor` here.
835834 log_warn ! ( logger, "Failed to update ChannelMonitor for channel {}. Going ahead and persisting the entire ChannelMonitor" , log_funding_info!( monitor) ) ;
836- self . persister . update_persisted_channel ( funding_txo , None , monitor)
835+ self . persister . update_persisted_channel ( None , monitor)
837836 } else {
838- self . persister . update_persisted_channel ( funding_txo , Some ( update) , monitor)
837+ self . persister . update_persisted_channel ( Some ( update) , monitor)
839838 } ;
840839 match persist_res {
841840 ChannelMonitorUpdateStatus :: InProgress => {
0 commit comments