Skip to content

Commit 9c7c3b9

Browse files
authored
Merge pull request #681 from valentinewallace/data-persister-refactor
Add ChannelDataPersister trait and point ChainMonitor to it.
2 parents 8a79877 + cda8fb7 commit 9c7c3b9

20 files changed

+865
-163
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
members = [
44
"lightning",
55
"lightning-net-tokio",
6+
"lightning-persister",
67
]
78

89
# Our tests do actual crypo and lots of work, the tradeoff for -O1 is well worth it.

fuzz/src/chanmon_consistency.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ use lightning::routing::router::{Route, RouteHop};
4848

4949

5050
use utils::test_logger;
51+
use utils::test_persister::TestPersister;
5152

5253
use bitcoin::secp256k1::key::{PublicKey,SecretKey};
5354
use bitcoin::secp256k1::Secp256k1;
@@ -84,7 +85,7 @@ impl Writer for VecWriter {
8485

8586
struct TestChainMonitor {
8687
pub logger: Arc<dyn Logger>,
87-
pub chain_monitor: Arc<chainmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>>>,
88+
pub chain_monitor: Arc<chainmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
8889
pub update_ret: Mutex<Result<(), channelmonitor::ChannelMonitorUpdateErr>>,
8990
// If we reload a node with an old copy of ChannelMonitors, the ChannelManager deserialization
9091
// logic will automatically force-close our channels for us (as we don't have an up-to-date
@@ -95,9 +96,9 @@ struct TestChainMonitor {
9596
pub should_update_manager: atomic::AtomicBool,
9697
}
9798
impl TestChainMonitor {
98-
pub fn new(broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger>, feeest: Arc<FuzzEstimator>) -> Self {
99+
pub fn new(broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger>, feeest: Arc<FuzzEstimator>, persister: Arc<TestPersister>) -> Self {
99100
Self {
100-
chain_monitor: Arc::new(chainmonitor::ChainMonitor::new(None, broadcaster, logger.clone(), feeest)),
101+
chain_monitor: Arc::new(chainmonitor::ChainMonitor::new(None, broadcaster, logger.clone(), feeest, persister)),
101102
logger,
102103
update_ret: Mutex::new(Ok(())),
103104
latest_monitors: Mutex::new(HashMap::new()),
@@ -110,7 +111,7 @@ impl chain::Watch for TestChainMonitor {
110111

111112
fn watch_channel(&self, funding_txo: OutPoint, monitor: channelmonitor::ChannelMonitor<EnforcingChannelKeys>) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> {
112113
let mut ser = VecWriter(Vec::new());
113-
monitor.write_for_disk(&mut ser).unwrap();
114+
monitor.serialize_for_disk(&mut ser).unwrap();
114115
if let Some(_) = self.latest_monitors.lock().unwrap().insert(funding_txo, (monitor.get_latest_update_id(), ser.0)) {
115116
panic!("Already had monitor pre-watch_channel");
116117
}
@@ -127,9 +128,9 @@ impl chain::Watch for TestChainMonitor {
127128
};
128129
let mut deserialized_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::
129130
read(&mut Cursor::new(&map_entry.get().1)).unwrap().1;
130-
deserialized_monitor.update_monitor(update.clone(), &&TestBroadcaster {}, &self.logger).unwrap();
131+
deserialized_monitor.update_monitor(&update, &&TestBroadcaster {}, &self.logger).unwrap();
131132
let mut ser = VecWriter(Vec::new());
132-
deserialized_monitor.write_for_disk(&mut ser).unwrap();
133+
deserialized_monitor.serialize_for_disk(&mut ser).unwrap();
133134
map_entry.insert((update.update_id, ser.0));
134135
self.should_update_manager.store(true, atomic::Ordering::Relaxed);
135136
self.update_ret.lock().unwrap().clone()
@@ -192,7 +193,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
192193
macro_rules! make_node {
193194
($node_id: expr) => { {
194195
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()));
196+
let monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), fee_est.clone(), Arc::new(TestPersister{})));
196197

197198
let keys_manager = Arc::new(KeyProvider { node_id: $node_id, rand_bytes_id: atomic::AtomicU8::new(0) });
198199
let mut config = UserConfig::default();
@@ -207,7 +208,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
207208
macro_rules! reload_node {
208209
($ser: expr, $node_id: expr, $old_monitors: expr) => { {
209210
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()));
211+
let chain_monitor = Arc::new(TestChainMonitor::new(broadcast.clone(), logger.clone(), fee_est.clone(), Arc::new(TestPersister{})));
211212

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

fuzz/src/chanmon_deser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ impl Writer for VecWriter {
2626
pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
2727
if let Ok((latest_block_hash, monitor)) = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(data)) {
2828
let mut w = VecWriter(Vec::new());
29-
monitor.write_for_disk(&mut w).unwrap();
29+
monitor.serialize_for_disk(&mut w).unwrap();
3030
let deserialized_copy = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&w.0)).unwrap();
3131
assert!(latest_block_hash == deserialized_copy.0);
3232
assert!(monitor == deserialized_copy.1);

fuzz/src/full_stack.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use lightning::util::logger::Logger;
4040
use lightning::util::config::UserConfig;
4141

4242
use utils::test_logger;
43+
use utils::test_persister::TestPersister;
4344

4445
use bitcoin::secp256k1::key::{PublicKey,SecretKey};
4546
use bitcoin::secp256k1::Secp256k1;
@@ -145,13 +146,13 @@ impl<'a> std::hash::Hash for Peer<'a> {
145146

146147
type ChannelMan = ChannelManager<
147148
EnforcingChannelKeys,
148-
Arc<chainmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>>>,
149+
Arc<chainmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
149150
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
150151
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>>;
151152

152153
struct MoneyLossDetector<'a> {
153154
manager: Arc<ChannelMan>,
154-
monitor: Arc<chainmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>>>,
155+
monitor: Arc<chainmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
155156
handler: PeerMan<'a>,
156157

157158
peers: &'a RefCell<[bool; 256]>,
@@ -165,7 +166,7 @@ struct MoneyLossDetector<'a> {
165166
impl<'a> MoneyLossDetector<'a> {
166167
pub fn new(peers: &'a RefCell<[bool; 256]>,
167168
manager: Arc<ChannelMan>,
168-
monitor: Arc<chainmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>>>,
169+
monitor: Arc<chainmonitor::ChainMonitor<EnforcingChannelKeys, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
169170
handler: PeerMan<'a>) -> Self {
170171
MoneyLossDetector {
171172
manager,
@@ -333,7 +334,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
333334
};
334335

335336
let broadcast = Arc::new(TestBroadcaster{});
336-
let monitor = Arc::new(chainmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone()));
337+
let monitor = Arc::new(chainmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone(), Arc::new(TestPersister{})));
337338

338339
let keys_manager = Arc::new(KeyProvider { node_secret: our_network_key.clone(), counter: AtomicU64::new(0) });
339340
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_persister;

fuzz/src/utils/test_persister.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use lightning::chain::channelmonitor;
2+
use lightning::chain::transaction::OutPoint;
3+
use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
4+
5+
pub struct TestPersister {}
6+
impl channelmonitor::Persist<EnforcingChannelKeys> for TestPersister {
7+
fn persist_new_channel(&self, _funding_txo: OutPoint, _data: &channelmonitor::ChannelMonitor<EnforcingChannelKeys>) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> {
8+
Ok(())
9+
}
10+
11+
fn update_persisted_channel(&self, _funding_txo: OutPoint, _update: &channelmonitor::ChannelMonitorUpdate, _data: &channelmonitor::ChannelMonitor<EnforcingChannelKeys>) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> {
12+
Ok(())
13+
}
14+
}

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 ChainFilter = dyn lightning::chain::Filter;
39-
//! type ChainMonitor = lightning::chain::chainmonitor::ChainMonitor<lightning::chain::keysinterface::InMemoryChannelKeys, Arc<ChainFilter>, Arc<TxBroadcaster>, Arc<FeeEstimator>, Arc<Logger>>;
39+
//! type DataPersister = dyn lightning::chain::channelmonitor::Persist<lightning::chain::keysinterface::InMemoryChannelKeys>;
40+
//! type ChainMonitor = lightning::chain::chainmonitor::ChainMonitor<lightning::chain::keysinterface::InMemoryChannelKeys, Arc<ChainFilter>, 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
//!

lightning-persister/Cargo.toml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[package]
2+
name = "lightning-persister"
3+
version = "0.0.1"
4+
authors = ["Valentine Wallace", "Matt Corallo"]
5+
license = "Apache-2.0"
6+
description = """
7+
Utilities to manage channel data persistence and retrieval.
8+
"""
9+
10+
[dependencies]
11+
bitcoin = "0.24"
12+
lightning = { version = "0.0.11", path = "../lightning" }
13+
libc = "0.2"
14+
15+
[dev-dependencies.bitcoin]
16+
version = "0.24"
17+
features = ["bitcoinconsensus"]
18+
19+
[dev-dependencies]
20+
lightning = { version = "0.0.11", path = "../lightning", features = ["_test_utils"] }

0 commit comments

Comments
 (0)