Skip to content

Commit bc899dc

Browse files
authored
Merge pull request #874 from TheBlueMatt/2021-04-persister-export
Prep lightning-persister for export in the C bindings
2 parents 8088e4b + 3fdf252 commit bc899dc

File tree

1 file changed

+33
-34
lines changed

1 file changed

+33
-34
lines changed

lightning-persister/src/lib.rs

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ extern crate lightning;
1212
extern crate bitcoin;
1313
extern crate libc;
1414

15-
use bitcoin::{BlockHash, Txid};
15+
use bitcoin::hash_types::{BlockHash, Txid};
1616
use bitcoin::hashes::hex::{FromHex, ToHex};
1717
use crate::util::DiskWriteable;
1818
use lightning::chain;
@@ -24,12 +24,10 @@ use lightning::chain::transaction::OutPoint;
2424
use lightning::ln::channelmanager::ChannelManager;
2525
use lightning::util::logger::Logger;
2626
use lightning::util::ser::{ReadableArgs, Writeable};
27-
use std::collections::HashMap;
2827
use std::fs;
2928
use std::io::{Cursor, Error};
3029
use std::ops::Deref;
3130
use std::path::{Path, PathBuf};
32-
use std::sync::Arc;
3331

3432
/// FilesystemPersister persists channel data on disk, where each channel's
3533
/// data is stored in a file named after its funding outpoint.
@@ -53,12 +51,13 @@ impl<Signer: Sign> DiskWriteable for ChannelMonitor<Signer> {
5351
}
5452
}
5553

56-
impl<Signer: Sign, M, T, K, F, L> DiskWriteable for ChannelManager<Signer, Arc<M>, Arc<T>, Arc<K>, Arc<F>, Arc<L>>
57-
where M: chain::Watch<Signer>,
58-
T: BroadcasterInterface,
59-
K: KeysInterface<Signer=Signer>,
60-
F: FeeEstimator,
61-
L: Logger,
54+
impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> DiskWriteable for ChannelManager<Signer, M, T, K, F, L>
55+
where
56+
M::Target: chain::Watch<Signer>,
57+
T::Target: BroadcasterInterface,
58+
K::Target: KeysInterface<Signer=Signer>,
59+
F::Target: FeeEstimator,
60+
L::Target: Logger,
6261
{
6362
fn write_to_file(&self, writer: &mut fs::File) -> Result<(), std::io::Error> {
6463
self.write(writer)
@@ -87,16 +86,16 @@ impl FilesystemPersister {
8786

8887
/// Writes the provided `ChannelManager` to the path provided at `FilesystemPersister`
8988
/// initialization, within a file called "manager".
90-
pub fn persist_manager<Signer, M, T, K, F, L>(
89+
pub fn persist_manager<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>(
9190
data_dir: String,
92-
manager: &ChannelManager<Signer, Arc<M>, Arc<T>, Arc<K>, Arc<F>, Arc<L>>
91+
manager: &ChannelManager<Signer, M, T, K, F, L>
9392
) -> Result<(), std::io::Error>
94-
where Signer: Sign,
95-
M: chain::Watch<Signer>,
96-
T: BroadcasterInterface,
97-
K: KeysInterface<Signer=Signer>,
98-
F: FeeEstimator,
99-
L: Logger
93+
where
94+
M::Target: chain::Watch<Signer>,
95+
T::Target: BroadcasterInterface,
96+
K::Target: KeysInterface<Signer=Signer>,
97+
F::Target: FeeEstimator,
98+
L::Target: Logger,
10099
{
101100
let path = PathBuf::from(data_dir);
102101
util::write_to_file(path, "manager".to_string(), manager)
@@ -105,14 +104,14 @@ impl FilesystemPersister {
105104
/// Read `ChannelMonitor`s from disk.
106105
pub fn read_channelmonitors<Signer: Sign, K: Deref> (
107106
&self, keys_manager: K
108-
) -> Result<HashMap<OutPoint, (BlockHash, ChannelMonitor<Signer>)>, std::io::Error>
109-
where K::Target: KeysInterface<Signer=Signer> + Sized
107+
) -> Result<Vec<(BlockHash, ChannelMonitor<Signer>)>, std::io::Error>
108+
where K::Target: KeysInterface<Signer=Signer> + Sized,
110109
{
111110
let path = self.path_to_monitor_data();
112111
if !Path::new(&path).exists() {
113-
return Ok(HashMap::new());
112+
return Ok(Vec::new());
114113
}
115-
let mut outpoint_to_channelmonitor = HashMap::new();
114+
let mut res = Vec::new();
116115
for file_option in fs::read_dir(path).unwrap() {
117116
let file = file_option.unwrap();
118117
let owned_file_name = file.file_name();
@@ -144,32 +143,32 @@ impl FilesystemPersister {
144143
let mut buffer = Cursor::new(&contents);
145144
match <(BlockHash, ChannelMonitor<Signer>)>::read(&mut buffer, &*keys_manager) {
146145
Ok((blockhash, channel_monitor)) => {
147-
outpoint_to_channelmonitor.insert(
148-
OutPoint { txid: txid.unwrap(), index: index.unwrap() },
149-
(blockhash, channel_monitor),
150-
);
146+
if channel_monitor.get_funding_txo().0.txid != txid.unwrap() || channel_monitor.get_funding_txo().0.index != index.unwrap() {
147+
return Err(std::io::Error::new(std::io::ErrorKind::InvalidData, "ChannelMonitor was stored in the wrong file"));
148+
}
149+
res.push((blockhash, channel_monitor));
151150
}
152151
Err(e) => return Err(std::io::Error::new(
153152
std::io::ErrorKind::InvalidData,
154153
format!("Failed to deserialize ChannelMonitor: {}", e),
155154
))
156155
}
157156
}
158-
Ok(outpoint_to_channelmonitor)
157+
Ok(res)
159158
}
160159
}
161160

162161
impl<ChannelSigner: Sign> channelmonitor::Persist<ChannelSigner> for FilesystemPersister {
163162
fn persist_new_channel(&self, funding_txo: OutPoint, monitor: &ChannelMonitor<ChannelSigner>) -> Result<(), ChannelMonitorUpdateErr> {
164163
let filename = format!("{}_{}", funding_txo.txid.to_hex(), funding_txo.index);
165164
util::write_to_file(self.path_to_monitor_data(), filename, monitor)
166-
.map_err(|_| ChannelMonitorUpdateErr::PermanentFailure)
165+
.map_err(|_| ChannelMonitorUpdateErr::PermanentFailure)
167166
}
168167

169168
fn update_persisted_channel(&self, funding_txo: OutPoint, _update: &ChannelMonitorUpdate, monitor: &ChannelMonitor<ChannelSigner>) -> Result<(), ChannelMonitorUpdateErr> {
170169
let filename = format!("{}_{}", funding_txo.txid.to_hex(), funding_txo.index);
171170
util::write_to_file(self.path_to_monitor_data(), filename, monitor)
172-
.map_err(|_| ChannelMonitorUpdateErr::PermanentFailure)
171+
.map_err(|_| ChannelMonitorUpdateErr::PermanentFailure)
173172
}
174173
}
175174

@@ -227,21 +226,21 @@ mod tests {
227226
// Check that the persisted channel data is empty before any channels are
228227
// open.
229228
let mut persisted_chan_data_0 = persister_0.read_channelmonitors(nodes[0].keys_manager).unwrap();
230-
assert_eq!(persisted_chan_data_0.keys().len(), 0);
229+
assert_eq!(persisted_chan_data_0.len(), 0);
231230
let mut persisted_chan_data_1 = persister_1.read_channelmonitors(nodes[1].keys_manager).unwrap();
232-
assert_eq!(persisted_chan_data_1.keys().len(), 0);
231+
assert_eq!(persisted_chan_data_1.len(), 0);
233232

234233
// Helper to make sure the channel is on the expected update ID.
235234
macro_rules! check_persisted_data {
236235
($expected_update_id: expr) => {
237236
persisted_chan_data_0 = persister_0.read_channelmonitors(nodes[0].keys_manager).unwrap();
238-
assert_eq!(persisted_chan_data_0.keys().len(), 1);
239-
for (_, mon) in persisted_chan_data_0.values() {
237+
assert_eq!(persisted_chan_data_0.len(), 1);
238+
for (_, mon) in persisted_chan_data_0.iter() {
240239
assert_eq!(mon.get_latest_update_id(), $expected_update_id);
241240
}
242241
persisted_chan_data_1 = persister_1.read_channelmonitors(nodes[1].keys_manager).unwrap();
243-
assert_eq!(persisted_chan_data_1.keys().len(), 1);
244-
for (_, mon) in persisted_chan_data_1.values() {
242+
assert_eq!(persisted_chan_data_1.len(), 1);
243+
for (_, mon) in persisted_chan_data_1.iter() {
245244
assert_eq!(mon.get_latest_update_id(), $expected_update_id);
246245
}
247246
}

0 commit comments

Comments
 (0)