Skip to content

Commit b2f1327

Browse files
authored
Merge pull request #761 from TheBlueMatt/2020-10-chansigner-no-ser
Add a new method `read_chan_signer` to `KeysInterface`
2 parents aa9ecab + 990d1de commit b2f1327

16 files changed

+199
-108
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,15 @@ use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget,
3737
use lightning::chain::keysinterface::{KeysInterface, InMemoryChannelKeys};
3838
use lightning::ln::channelmanager::{ChannelManager, PaymentHash, PaymentPreimage, PaymentSecret, PaymentSendFailure, ChannelManagerReadArgs};
3939
use lightning::ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
40-
use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, ErrorAction, UpdateAddHTLC, Init};
40+
use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, DecodeError, ErrorAction, UpdateAddHTLC, Init};
4141
use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
4242
use lightning::util::errors::APIError;
4343
use lightning::util::events;
4444
use lightning::util::logger::Logger;
4545
use lightning::util::config::UserConfig;
4646
use lightning::util::events::{EventsProvider, MessageSendEventsProvider};
4747
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
48+
use lightning::util::test_utils::OnlyReadsKeysInterface;
4849
use lightning::routing::router::{Route, RouteHop};
4950

5051

@@ -112,7 +113,7 @@ impl chain::Watch for TestChainMonitor {
112113

113114
fn watch_channel(&self, funding_txo: OutPoint, monitor: channelmonitor::ChannelMonitor<EnforcingChannelKeys>) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> {
114115
let mut ser = VecWriter(Vec::new());
115-
monitor.serialize_for_disk(&mut ser).unwrap();
116+
monitor.write(&mut ser).unwrap();
116117
if let Some(_) = self.latest_monitors.lock().unwrap().insert(funding_txo, (monitor.get_latest_update_id(), ser.0)) {
117118
panic!("Already had monitor pre-watch_channel");
118119
}
@@ -128,10 +129,10 @@ impl chain::Watch for TestChainMonitor {
128129
hash_map::Entry::Vacant(_) => panic!("Didn't have monitor on update call"),
129130
};
130131
let mut deserialized_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::
131-
read(&mut Cursor::new(&map_entry.get().1)).unwrap().1;
132+
read(&mut Cursor::new(&map_entry.get().1), &OnlyReadsKeysInterface {}).unwrap().1;
132133
deserialized_monitor.update_monitor(&update, &&TestBroadcaster{}, &&FuzzEstimator{}, &self.logger).unwrap();
133134
let mut ser = VecWriter(Vec::new());
134-
deserialized_monitor.serialize_for_disk(&mut ser).unwrap();
135+
deserialized_monitor.write(&mut ser).unwrap();
135136
map_entry.insert((update.update_id, ser.0));
136137
self.should_update_manager.store(true, atomic::Ordering::Relaxed);
137138
self.update_ret.lock().unwrap().clone()
@@ -184,6 +185,10 @@ impl KeysInterface for KeyProvider {
184185
let id = self.rand_bytes_id.fetch_add(1, atomic::Ordering::Relaxed);
185186
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, id, 11, self.node_id]
186187
}
188+
189+
fn read_chan_signer(&self, data: &[u8]) -> Result<EnforcingChannelKeys, DecodeError> {
190+
EnforcingChannelKeys::read(&mut std::io::Cursor::new(data))
191+
}
187192
}
188193

189194
#[inline]
@@ -307,7 +312,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
307312
let mut monitors = HashMap::new();
308313
let mut old_monitors = $old_monitors.latest_monitors.lock().unwrap();
309314
for (outpoint, (update_id, monitor_ser)) in old_monitors.drain() {
310-
monitors.insert(outpoint, <(BlockHash, ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&monitor_ser)).expect("Failed to read monitor").1);
315+
monitors.insert(outpoint, <(BlockHash, ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&monitor_ser), &OnlyReadsKeysInterface {}).expect("Failed to read monitor").1);
311316
chain_monitor.latest_monitors.lock().unwrap().insert(outpoint, (update_id, monitor_ser));
312317
}
313318
let mut monitor_refs = HashMap::new();

fuzz/src/chanmon_deser.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use bitcoin::hash_types::BlockHash;
55

66
use lightning::chain::channelmonitor;
77
use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
8-
use lightning::util::ser::{Readable, Writer};
8+
use lightning::util::ser::{ReadableArgs, Writer, Writeable};
9+
use lightning::util::test_utils::OnlyReadsKeysInterface;
910

1011
use utils::test_logger;
1112

@@ -24,10 +25,10 @@ impl Writer for VecWriter {
2425

2526
#[inline]
2627
pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
27-
if let Ok((latest_block_hash, monitor)) = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(data)) {
28+
if let Ok((latest_block_hash, monitor)) = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(data), &OnlyReadsKeysInterface {}) {
2829
let mut w = VecWriter(Vec::new());
29-
monitor.serialize_for_disk(&mut w).unwrap();
30-
let deserialized_copy = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&w.0)).unwrap();
30+
monitor.write(&mut w).unwrap();
31+
let deserialized_copy = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingChannelKeys>)>::read(&mut Cursor::new(&w.0), &OnlyReadsKeysInterface {}).unwrap();
3132
assert!(latest_block_hash == deserialized_copy.0);
3233
assert!(monitor == deserialized_copy.1);
3334
}

fuzz/src/full_stack.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@ use lightning::chain::transaction::OutPoint;
3333
use lightning::chain::keysinterface::{InMemoryChannelKeys, KeysInterface};
3434
use lightning::ln::channelmanager::{ChannelManager, PaymentHash, PaymentPreimage, PaymentSecret};
3535
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor};
36+
use lightning::ln::msgs::DecodeError;
3637
use lightning::routing::router::get_route;
3738
use lightning::routing::network_graph::NetGraphMsgHandler;
39+
use lightning::util::config::UserConfig;
3840
use lightning::util::events::{EventsProvider,Event};
3941
use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
4042
use lightning::util::logger::Logger;
41-
use lightning::util::config::UserConfig;
43+
use lightning::util::ser::Readable;
4244

4345
use utils::test_logger;
4446
use utils::test_persister::TestPersister;
@@ -299,6 +301,10 @@ impl KeysInterface for KeyProvider {
299301
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
300302
(ctr >> 8*7) as u8, (ctr >> 8*6) as u8, (ctr >> 8*5) as u8, (ctr >> 8*4) as u8, (ctr >> 8*3) as u8, (ctr >> 8*2) as u8, (ctr >> 8*1) as u8, 14, (ctr >> 8*0) as u8]
301303
}
304+
305+
fn read_chan_signer(&self, data: &[u8]) -> Result<EnforcingChannelKeys, DecodeError> {
306+
EnforcingChannelKeys::read(&mut std::io::Cursor::new(data))
307+
}
302308
}
303309

304310
#[inline]

lightning-persister/src/lib.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ use lightning::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, Cha
77
use lightning::chain::channelmonitor;
88
use lightning::chain::keysinterface::ChannelKeys;
99
use lightning::chain::transaction::OutPoint;
10-
use lightning::util::ser::{Writeable, Readable};
10+
use lightning::util::ser::Writeable;
1111
use std::fs;
1212
use std::io::Error;
1313
use std::path::{Path, PathBuf};
1414

1515
#[cfg(test)]
1616
use {
17+
lightning::chain::keysinterface::KeysInterface,
18+
lightning::util::ser::ReadableArgs,
1719
bitcoin::{BlockHash, Txid},
1820
bitcoin::hashes::hex::FromHex,
1921
std::collections::HashMap,
@@ -43,9 +45,9 @@ trait DiskWriteable {
4345
fn write(&self, writer: &mut fs::File) -> Result<(), Error>;
4446
}
4547

46-
impl<ChanSigner: ChannelKeys + Writeable> DiskWriteable for ChannelMonitor<ChanSigner> {
48+
impl<ChanSigner: ChannelKeys> DiskWriteable for ChannelMonitor<ChanSigner> {
4749
fn write(&self, writer: &mut fs::File) -> Result<(), Error> {
48-
self.serialize_for_disk(writer)
50+
Writeable::write(self, writer)
4951
}
5052
}
5153

@@ -94,8 +96,8 @@ impl FilesystemPersister {
9496
}
9597

9698
#[cfg(test)]
97-
fn load_channel_data<ChanSigner: ChannelKeys + Readable + Writeable>(&self) ->
98-
Result<HashMap<OutPoint, ChannelMonitor<ChanSigner>>, ChannelMonitorUpdateErr> {
99+
fn load_channel_data<Keys: KeysInterface>(&self, keys: &Keys) ->
100+
Result<HashMap<OutPoint, ChannelMonitor<Keys::ChanKeySigner>>, ChannelMonitorUpdateErr> {
99101
if let Err(_) = fs::create_dir_all(&self.path_to_channel_data) {
100102
return Err(ChannelMonitorUpdateErr::PermanentFailure);
101103
}
@@ -118,7 +120,7 @@ impl FilesystemPersister {
118120
if contents.is_err() { return Err(ChannelMonitorUpdateErr::PermanentFailure); }
119121

120122
if let Ok((_, loaded_monitor)) =
121-
<(BlockHash, ChannelMonitor<ChanSigner>)>::read(&mut Cursor::new(&contents.unwrap())) {
123+
<(BlockHash, ChannelMonitor<Keys::ChanKeySigner>)>::read(&mut Cursor::new(&contents.unwrap()), keys) {
122124
res.insert(OutPoint { txid: txid.unwrap(), index: index.unwrap() }, loaded_monitor);
123125
} else {
124126
return Err(ChannelMonitorUpdateErr::PermanentFailure);
@@ -128,7 +130,7 @@ impl FilesystemPersister {
128130
}
129131
}
130132

131-
impl<ChanSigner: ChannelKeys + Readable + Writeable + Send + Sync> channelmonitor::Persist<ChanSigner> for FilesystemPersister {
133+
impl<ChanSigner: ChannelKeys + Send + Sync> channelmonitor::Persist<ChanSigner> for FilesystemPersister {
132134
fn persist_new_channel(&self, funding_txo: OutPoint, monitor: &ChannelMonitor<ChanSigner>) -> Result<(), ChannelMonitorUpdateErr> {
133135
self.write_channel_data(funding_txo, monitor)
134136
.map_err(|_| ChannelMonitorUpdateErr::PermanentFailure)
@@ -168,7 +170,6 @@ mod tests {
168170
use lightning::ln::features::InitFeatures;
169171
use lightning::ln::functional_test_utils::*;
170172
use lightning::ln::msgs::ErrorAction;
171-
use lightning::util::enforcing_trait_impls::EnforcingChannelKeys;
172173
use lightning::util::events::{MessageSendEventsProvider, MessageSendEvent};
173174
use lightning::util::ser::Writer;
174175
use lightning::util::test_utils;
@@ -206,20 +207,20 @@ mod tests {
206207

207208
// Check that the persisted channel data is empty before any channels are
208209
// open.
209-
let mut persisted_chan_data_0 = persister_0.load_channel_data::<EnforcingChannelKeys>().unwrap();
210+
let mut persisted_chan_data_0 = persister_0.load_channel_data(nodes[0].keys_manager).unwrap();
210211
assert_eq!(persisted_chan_data_0.keys().len(), 0);
211-
let mut persisted_chan_data_1 = persister_1.load_channel_data::<EnforcingChannelKeys>().unwrap();
212+
let mut persisted_chan_data_1 = persister_1.load_channel_data(nodes[1].keys_manager).unwrap();
212213
assert_eq!(persisted_chan_data_1.keys().len(), 0);
213214

214215
// Helper to make sure the channel is on the expected update ID.
215216
macro_rules! check_persisted_data {
216217
($expected_update_id: expr) => {
217-
persisted_chan_data_0 = persister_0.load_channel_data::<EnforcingChannelKeys>().unwrap();
218+
persisted_chan_data_0 = persister_0.load_channel_data(nodes[0].keys_manager).unwrap();
218219
assert_eq!(persisted_chan_data_0.keys().len(), 1);
219220
for mon in persisted_chan_data_0.values() {
220221
assert_eq!(mon.get_latest_update_id(), $expected_update_id);
221222
}
222-
persisted_chan_data_1 = persister_1.load_channel_data::<EnforcingChannelKeys>().unwrap();
223+
persisted_chan_data_1 = persister_1.load_channel_data(nodes[1].keys_manager).unwrap();
223224
assert_eq!(persisted_chan_data_1.keys().len(), 1);
224225
for mon in persisted_chan_data_1.values() {
225226
assert_eq!(mon.get_latest_update_id(), $expected_update_id);

lightning/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Still missing tons of error-handling. See GitHub issues for suggested projects i
1111
"""
1212

1313
[features]
14-
fuzztarget = ["bitcoin/fuzztarget"]
14+
fuzztarget = ["bitcoin/fuzztarget", "regex"]
1515
# Internal test utilities exposed to other repo crates
1616
_test_utils = ["hex", "regex"]
1717
# Unlog messages superior at targeted level.

0 commit comments

Comments
 (0)