@@ -10,14 +10,16 @@ use bitcoin::network::constants::Network;
10
10
11
11
use lightning:: chain;
12
12
13
+ use std:: ops:: Deref ;
14
+
13
15
/// Returns a validated block header of the source's best chain tip.
14
16
///
15
17
/// Upon success, the returned header can be used to initialize [`SpvClient`]. Useful during a fresh
16
18
/// start when there are no chain listeners to sync yet.
17
19
///
18
20
/// [`SpvClient`]: crate::SpvClient
19
- pub async fn validate_best_block_header < B : BlockSource > ( block_source : & B ) ->
20
- BlockSourceResult < ValidatedBlockHeader > {
21
+ pub async fn validate_best_block_header < B : Deref > ( block_source : B ) ->
22
+ BlockSourceResult < ValidatedBlockHeader > where B :: Target : BlockSource {
21
23
let ( best_block_hash, best_block_height) = block_source. get_best_block ( ) . await ?;
22
24
block_source
23
25
. get_header ( & best_block_hash, best_block_height) . await ?
@@ -121,13 +123,13 @@ BlockSourceResult<ValidatedBlockHeader> {
121
123
/// [`SpvClient`]: crate::SpvClient
122
124
/// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
123
125
/// [`ChannelMonitor`]: lightning::chain::channelmonitor::ChannelMonitor
124
- pub async fn synchronize_listeners < ' a , B : BlockSource , C : Cache , L : chain:: Listen + ?Sized > (
125
- block_source : & B ,
126
+ pub async fn synchronize_listeners < B : Deref + Sized + Send + Sync , C : Cache , L : chain:: Listen + ?Sized > (
127
+ block_source : B ,
126
128
network : Network ,
127
129
header_cache : & mut C ,
128
- mut chain_listeners : Vec < ( BlockHash , & ' a L ) > ,
129
- ) -> BlockSourceResult < ValidatedBlockHeader > {
130
- let best_header = validate_best_block_header ( block_source) . await ?;
130
+ mut chain_listeners : Vec < ( BlockHash , & L ) > ,
131
+ ) -> BlockSourceResult < ValidatedBlockHeader > where B :: Target : BlockSource {
132
+ let best_header = validate_best_block_header ( & * block_source) . await ?;
131
133
132
134
// Fetch the header for the block hash paired with each listener.
133
135
let mut chain_listeners_with_old_headers = Vec :: new ( ) ;
@@ -236,7 +238,7 @@ mod tests {
236
238
237
239
#[ tokio:: test]
238
240
async fn sync_from_same_chain ( ) {
239
- let mut chain = Blockchain :: default ( ) . with_height ( 4 ) ;
241
+ let chain = Blockchain :: default ( ) . with_height ( 4 ) ;
240
242
241
243
let listener_1 = MockChainListener :: new ( )
242
244
. expect_block_connected ( * chain. at_height ( 2 ) )
@@ -254,15 +256,15 @@ mod tests {
254
256
( chain. at_height( 3 ) . block_hash, & listener_3 as & dyn chain:: Listen ) ,
255
257
] ;
256
258
let mut cache = chain. header_cache ( 0 ..=4 ) ;
257
- match synchronize_listeners ( & mut chain, Network :: Bitcoin , & mut cache, listeners) . await {
259
+ match synchronize_listeners ( & chain, Network :: Bitcoin , & mut cache, listeners) . await {
258
260
Ok ( header) => assert_eq ! ( header, chain. tip( ) ) ,
259
261
Err ( e) => panic ! ( "Unexpected error: {:?}" , e) ,
260
262
}
261
263
}
262
264
263
265
#[ tokio:: test]
264
266
async fn sync_from_different_chains ( ) {
265
- let mut main_chain = Blockchain :: default ( ) . with_height ( 4 ) ;
267
+ let main_chain = Blockchain :: default ( ) . with_height ( 4 ) ;
266
268
let fork_chain_1 = main_chain. fork_at_height ( 1 ) ;
267
269
let fork_chain_2 = main_chain. fork_at_height ( 2 ) ;
268
270
let fork_chain_3 = main_chain. fork_at_height ( 3 ) ;
@@ -291,15 +293,15 @@ mod tests {
291
293
let mut cache = fork_chain_1. header_cache ( 2 ..=4 ) ;
292
294
cache. extend ( fork_chain_2. header_cache ( 3 ..=4 ) ) ;
293
295
cache. extend ( fork_chain_3. header_cache ( 4 ..=4 ) ) ;
294
- match synchronize_listeners ( & mut main_chain, Network :: Bitcoin , & mut cache, listeners) . await {
296
+ match synchronize_listeners ( & main_chain, Network :: Bitcoin , & mut cache, listeners) . await {
295
297
Ok ( header) => assert_eq ! ( header, main_chain. tip( ) ) ,
296
298
Err ( e) => panic ! ( "Unexpected error: {:?}" , e) ,
297
299
}
298
300
}
299
301
300
302
#[ tokio:: test]
301
303
async fn sync_from_overlapping_chains ( ) {
302
- let mut main_chain = Blockchain :: default ( ) . with_height ( 4 ) ;
304
+ let main_chain = Blockchain :: default ( ) . with_height ( 4 ) ;
303
305
let fork_chain_1 = main_chain. fork_at_height ( 1 ) ;
304
306
let fork_chain_2 = fork_chain_1. fork_at_height ( 2 ) ;
305
307
let fork_chain_3 = fork_chain_2. fork_at_height ( 3 ) ;
@@ -334,15 +336,15 @@ mod tests {
334
336
let mut cache = fork_chain_1. header_cache ( 2 ..=4 ) ;
335
337
cache. extend ( fork_chain_2. header_cache ( 3 ..=4 ) ) ;
336
338
cache. extend ( fork_chain_3. header_cache ( 4 ..=4 ) ) ;
337
- match synchronize_listeners ( & mut main_chain, Network :: Bitcoin , & mut cache, listeners) . await {
339
+ match synchronize_listeners ( & main_chain, Network :: Bitcoin , & mut cache, listeners) . await {
338
340
Ok ( header) => assert_eq ! ( header, main_chain. tip( ) ) ,
339
341
Err ( e) => panic ! ( "Unexpected error: {:?}" , e) ,
340
342
}
341
343
}
342
344
343
345
#[ tokio:: test]
344
346
async fn cache_connected_and_keep_disconnected_blocks ( ) {
345
- let mut main_chain = Blockchain :: default ( ) . with_height ( 2 ) ;
347
+ let main_chain = Blockchain :: default ( ) . with_height ( 2 ) ;
346
348
let fork_chain = main_chain. fork_at_height ( 1 ) ;
347
349
let new_tip = main_chain. tip ( ) ;
348
350
let old_tip = fork_chain. tip ( ) ;
@@ -353,7 +355,7 @@ mod tests {
353
355
354
356
let listeners = vec ! [ ( old_tip. block_hash, & listener as & dyn chain:: Listen ) ] ;
355
357
let mut cache = fork_chain. header_cache ( 2 ..=2 ) ;
356
- match synchronize_listeners ( & mut main_chain, Network :: Bitcoin , & mut cache, listeners) . await {
358
+ match synchronize_listeners ( & main_chain, Network :: Bitcoin , & mut cache, listeners) . await {
357
359
Ok ( _) => {
358
360
assert ! ( cache. contains_key( & new_tip. block_hash) ) ;
359
361
assert ! ( cache. contains_key( & old_tip. block_hash) ) ;
0 commit comments