@@ -36,6 +36,7 @@ use crate::sign::ecdsa::EcdsaChannelSigner;
36
36
use crate :: events:: { self , Event , EventHandler , ReplayEvent } ;
37
37
use crate :: util:: logger:: { Logger , WithContext } ;
38
38
use crate :: util:: errors:: APIError ;
39
+ use crate :: util:: persist:: MonitorName ;
39
40
use crate :: util:: wakers:: { Future , Notifier } ;
40
41
use crate :: ln:: channel_state:: ChannelDetails ;
41
42
@@ -104,9 +105,9 @@ pub trait Persist<ChannelSigner: EcdsaChannelSigner> {
104
105
/// Persist a new channel's data in response to a [`chain::Watch::watch_channel`] call. This is
105
106
/// called by [`ChannelManager`] for new channels, or may be called directly, e.g. on startup.
106
107
///
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.
110
111
///
111
112
/// The [`ChannelMonitor::get_latest_update_id`] uniquely links this call to [`ChainMonitor::channel_monitor_updated`].
112
113
/// For [`Persist::persist_new_channel`], it is only necessary to call [`ChainMonitor::channel_monitor_updated`]
@@ -117,7 +118,7 @@ pub trait Persist<ChannelSigner: EcdsaChannelSigner> {
117
118
///
118
119
/// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
119
120
/// [`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 ;
121
122
122
123
/// Update one channel's data. The provided [`ChannelMonitor`] has already applied the given
123
124
/// update.
@@ -156,7 +157,7 @@ pub trait Persist<ChannelSigner: EcdsaChannelSigner> {
156
157
/// [`ChannelMonitorUpdateStatus`] for requirements when returning errors.
157
158
///
158
159
/// [`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 ;
160
161
/// Prevents the channel monitor from being loaded on startup.
161
162
///
162
163
/// Archiving the data in a backup location (rather than deleting it fully) is useful for
@@ -168,7 +169,7 @@ pub trait Persist<ChannelSigner: EcdsaChannelSigner> {
168
169
/// the archive process. Additionally, because the archive operation could be retried on
169
170
/// restart, this method must in that case be idempotent, ensuring it can handle scenarios where
170
171
/// 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 ) ;
172
173
}
173
174
174
175
struct MonitorHolder < ChannelSigner : EcdsaChannelSigner > {
@@ -342,8 +343,7 @@ where C::Target: chain::Filter,
342
343
// `ChannelMonitorUpdate` after a channel persist for a channel with the same
343
344
// `latest_update_id`.
344
345
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) {
347
347
ChannelMonitorUpdateStatus :: Completed =>
348
348
log_trace ! ( logger, "Finished syncing Channel Monitor for channel {} for block-data" ,
349
349
log_funding_info!( monitor)
@@ -642,7 +642,7 @@ where C::Target: chain::Filter,
642
642
have_monitors_to_prune = true ;
643
643
}
644
644
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 ) ;
646
646
}
647
647
}
648
648
if have_monitors_to_prune {
@@ -655,7 +655,7 @@ where C::Target: chain::Filter,
655
655
"Archiving fully resolved ChannelMonitor for channel ID {}" ,
656
656
channel_id
657
657
) ;
658
- self . persister . archive_persisted_channel ( monitor_holder. monitor . get_funding_txo ( ) . 0 ) ;
658
+ self . persister . archive_persisted_channel ( monitor_holder. monitor . persistence_key ( ) ) ;
659
659
false
660
660
} else {
661
661
true
@@ -769,7 +769,7 @@ where C::Target: chain::Filter,
769
769
log_trace ! ( logger, "Got new ChannelMonitor for channel {}" , log_funding_info!( monitor) ) ;
770
770
let update_id = monitor. get_latest_update_id ( ) ;
771
771
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) ;
773
773
match persist_res {
774
774
ChannelMonitorUpdateStatus :: InProgress => {
775
775
log_info ! ( logger, "Persistence of new ChannelMonitor for channel {} in progress" , log_funding_info!( monitor) ) ;
@@ -825,17 +825,16 @@ where C::Target: chain::Filter,
825
825
let update_res = monitor. update_monitor ( update, & self . broadcaster , & self . fee_estimator , & self . logger ) ;
826
826
827
827
let update_id = update. update_id ;
828
- let funding_txo = monitor. get_funding_txo ( ) . 0 ;
829
828
let persist_res = if update_res. is_err ( ) {
830
829
// Even if updating the monitor returns an error, the monitor's state will
831
830
// still be changed. Therefore, we should persist the updated monitor despite the error.
832
831
// We don't want to persist a `monitor_update` which results in a failure to apply later
833
832
// while reading `channel_monitor` with updates from storage. Instead, we should persist
834
833
// the entire `channel_monitor` here.
835
834
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)
837
836
} else {
838
- self . persister . update_persisted_channel ( funding_txo , Some ( update) , monitor)
837
+ self . persister . update_persisted_channel ( Some ( update) , monitor)
839
838
} ;
840
839
match persist_res {
841
840
ChannelMonitorUpdateStatus :: InProgress => {
0 commit comments