1
- use crate :: payment_store :: { PaymentInfo , PAYMENT_INFO_PERSISTENCE_NAMESPACE } ;
2
- use crate :: { Config , FilesystemLogger , NetworkGraph , Scorer , WALLET_KEYS_SEED_LEN } ;
1
+ use super :: * ;
2
+ use crate :: WALLET_KEYS_SEED_LEN ;
3
3
4
+ use crate :: peer_store:: PeerInfoStorage ;
5
+ use crate :: { EventQueue , PaymentInfo } ;
6
+
7
+ use lightning:: chain:: channelmonitor:: ChannelMonitor ;
8
+ use lightning:: chain:: keysinterface:: { EntropySource , SignerProvider } ;
9
+ use lightning:: routing:: gossip:: NetworkGraph ;
4
10
use lightning:: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringParameters } ;
11
+ use lightning:: util:: logger:: Logger ;
12
+ use lightning:: util:: persist:: KVStorePersister ;
5
13
use lightning:: util:: ser:: { Readable , ReadableArgs } ;
6
14
15
+ use bitcoin:: hash_types:: { BlockHash , Txid } ;
16
+ use bitcoin:: hashes:: hex:: FromHex ;
7
17
use rand:: { thread_rng, RngCore } ;
8
18
9
19
use std:: fs;
10
- use std:: io:: { BufReader , Write } ;
20
+ use std:: io:: Write ;
21
+ use std:: ops:: Deref ;
11
22
use std:: path:: Path ;
12
- use std:: sync:: Arc ;
23
+
24
+ use super :: KVStore ;
13
25
14
26
pub ( crate ) fn read_or_generate_seed_file ( keys_seed_path : & str ) -> [ u8 ; WALLET_KEYS_SEED_LEN ] {
15
27
if Path :: new ( & keys_seed_path) . exists ( ) {
@@ -33,53 +45,125 @@ pub(crate) fn read_or_generate_seed_file(keys_seed_path: &str) -> [u8; WALLET_KE
33
45
}
34
46
}
35
47
36
- pub ( crate ) fn read_network_graph ( config : & Config , logger : Arc < FilesystemLogger > ) -> NetworkGraph {
37
- let ldk_data_dir = format ! ( "{}/ldk" , config. storage_dir_path) ;
38
- let network_graph_path = format ! ( "{}/network_graph" , ldk_data_dir) ;
39
-
40
- if let Ok ( file) = fs:: File :: open ( network_graph_path) {
41
- if let Ok ( graph) = NetworkGraph :: read ( & mut BufReader :: new ( file) , Arc :: clone ( & logger) ) {
42
- return graph;
43
- }
44
- }
45
-
46
- NetworkGraph :: new ( config. network , logger)
47
- }
48
-
49
- pub ( crate ) fn read_scorer (
50
- config : & Config , network_graph : Arc < NetworkGraph > , logger : Arc < FilesystemLogger > ,
51
- ) -> Scorer {
52
- let ldk_data_dir = format ! ( "{}/ldk" , config. storage_dir_path) ;
53
- let scorer_path = format ! ( "{}/scorer" , ldk_data_dir) ;
48
+ /// Read previously persisted [`ChannelMonitor`]s from the store.
49
+ pub ( crate ) fn read_channel_monitors < K : Deref , ES : Deref , SP : Deref > (
50
+ kv_store : K , entropy_source : ES , signer_provider : SP ,
51
+ ) -> std:: io:: Result < Vec < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: Signer > ) > >
52
+ where
53
+ K :: Target : KVStore ,
54
+ ES :: Target : EntropySource + Sized ,
55
+ SP :: Target : SignerProvider + Sized ,
56
+ {
57
+ let mut res = Vec :: new ( ) ;
54
58
55
- let params = ProbabilisticScoringParameters :: default ( ) ;
56
- if let Ok ( file) = fs:: File :: open ( scorer_path) {
57
- let args = ( params. clone ( ) , Arc :: clone ( & network_graph) , Arc :: clone ( & logger) ) ;
58
- if let Ok ( scorer) = ProbabilisticScorer :: read ( & mut BufReader :: new ( file) , args) {
59
- return scorer;
60
- }
61
- }
62
- ProbabilisticScorer :: new ( params, network_graph, logger)
63
- }
59
+ for stored_key in kv_store. list ( CHANNEL_MONITOR_PERSISTENCE_NAMESPACE ) ? {
60
+ let txid = Txid :: from_hex ( stored_key. split_at ( 64 ) . 0 ) . map_err ( |_| {
61
+ std:: io:: Error :: new ( std:: io:: ErrorKind :: InvalidData , "Invalid tx ID in stored key" )
62
+ } ) ?;
64
63
65
- pub ( crate ) fn read_payment_info ( config : & Config ) -> Vec < PaymentInfo > {
66
- let ldk_data_dir = format ! ( "{}/ldk" , config. storage_dir_path) ;
67
- let payment_store_path = format ! ( "{}/{}" , ldk_data_dir, PAYMENT_INFO_PERSISTENCE_NAMESPACE ) ;
68
- let mut payments = Vec :: new ( ) ;
64
+ let index: u16 = stored_key. split_at ( 65 ) . 1 . parse ( ) . map_err ( |_| {
65
+ std:: io:: Error :: new ( std:: io:: ErrorKind :: InvalidData , "Invalid tx index in stored key" )
66
+ } ) ?;
69
67
70
- if let Ok ( res) = fs:: read_dir ( payment_store_path) {
71
- for entry in res {
72
- if let Ok ( entry) = entry {
73
- if entry. path ( ) . is_file ( ) {
74
- if let Ok ( mut f) = fs:: File :: open ( entry. path ( ) ) {
75
- if let Ok ( payment_info) = PaymentInfo :: read ( & mut f) {
76
- payments. push ( payment_info) ;
77
- }
78
- }
68
+ match <( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: Signer > ) >:: read (
69
+ & mut kv_store. read ( CHANNEL_MONITOR_PERSISTENCE_NAMESPACE , & stored_key) ?,
70
+ ( & * entropy_source, & * signer_provider) ,
71
+ ) {
72
+ Ok ( ( block_hash, channel_monitor) ) => {
73
+ if channel_monitor. get_funding_txo ( ) . 0 . txid != txid
74
+ || channel_monitor. get_funding_txo ( ) . 0 . index != index
75
+ {
76
+ return Err ( std:: io:: Error :: new (
77
+ std:: io:: ErrorKind :: InvalidData ,
78
+ "ChannelMonitor was stored under the wrong key" ,
79
+ ) ) ;
79
80
}
81
+ res. push ( ( block_hash, channel_monitor) ) ;
82
+ }
83
+ Err ( e) => {
84
+ return Err ( std:: io:: Error :: new (
85
+ std:: io:: ErrorKind :: InvalidData ,
86
+ format ! ( "Failed to deserialize ChannelMonitor: {}" , e) ,
87
+ ) )
80
88
}
81
89
}
82
90
}
91
+ Ok ( res)
92
+ }
93
+ /// Read a previously persisted [`NetworkGraph`] from the store.
94
+ pub ( crate ) fn read_network_graph < K : Deref , L : Deref > (
95
+ kv_store : K , logger : L ,
96
+ ) -> Result < NetworkGraph < L > , std:: io:: Error >
97
+ where
98
+ K :: Target : KVStore ,
99
+ L :: Target : Logger ,
100
+ {
101
+ let mut reader =
102
+ kv_store. read ( NETWORK_GRAPH_PERSISTENCE_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_KEY ) ?;
103
+ let graph = NetworkGraph :: read ( & mut reader, logger) . map_err ( |_| {
104
+ std:: io:: Error :: new ( std:: io:: ErrorKind :: InvalidData , "Failed to deserialize NetworkGraph" )
105
+ } ) ?;
106
+ Ok ( graph)
107
+ }
108
+ /// Read a previously persisted [`Scorer`] from the store.
109
+ pub ( crate ) fn read_scorer < K : Deref , G : Deref < Target = NetworkGraph < L > > , L : Deref > (
110
+ kv_store : K , network_graph : G , logger : L ,
111
+ ) -> Result < ProbabilisticScorer < G , L > , std:: io:: Error >
112
+ where
113
+ K :: Target : KVStore ,
114
+ L :: Target : Logger ,
115
+ {
116
+ let params = ProbabilisticScoringParameters :: default ( ) ;
117
+ let mut reader = kv_store. read ( SCORER_PERSISTENCE_NAMESPACE , SCORER_PERSISTENCE_KEY ) ?;
118
+ let args = ( params, network_graph, logger) ;
119
+ let scorer = ProbabilisticScorer :: read ( & mut reader, args) . map_err ( |_| {
120
+ std:: io:: Error :: new ( std:: io:: ErrorKind :: InvalidData , "Failed to deserialize Scorer" )
121
+ } ) ?;
122
+ Ok ( scorer)
123
+ }
124
+ /// Read previously persisted events from the store.
125
+ pub ( crate ) fn read_event_queue < K : Deref > ( kv_store : K ) -> Result < EventQueue < K > , std:: io:: Error >
126
+ where
127
+ K :: Target : KVStore + KVStorePersister ,
128
+ {
129
+ let mut reader =
130
+ kv_store. read ( EVENT_QUEUE_PERSISTENCE_NAMESPACE , EVENT_QUEUE_PERSISTENCE_KEY ) ?;
131
+ let event_queue = EventQueue :: read ( & mut reader, kv_store) . map_err ( |_| {
132
+ std:: io:: Error :: new ( std:: io:: ErrorKind :: InvalidData , "Failed to deserialize EventQueue" )
133
+ } ) ?;
134
+ Ok ( event_queue)
135
+ }
136
+ /// Read previously persisted peer info from the store.
137
+ pub ( crate ) fn read_peer_info < K : Deref > ( kv_store : K ) -> Result < PeerInfoStorage < K > , std:: io:: Error >
138
+ where
139
+ K :: Target : KVStore + KVStorePersister ,
140
+ {
141
+ let mut reader = kv_store. read ( PEER_INFO_PERSISTENCE_NAMESPACE , PEER_INFO_PERSISTENCE_KEY ) ?;
142
+ let peer_info = PeerInfoStorage :: read ( & mut reader, kv_store) . map_err ( |_| {
143
+ std:: io:: Error :: new (
144
+ std:: io:: ErrorKind :: InvalidData ,
145
+ "Failed to deserialize PeerInfoStorage" ,
146
+ )
147
+ } ) ?;
148
+ Ok ( peer_info)
149
+ }
150
+ /// Read previously persisted payments information from the store.
151
+ pub ( crate ) fn read_payment_info < K : Deref > ( kv_store : K ) -> Result < Vec < PaymentInfo > , std:: io:: Error >
152
+ where
153
+ K :: Target : KVStore + KVStorePersister ,
154
+ {
155
+ let mut res = Vec :: new ( ) ;
83
156
84
- payments
157
+ for stored_key in kv_store. list ( PAYMENT_INFO_PERSISTENCE_NAMESPACE ) ? {
158
+ let payment_info =
159
+ PaymentInfo :: read ( & mut kv_store. read ( PAYMENT_INFO_PERSISTENCE_NAMESPACE , & stored_key) ?)
160
+ . map_err ( |_| {
161
+ std:: io:: Error :: new (
162
+ std:: io:: ErrorKind :: InvalidData ,
163
+ "Failed to deserialize PaymentInfo" ,
164
+ )
165
+ } ) ?;
166
+ res. push ( payment_info) ;
167
+ }
168
+ Ok ( res)
85
169
}
0 commit comments