@@ -15,7 +15,7 @@ use chain::chaininterface::{ChainError, ChainWatchInterface};
15
15
use ln:: channelmanager;
16
16
use ln:: msgs:: { DecodeError , ErrorAction , HandleError , RoutingMessageHandler , NetAddress , GlobalFeatures } ;
17
17
use ln:: msgs;
18
- use util:: ser:: { Writeable , Readable } ;
18
+ use util:: ser:: { Writeable , Readable , Writer , ReadableArgs } ;
19
19
use util:: logger:: Logger ;
20
20
21
21
use std:: cmp;
@@ -96,6 +96,53 @@ impl std::fmt::Display for DirectionalChannelInfo {
96
96
}
97
97
}
98
98
99
+ impl Writeable for DirectionalChannelInfo {
100
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
101
+ self . src_node_id . write ( writer) ?;
102
+ self . last_update . write ( writer) ?;
103
+ self . enabled . write ( writer) ?;
104
+ self . cltv_expiry_delta . write ( writer) ?;
105
+ self . htlc_minimum_msat . write ( writer) ?;
106
+ self . fee_base_msat . write ( writer) ?;
107
+ self . fee_proportional_millionths . write ( writer) ?;
108
+ match & self . last_update_message {
109
+ & None => 0u8 . write ( writer) ?,
110
+ & Some ( ref msg) => {
111
+ 1u8 . write ( writer) ?;
112
+ msg. write ( writer) ?;
113
+ }
114
+ }
115
+ Ok ( ( ) )
116
+ }
117
+ }
118
+
119
+ impl < R : :: std:: io:: Read > Readable < R > for DirectionalChannelInfo {
120
+ fn read ( reader : & mut R ) -> Result < DirectionalChannelInfo , DecodeError > {
121
+ let src_node_id = Readable :: read ( reader) ?;
122
+ let last_update = Readable :: read ( reader) ?;
123
+ let enabled = Readable :: read ( reader) ?;
124
+ let cltv_expiry_delta = Readable :: read ( reader) ?;
125
+ let htlc_minimum_msat = Readable :: read ( reader) ?;
126
+ let fee_base_msat = Readable :: read ( reader) ?;
127
+ let fee_proportional_millionths = Readable :: read ( reader) ?;
128
+ let last_update_message = match <u8 as Readable < R > >:: read ( reader) ? {
129
+ 0 => None ,
130
+ 1 => Some ( msgs:: ChannelUpdate :: read ( reader) ?) ,
131
+ _ => return Err ( DecodeError :: InvalidValue ) ,
132
+ } ;
133
+ Ok ( DirectionalChannelInfo {
134
+ src_node_id,
135
+ last_update,
136
+ enabled,
137
+ cltv_expiry_delta,
138
+ htlc_minimum_msat,
139
+ fee_base_msat,
140
+ fee_proportional_millionths,
141
+ last_update_message
142
+ } )
143
+ }
144
+ }
145
+
99
146
struct ChannelInfo {
100
147
features : GlobalFeatures ,
101
148
one_to_two : DirectionalChannelInfo ,
@@ -112,6 +159,41 @@ impl std::fmt::Display for ChannelInfo {
112
159
}
113
160
}
114
161
162
+ impl Writeable for ChannelInfo {
163
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
164
+ self . features . write ( writer) ?;
165
+ self . one_to_two . write ( writer) ?;
166
+ self . two_to_one . write ( writer) ?;
167
+ match & self . announcement_message {
168
+ & None => 0u8 . write ( writer) ?,
169
+ & Some ( ref msg) => {
170
+ 1u8 . write ( writer) ?;
171
+ msg. write ( writer) ?;
172
+ }
173
+ }
174
+ Ok ( ( ) )
175
+ }
176
+ }
177
+
178
+ impl < R : :: std:: io:: Read > Readable < R > for ChannelInfo {
179
+ fn read ( reader : & mut R ) -> Result < ChannelInfo , DecodeError > {
180
+ let features = Readable :: read ( reader) ?;
181
+ let one_to_two = Readable :: read ( reader) ?;
182
+ let two_to_one = Readable :: read ( reader) ?;
183
+ let announcement_message = match <u8 as Readable < R > >:: read ( reader) ? {
184
+ 0 => None ,
185
+ 1 => Some ( msgs:: ChannelAnnouncement :: read ( reader) ?) ,
186
+ _ => return Err ( DecodeError :: InvalidValue ) ,
187
+ } ;
188
+ Ok ( ChannelInfo {
189
+ features,
190
+ one_to_two,
191
+ two_to_one,
192
+ announcement_message,
193
+ } )
194
+ }
195
+ }
196
+
115
197
struct NodeInfo {
116
198
#[ cfg( feature = "non_bitcoin_chain_hash_routing" ) ]
117
199
channels : Vec < ( u64 , Sha256dHash ) > ,
@@ -138,6 +220,72 @@ impl std::fmt::Display for NodeInfo {
138
220
}
139
221
}
140
222
223
+ impl Writeable for NodeInfo {
224
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
225
+ ( self . channels . len ( ) as u64 ) . write ( writer) ?;
226
+ for ref chan in self . channels . iter ( ) {
227
+ chan. write ( writer) ?;
228
+ }
229
+ self . lowest_inbound_channel_fee_base_msat . write ( writer) ?;
230
+ self . lowest_inbound_channel_fee_proportional_millionths . write ( writer) ?;
231
+ self . features . write ( writer) ?;
232
+ self . last_update . write ( writer) ?;
233
+ self . rgb . write ( writer) ?;
234
+ self . alias . write ( writer) ?;
235
+ ( self . addresses . len ( ) as u64 ) . write ( writer) ?;
236
+ for ref addr in & self . addresses {
237
+ addr. write ( writer) ?;
238
+ }
239
+ match & self . announcement_message {
240
+ & None => 0u8 . write ( writer) ?,
241
+ & Some ( ref msg) => {
242
+ 1u8 . write ( writer) ?;
243
+ msg. write ( writer) ?;
244
+ }
245
+ }
246
+ Ok ( ( ) )
247
+ }
248
+ }
249
+
250
+ impl < R : :: std:: io:: Read > Readable < R > for NodeInfo {
251
+ fn read ( reader : & mut R ) -> Result < NodeInfo , DecodeError > {
252
+ let channels_count: u64 = Readable :: read ( reader) ?;
253
+ let mut channels = Vec :: with_capacity ( channels_count as usize ) ;
254
+ for _ in 0 ..channels_count {
255
+ channels. push ( Readable :: read ( reader) ?) ;
256
+ }
257
+ let lowest_inbound_channel_fee_base_msat = Readable :: read ( reader) ?;
258
+ let lowest_inbound_channel_fee_proportional_millionths = Readable :: read ( reader) ?;
259
+ let features = Readable :: read ( reader) ?;
260
+ let last_update = Readable :: read ( reader) ?;
261
+ let rgb = Readable :: read ( reader) ?;
262
+ let alias = Readable :: read ( reader) ?;
263
+ let addresses_count: u64 = Readable :: read ( reader) ?;
264
+ let mut addresses = Vec :: with_capacity ( addresses_count as usize ) ;
265
+ for _ in 0 ..addresses_count {
266
+ addresses. push ( Readable :: read ( reader) ?) ;
267
+ }
268
+ let announcement_message = match <u8 as Readable < R > >:: read ( reader) ? {
269
+ 0 => None ,
270
+ 1 => Some ( msgs:: NodeAnnouncement :: read ( reader) ?) ,
271
+ _ => return Err ( DecodeError :: InvalidValue ) ,
272
+
273
+
274
+ } ;
275
+ Ok ( NodeInfo {
276
+ channels,
277
+ lowest_inbound_channel_fee_base_msat,
278
+ lowest_inbound_channel_fee_proportional_millionths,
279
+ features,
280
+ last_update,
281
+ rgb,
282
+ alias,
283
+ addresses,
284
+ announcement_message
285
+ } )
286
+ }
287
+ }
288
+
141
289
struct NetworkMap {
142
290
#[ cfg( feature = "non_bitcoin_chain_hash_routing" ) ]
143
291
channels : BTreeMap < ( u64 , Sha256dHash ) , ChannelInfo > ,
@@ -147,6 +295,49 @@ struct NetworkMap {
147
295
our_node_id : PublicKey ,
148
296
nodes : BTreeMap < PublicKey , NodeInfo > ,
149
297
}
298
+
299
+ impl Writeable for NetworkMap {
300
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
301
+ ( self . channels . len ( ) as u64 ) . write ( writer) ?;
302
+ for ( ref chan_id, ref chan_info) in self . channels . iter ( ) {
303
+ ( * chan_id) . write ( writer) ?;
304
+ chan_info. write ( writer) ?;
305
+ }
306
+ self . our_node_id . write ( writer) ?;
307
+ ( self . nodes . len ( ) as u64 ) . write ( writer) ?;
308
+ for ( ref node_id, ref node_info) in self . nodes . iter ( ) {
309
+ node_id. write ( writer) ?;
310
+ node_info. write ( writer) ?;
311
+ }
312
+ Ok ( ( ) )
313
+ }
314
+ }
315
+
316
+ impl < R : :: std:: io:: Read > Readable < R > for NetworkMap {
317
+ fn read ( reader : & mut R ) -> Result < NetworkMap , DecodeError > {
318
+ let channels_count: u64 = Readable :: read ( reader) ?;
319
+ let mut channels = BTreeMap :: new ( ) ;
320
+ for _ in 0 ..channels_count {
321
+ let chan_id: u64 = Readable :: read ( reader) ?;
322
+ let chan_info = Readable :: read ( reader) ?;
323
+ channels. insert ( chan_id, chan_info) ;
324
+ }
325
+ let our_node_id = Readable :: read ( reader) ?;
326
+ let nodes_count: u64 = Readable :: read ( reader) ?;
327
+ let mut nodes = BTreeMap :: new ( ) ;
328
+ for _ in 0 ..nodes_count {
329
+ let node_id = Readable :: read ( reader) ?;
330
+ let node_info = Readable :: read ( reader) ?;
331
+ nodes. insert ( node_id, node_info) ;
332
+ }
333
+ Ok ( NetworkMap {
334
+ channels,
335
+ our_node_id,
336
+ nodes,
337
+ } )
338
+ }
339
+ }
340
+
150
341
struct MutNetworkMap < ' a > {
151
342
#[ cfg( feature = "non_bitcoin_chain_hash_routing" ) ]
152
343
channels : & ' a mut BTreeMap < ( u64 , Sha256dHash ) , ChannelInfo > ,
@@ -228,6 +419,48 @@ pub struct Router {
228
419
logger : Arc < Logger > ,
229
420
}
230
421
422
+ const SERIALIZATION_VERSION : u8 = 1 ;
423
+ const MIN_SERIALIZATION_VERSION : u8 = 1 ;
424
+
425
+ impl Writeable for Router {
426
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
427
+ writer. write_all ( & [ SERIALIZATION_VERSION ; 1 ] ) ?;
428
+ writer. write_all ( & [ MIN_SERIALIZATION_VERSION ; 1 ] ) ?;
429
+
430
+ let network = self . network_map . read ( ) . unwrap ( ) ;
431
+ network. write ( writer) ?;
432
+ Ok ( ( ) )
433
+ }
434
+ }
435
+
436
+ /// Arguments for the creation of a Router that are not deserialized
437
+ pub struct RouterReadArgs {
438
+ /// The ChainWatchInterface for use in the ChannelManager in the future.
439
+ ///
440
+ /// No calls to the ChainWatchInterface will be made during deserialization.
441
+ pub chain_monitor : Arc < ChainWatchInterface > ,
442
+ /// The Logger for use in the ChannelManager and which may be used to log information during
443
+ /// deserialization.
444
+ pub logger : Arc < Logger > ,
445
+ }
446
+
447
+ impl < R : :: std:: io:: Read > ReadableArgs < R , RouterReadArgs > for Router {
448
+ fn read ( reader : & mut R , args : RouterReadArgs ) -> Result < Router , DecodeError > {
449
+ let _ver: u8 = Readable :: read ( reader) ?;
450
+ let min_ver: u8 = Readable :: read ( reader) ?;
451
+ if min_ver > SERIALIZATION_VERSION {
452
+ return Err ( DecodeError :: UnknownVersion ) ;
453
+ }
454
+ let network_map = Readable :: read ( reader) ?;
455
+ Ok ( Router {
456
+ secp_ctx : Secp256k1 :: verification_only ( ) ,
457
+ network_map : RwLock :: new ( network_map) ,
458
+ chain_monitor : args. chain_monitor ,
459
+ logger : args. logger ,
460
+ } )
461
+ }
462
+ }
463
+
231
464
macro_rules! secp_verify_sig {
232
465
( $secp_ctx: expr, $msg: expr, $sig: expr, $pubkey: expr ) => {
233
466
match $secp_ctx. verify( $msg, $sig, $pubkey) {
0 commit comments