Skip to content

Commit 6a6898e

Browse files
Add channelmanager::Persist trait
And implement it for the FilesystemPersister.
1 parent 7f92788 commit 6a6898e

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

lightning-persister/src/lib.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,20 @@ extern crate bitcoin;
55
extern crate libc;
66

77
use bitcoin::hashes::hex::ToHex;
8+
use crate::utils::DiskWriteable;
9+
use lightning::chain;
10+
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
811
use lightning::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateErr};
912
use lightning::chain::channelmonitor;
10-
use lightning::chain::keysinterface::ChannelKeys;
13+
use lightning::chain::keysinterface::{ChannelKeys, KeysInterface};
1114
use lightning::chain::transaction::OutPoint;
15+
use lightning::ln::channelmanager;
16+
use lightning::ln::channelmanager::ChannelManager;
17+
use lightning::util::logger::Logger;
1218
use lightning::util::ser::{Writeable, Readable};
1319
use std::fs;
1420
use std::io::Error;
15-
use crate::utils::DiskWriteable;
21+
use std::sync::Arc;
1622

1723
#[cfg(test)]
1824
use {
@@ -44,6 +50,12 @@ impl<ChanSigner: ChannelKeys + Writeable> DiskWriteable for ChannelMonitor<ChanS
4450
}
4551
}
4652

53+
impl<ChanSigner: ChannelKeys + Writeable, M: chain::Watch<Keys=ChanSigner>, T: BroadcasterInterface, K: KeysInterface<ChanKeySigner=ChanSigner>, F: FeeEstimator, L: Logger> DiskWriteable for Arc<ChannelManager<ChanSigner, Arc<M>, Arc<T>, Arc<K>, Arc<F>, Arc<L>>> {
54+
fn write_to_file(&self, writer: &mut fs::File) -> Result<(), std::io::Error> {
55+
self.write(writer)
56+
}
57+
}
58+
4759
impl FilesystemPersister {
4860
/// Initialize a new FilesystemPersister and set the path to the individual channels'
4961
/// files.
@@ -102,6 +114,12 @@ impl<ChanSigner: ChannelKeys + Readable + Writeable + Send + Sync> channelmonito
102114
}
103115
}
104116

117+
impl<ChanSigner: 'static + ChannelKeys + Writeable, M: 'static + chain::Watch<Keys=ChanSigner>, T: 'static + BroadcasterInterface, K: 'static + KeysInterface<ChanKeySigner=ChanSigner>, F: 'static + FeeEstimator, L: 'static + Logger> channelmanager::Persist<ChanSigner, M, T, K, F, L> for FilesystemPersister {
118+
fn persist_manager(&self, data: Arc<ChannelManager<ChanSigner, Arc<M>, Arc<T>, Arc<K>, Arc<F>, Arc<L>>>) -> Result<(), std::io::Error> {
119+
utils::write_to_file(self.path_to_channel_data.clone(), "manager".to_string(), &data)
120+
}
121+
}
122+
105123
#[cfg(test)]
106124
mod tests {
107125
extern crate lightning;

lightning/src/ln/channelmanager.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3536,6 +3536,23 @@ impl<ChanSigner: ChannelKeys, M: Deref + Sync + Send, T: Deref + Sync + Send, K:
35363536
}
35373537
}
35383538

3539+
/// `Persist` defines behavior for persisting the ChannelManager: this could mean writing once to
3540+
/// disk, and/or uploading to one or more backup services. This persistence should probably happen
3541+
/// in a background thread for running an efficient node, rather than in real time as updates occur.
3542+
/// See [`ChannelManager::persistence_lock`] for more details.
3543+
/// Note that restoring an outdated ChannelManager from disk runs the risk of force-closing
3544+
/// channels.
3545+
///
3546+
///[`ChannelManager::persistence_lock`]: struct.ChannelManager.html#structfield.persistence_lock
3547+
pub trait Persist<ChanSigner: 'static + ChannelKeys + Writeable, M: 'static + chain::Watch<Keys=ChanSigner>, T: 'static + BroadcasterInterface, K: 'static + KeysInterface<ChanKeySigner=ChanSigner>, F: 'static + FeeEstimator, L: 'static + Logger>: Send + Sync {
3548+
/// Persist a `ChannelManager`. [`ChannelManager::persistence_lock`] will signal you when this
3549+
/// method should be invoked. See [`ChannelManager::write`] for writing out a `ChannelManager`.
3550+
///
3551+
///[`ChannelManager::persistence_lock`]: struct.ChannelManager.html#structfield.persistence_lock
3552+
///[`ChannelManager::write`]: struct.ChannelManager.html#method.write
3553+
fn persist_manager(&self, data: Arc<ChannelManager<ChanSigner, Arc<M>, Arc<T>, Arc<K>, Arc<F>, Arc<L>>>) -> Result<(), std::io::Error>;
3554+
}
3555+
35393556
const SERIALIZATION_VERSION: u8 = 1;
35403557
const MIN_SERIALIZATION_VERSION: u8 = 1;
35413558

0 commit comments

Comments
 (0)