Skip to content

Commit bd7e4b9

Browse files
Integrate ChannelDataPersister into ChainMonitor.
- add a test for the LinuxPersister. - update MonitorUpdateErr to have a boolean whether the updated ChannelMonitor should be persisted despite the error - The ChainMonitor should: 1) Call the ChannelDataPersister on startup to retrieve the stored monitors from disk, 2) Whenever a new channel is added or updated, these updates should be conveyed to the DataPersister and persisted to disk.
1 parent 21f6359 commit bd7e4b9

File tree

9 files changed

+245
-65
lines changed

9 files changed

+245
-65
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ use lightning::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdateErr,
3535
use lightning::chain::transaction::OutPoint;
3636
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
3737
use lightning::chain::keysinterface::{KeysInterface, InMemoryChannelKeys};
38+
use lightning::ln::data_persister::ChannelDataPersister;
3839
use lightning::ln::channelmanager::{ChannelManager, PaymentHash, PaymentPreimage, PaymentSecret, ChannelManagerReadArgs};
3940
use lightning::ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
4041
use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, ErrorAction, UpdateAddHTLC, Init};
@@ -48,6 +49,7 @@ use lightning::routing::router::{Route, RouteHop};
4849

4950

5051
use utils::test_logger;
52+
use utils::test_data_persister::TestChanDataPersister;
5153

5254
use bitcoin::secp256k1::key::{PublicKey,SecretKey};
5355
use bitcoin::secp256k1::Secp256k1;
@@ -84,7 +86,7 @@ impl Writer for VecWriter {
8486

8587
struct TestChainMonitor {
8688
pub logger: Arc<dyn Logger>,
87-
pub chain_monitor: Arc<channelmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Notify>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>>>,
89+
pub chain_monitor: Arc<channelmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Notify>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<dyn ChannelDataPersister<Keys=EnforcingChannelKeys>>>>,
8890
pub update_ret: Mutex<Result<(), channelmonitor::ChannelMonitorUpdateErr>>,
8991
// If we reload a node with an old copy of ChannelMonitors, the ChannelManager deserialization
9092
// logic will automatically force-close our channels for us (as we don't have an up-to-date
@@ -95,9 +97,9 @@ struct TestChainMonitor {
9597
pub should_update_manager: atomic::AtomicBool,
9698
}
9799
impl TestChainMonitor {
98-
pub fn new(broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger>, feeest: Arc<FuzzEstimator>) -> Self {
100+
pub fn new(broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger>, feeest: Arc<FuzzEstimator>, data_persister: Arc<dyn ChannelDataPersister<Keys=EnforcingChannelKeys>>) -> Self {
99101
Self {
100-
chain_monitor: Arc::new(channelmonitor::ChainMonitor::new(None, broadcaster, logger.clone(), feeest)),
102+
chain_monitor: Arc::new(channelmonitor::ChainMonitor::new(None, broadcaster, logger.clone(), feeest, data_persister).unwrap()),
101103
logger,
102104
update_ret: Mutex::new(Ok(())),
103105
latest_monitors: Mutex::new(HashMap::new()),
@@ -127,7 +129,7 @@ impl chain::Watch for TestChainMonitor {
127129
};
128130
let mut deserialized_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::
129131
read(&mut Cursor::new(&map_entry.get().1)).unwrap().1;
130-
deserialized_monitor.update_monitor(update.clone(), &&TestBroadcaster {}, &self.logger).unwrap();
132+
deserialized_monitor.update_monitor(&update, &&TestBroadcaster {}, &self.logger).unwrap();
131133
let mut ser = VecWriter(Vec::new());
132134
deserialized_monitor.write_for_disk(&mut ser).unwrap();
133135
map_entry.insert((update.update_id, ser.0));
@@ -192,7 +194,8 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
192194
macro_rules! make_node {
193195
($node_id: expr) => { {
194196
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
195-
let monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), fee_est.clone()));
197+
let data_persister = Arc::new(TestChanDataPersister{});
198+
let monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), fee_est.clone(), data_persister.clone()));
196199

197200
let keys_manager = Arc::new(KeyProvider { node_id: $node_id, rand_bytes_id: atomic::AtomicU8::new(0) });
198201
let mut config = UserConfig::default();
@@ -207,7 +210,8 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
207210
macro_rules! reload_node {
208211
($ser: expr, $node_id: expr, $old_monitors: expr) => { {
209212
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
210-
let chain_monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), fee_est.clone()));
213+
let data_persister = Arc::new(TestChanDataPersister{});
214+
let chain_monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), fee_est.clone(), data_persister.clone()));
211215

212216
let keys_manager = Arc::new(KeyProvider { node_id: $node_id, rand_bytes_id: atomic::AtomicU8::new(0) });
213217
let mut config = UserConfig::default();

fuzz/src/full_stack.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget,
3131
use lightning::chain::channelmonitor;
3232
use lightning::chain::transaction::OutPoint;
3333
use lightning::chain::keysinterface::{InMemoryChannelKeys, KeysInterface};
34+
use lightning::ln::data_persister::ChannelDataPersister;
3435
use lightning::ln::channelmanager::{ChannelManager, PaymentHash, PaymentPreimage, PaymentSecret};
3536
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor};
3637
use lightning::routing::router::get_route;
@@ -41,6 +42,7 @@ use lightning::util::logger::Logger;
4142
use lightning::util::config::UserConfig;
4243

4344
use utils::test_logger;
45+
use utils::test_data_persister::TestChanDataPersister;
4446

4547
use bitcoin::secp256k1::key::{PublicKey,SecretKey};
4648
use bitcoin::secp256k1::Secp256k1;
@@ -146,13 +148,13 @@ impl<'a> std::hash::Hash for Peer<'a> {
146148

147149
type ChannelMan = ChannelManager<
148150
EnforcingChannelKeys,
149-
Arc<channelmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Notify>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>>>,
151+
Arc<channelmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Notify>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<dyn ChannelDataPersister<Keys=EnforcingChannelKeys>>>>,
150152
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
151153
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>>;
152154

153155
struct MoneyLossDetector<'a> {
154156
manager: Arc<ChannelMan>,
155-
monitor: Arc<channelmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Notify>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>>>,
157+
monitor: Arc<channelmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Notify>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<dyn ChannelDataPersister<Keys=EnforcingChannelKeys>>>>,
156158
handler: PeerMan<'a>,
157159

158160
peers: &'a RefCell<[bool; 256]>,
@@ -166,7 +168,7 @@ struct MoneyLossDetector<'a> {
166168
impl<'a> MoneyLossDetector<'a> {
167169
pub fn new(peers: &'a RefCell<[bool; 256]>,
168170
manager: Arc<ChannelMan>,
169-
monitor: Arc<channelmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Notify>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>>>,
171+
monitor: Arc<channelmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Notify>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<dyn ChannelDataPersister<Keys=EnforcingChannelKeys>>>>,
170172
handler: PeerMan<'a>) -> Self {
171173
MoneyLossDetector {
172174
manager,
@@ -334,7 +336,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
334336
};
335337

336338
let broadcast = Arc::new(TestBroadcaster{});
337-
let monitor = Arc::new(channelmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone()));
339+
let data_persister: Arc<dyn ChannelDataPersister<Keys = EnforcingChannelKeys>> = Arc::new(TestChanDataPersister{});
340+
let monitor = Arc::new(channelmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone(), data_persister.clone()).unwrap());
338341

339342
let keys_manager = Arc::new(KeyProvider { node_secret: our_network_key.clone(), counter: AtomicU64::new(0) });
340343
let mut config = UserConfig::default();

fuzz/src/utils/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
// licenses.
99

1010
pub mod test_logger;
11+
pub mod test_data_persister;

fuzz/src/utils/test_data_persister.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use lightning::ln::data_persister::ChannelDataPersister;
2+
use lightning::chain::channelmonitor;
3+
use lightning::chain::transaction::OutPoint;
4+
use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
5+
6+
use std::collections::HashMap;
7+
8+
pub struct TestChanDataPersister {}
9+
impl ChannelDataPersister for TestChanDataPersister {
10+
type Keys = EnforcingChannelKeys;
11+
12+
fn persist_channel_data(&self, _funding_txo: OutPoint, _data: &channelmonitor::ChannelMonitor<EnforcingChannelKeys>) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> {
13+
Ok(())
14+
}
15+
16+
fn update_channel_data(&self, _funding_txo: OutPoint, _update: &channelmonitor::ChannelMonitorUpdate, _data: &channelmonitor::ChannelMonitor<EnforcingChannelKeys>) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> {
17+
Ok(())
18+
}
19+
20+
fn load_channel_data(&self) -> Result<HashMap<OutPoint, channelmonitor::ChannelMonitor<EnforcingChannelKeys>>, channelmonitor::ChannelMonitorUpdateErr> {
21+
Ok(HashMap::new())
22+
}
23+
}

lightning-net-tokio/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
//! type Logger = dyn lightning::util::logger::Logger;
3737
//! type ChainAccess = dyn lightning::chain::Access;
3838
//! type ChainNotify = dyn lightning::chain::Notify;
39-
//! type ChainMonitor = lightning::chain::channelmonitor::ChainMonitor<lightning::chain::keysinterface::InMemoryChannelKeys, Arc<ChainNotify>, Arc<TxBroadcaster>, Arc<FeeEstimator>, Arc<Logger>>;
39+
//! type DataPersister = dyn lightning::ln::data_persister::ChannelDataPersister<Keys = lightning::chain::keysinterface::InMemoryChannelKeys>;
40+
//! type ChainMonitor = lightning::chain::channelmonitor::ChainMonitor<lightning::chain::keysinterface::InMemoryChannelKeys, Arc<ChainNotify>, Arc<TxBroadcaster>, Arc<FeeEstimator>, Arc<Logger>, Arc<DataPersister>>;
4041
//! type ChannelManager = lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor, TxBroadcaster, FeeEstimator, Logger>;
4142
//! type PeerManager = lightning::ln::peer_handler::SimpleArcPeerManager<lightning_net_tokio::SocketDescriptor, ChainMonitor, TxBroadcaster, FeeEstimator, ChainAccess, Logger>;
4243
//!

0 commit comments

Comments
 (0)