@@ -12,7 +12,7 @@ extern crate lightning;
12
12
extern crate bitcoin;
13
13
extern crate libc;
14
14
15
- use bitcoin:: { BlockHash , Txid } ;
15
+ use bitcoin:: hash_types :: { BlockHash , Txid } ;
16
16
use bitcoin:: hashes:: hex:: { FromHex , ToHex } ;
17
17
use crate :: util:: DiskWriteable ;
18
18
use lightning:: chain;
@@ -24,12 +24,10 @@ use lightning::chain::transaction::OutPoint;
24
24
use lightning:: ln:: channelmanager:: ChannelManager ;
25
25
use lightning:: util:: logger:: Logger ;
26
26
use lightning:: util:: ser:: { ReadableArgs , Writeable } ;
27
- use std:: collections:: HashMap ;
28
27
use std:: fs;
29
28
use std:: io:: { Cursor , Error } ;
30
29
use std:: ops:: Deref ;
31
30
use std:: path:: { Path , PathBuf } ;
32
- use std:: sync:: Arc ;
33
31
34
32
/// FilesystemPersister persists channel data on disk, where each channel's
35
33
/// data is stored in a file named after its funding outpoint.
@@ -53,12 +51,13 @@ impl<Signer: Sign> DiskWriteable for ChannelMonitor<Signer> {
53
51
}
54
52
}
55
53
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 ,
62
61
{
63
62
fn write_to_file ( & self , writer : & mut fs:: File ) -> Result < ( ) , std:: io:: Error > {
64
63
self . write ( writer)
@@ -87,16 +86,16 @@ impl FilesystemPersister {
87
86
88
87
/// Writes the provided `ChannelManager` to the path provided at `FilesystemPersister`
89
88
/// 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 > (
91
90
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 >
93
92
) -> 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 ,
100
99
{
101
100
let path = PathBuf :: from ( data_dir) ;
102
101
util:: write_to_file ( path, "manager" . to_string ( ) , manager)
@@ -105,14 +104,14 @@ impl FilesystemPersister {
105
104
/// Read `ChannelMonitor`s from disk.
106
105
pub fn read_channelmonitors < Signer : Sign , K : Deref > (
107
106
& 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 ,
110
109
{
111
110
let path = self . path_to_monitor_data ( ) ;
112
111
if !Path :: new ( & path) . exists ( ) {
113
- return Ok ( HashMap :: new ( ) ) ;
112
+ return Ok ( Vec :: new ( ) ) ;
114
113
}
115
- let mut outpoint_to_channelmonitor = HashMap :: new ( ) ;
114
+ let mut res = Vec :: new ( ) ;
116
115
for file_option in fs:: read_dir ( path) . unwrap ( ) {
117
116
let file = file_option. unwrap ( ) ;
118
117
let owned_file_name = file. file_name ( ) ;
@@ -144,32 +143,32 @@ impl FilesystemPersister {
144
143
let mut buffer = Cursor :: new ( & contents) ;
145
144
match <( BlockHash , ChannelMonitor < Signer > ) >:: read ( & mut buffer, & * keys_manager) {
146
145
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 ) ) ;
151
150
}
152
151
Err ( e) => return Err ( std:: io:: Error :: new (
153
152
std:: io:: ErrorKind :: InvalidData ,
154
153
format ! ( "Failed to deserialize ChannelMonitor: {}" , e) ,
155
154
) )
156
155
}
157
156
}
158
- Ok ( outpoint_to_channelmonitor )
157
+ Ok ( res )
159
158
}
160
159
}
161
160
162
161
impl < ChannelSigner : Sign > channelmonitor:: Persist < ChannelSigner > for FilesystemPersister {
163
162
fn persist_new_channel ( & self , funding_txo : OutPoint , monitor : & ChannelMonitor < ChannelSigner > ) -> Result < ( ) , ChannelMonitorUpdateErr > {
164
163
let filename = format ! ( "{}_{}" , funding_txo. txid. to_hex( ) , funding_txo. index) ;
165
164
util:: write_to_file ( self . path_to_monitor_data ( ) , filename, monitor)
166
- . map_err ( |_| ChannelMonitorUpdateErr :: PermanentFailure )
165
+ . map_err ( |_| ChannelMonitorUpdateErr :: PermanentFailure )
167
166
}
168
167
169
168
fn update_persisted_channel ( & self , funding_txo : OutPoint , _update : & ChannelMonitorUpdate , monitor : & ChannelMonitor < ChannelSigner > ) -> Result < ( ) , ChannelMonitorUpdateErr > {
170
169
let filename = format ! ( "{}_{}" , funding_txo. txid. to_hex( ) , funding_txo. index) ;
171
170
util:: write_to_file ( self . path_to_monitor_data ( ) , filename, monitor)
172
- . map_err ( |_| ChannelMonitorUpdateErr :: PermanentFailure )
171
+ . map_err ( |_| ChannelMonitorUpdateErr :: PermanentFailure )
173
172
}
174
173
}
175
174
@@ -227,21 +226,21 @@ mod tests {
227
226
// Check that the persisted channel data is empty before any channels are
228
227
// open.
229
228
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 ) ;
231
230
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 ) ;
233
232
234
233
// Helper to make sure the channel is on the expected update ID.
235
234
macro_rules! check_persisted_data {
236
235
( $expected_update_id: expr) => {
237
236
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 ( ) {
240
239
assert_eq!( mon. get_latest_update_id( ) , $expected_update_id) ;
241
240
}
242
241
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 ( ) {
245
244
assert_eq!( mon. get_latest_update_id( ) , $expected_update_id) ;
246
245
}
247
246
}
0 commit comments