@@ -17,7 +17,7 @@ use lightning::chain;
17
17
use lightning:: chain:: chaininterface:: { BroadcasterInterface , ConfirmationTarget , FeeEstimator } ;
18
18
use lightning:: chain:: keysinterface:: { InMemorySigner , KeysInterface , KeysManager , Recipient } ;
19
19
use lightning:: chain:: { chainmonitor, ChannelMonitorUpdateStatus } ;
20
- use lightning:: chain:: { BestBlock , Filter , Watch } ;
20
+ use lightning:: chain:: { Filter , Watch } ;
21
21
use lightning:: ln:: channelmanager;
22
22
use lightning:: ln:: channelmanager:: {
23
23
ChainParameters , ChannelManagerReadArgs , SimpleArcChannelManager ,
@@ -458,7 +458,12 @@ async fn start_ldk() {
458
458
// Step 7: Read ChannelMonitor state from disk
459
459
let mut channelmonitors = persister. read_channelmonitors ( keys_manager. clone ( ) ) . unwrap ( ) ;
460
460
461
- // Step 8: Initialize the ChannelManager
461
+ // Step 8: Poll for the best chain tip, which may be used by the channel manager & spv client
462
+ let polled_chain_tip = init:: validate_best_block_header ( bitcoind_client. as_ref ( ) )
463
+ . await
464
+ . expect ( "Failed to fetch best block header and best block" ) ;
465
+
466
+ // Step 9: Initialize the ChannelManager
462
467
let mut user_config = UserConfig :: default ( ) ;
463
468
user_config. channel_handshake_limits . force_announced_channel_preference = false ;
464
469
let mut restarting_node = true ;
@@ -481,15 +486,11 @@ async fn start_ldk() {
481
486
} else {
482
487
// We're starting a fresh node.
483
488
restarting_node = false ;
484
- let getinfo_resp = bitcoind_client. get_blockchain_info ( ) . await ;
485
-
486
- let chain_params = ChainParameters {
487
- network : args. network ,
488
- best_block : BestBlock :: new (
489
- getinfo_resp. latest_blockhash ,
490
- getinfo_resp. latest_height as u32 ,
491
- ) ,
492
- } ;
489
+
490
+ let polled_best_block = polled_chain_tip. to_best_block ( ) ;
491
+ let polled_best_block_hash = polled_best_block. block_hash ( ) ;
492
+ let chain_params =
493
+ ChainParameters { network : args. network , best_block : polled_best_block } ;
493
494
let fresh_channel_manager = channelmanager:: ChannelManager :: new (
494
495
fee_estimator. clone ( ) ,
495
496
chain_monitor. clone ( ) ,
@@ -499,15 +500,14 @@ async fn start_ldk() {
499
500
user_config,
500
501
chain_params,
501
502
) ;
502
- ( getinfo_resp . latest_blockhash , fresh_channel_manager)
503
+ ( polled_best_block_hash , fresh_channel_manager)
503
504
}
504
505
} ;
505
506
506
- // Step 9 : Sync ChannelMonitors and ChannelManager to chain tip
507
+ // Step 10 : Sync ChannelMonitors and ChannelManager to chain tip
507
508
let mut chain_listener_channel_monitors = Vec :: new ( ) ;
508
509
let mut cache = UnboundedCache :: new ( ) ;
509
- let mut chain_tip: Option < poll:: ValidatedBlockHeader > = None ;
510
- if restarting_node {
510
+ let chain_tip = if restarting_node {
511
511
let mut chain_listeners = vec ! [ (
512
512
channel_manager_blockhash,
513
513
& channel_manager as & ( dyn chain:: Listen + Send + Sync ) ,
@@ -528,19 +528,20 @@ async fn start_ldk() {
528
528
& monitor_listener_info. 1 as & ( dyn chain:: Listen + Send + Sync ) ,
529
529
) ) ;
530
530
}
531
- chain_tip = Some (
532
- init:: synchronize_listeners (
533
- bitcoind_client. as_ref ( ) ,
534
- args. network ,
535
- & mut cache,
536
- chain_listeners,
537
- )
538
- . await
539
- . unwrap ( ) ,
540
- ) ;
541
- }
542
531
543
- // Step 10: Give ChannelMonitors to ChainMonitor
532
+ init:: synchronize_listeners (
533
+ bitcoind_client. as_ref ( ) ,
534
+ args. network ,
535
+ & mut cache,
536
+ chain_listeners,
537
+ )
538
+ . await
539
+ . unwrap ( )
540
+ } else {
541
+ polled_chain_tip
542
+ } ;
543
+
544
+ // Step 11: Give ChannelMonitors to ChainMonitor
544
545
for item in chain_listener_channel_monitors. drain ( ..) {
545
546
let channel_monitor = item. 1 . 0 ;
546
547
let funding_outpoint = item. 2 ;
@@ -550,7 +551,7 @@ async fn start_ldk() {
550
551
) ;
551
552
}
552
553
553
- // Step 11 : Optional: Initialize the P2PGossipSync
554
+ // Step 12 : Optional: Initialize the P2PGossipSync
554
555
let genesis = genesis_block ( args. network ) . header . block_hash ( ) ;
555
556
let network_graph_path = format ! ( "{}/network_graph" , ldk_data_dir. clone( ) ) ;
556
557
let network_graph =
@@ -561,7 +562,7 @@ async fn start_ldk() {
561
562
logger. clone ( ) ,
562
563
) ) ;
563
564
564
- // Step 12 : Initialize the PeerManager
565
+ // Step 13 : Initialize the PeerManager
565
566
let channel_manager: Arc < ChannelManager > = Arc :: new ( channel_manager) ;
566
567
let onion_messenger: Arc < OnionMessenger > = Arc :: new ( OnionMessenger :: new (
567
568
Arc :: clone ( & keys_manager) ,
@@ -586,7 +587,7 @@ async fn start_ldk() {
586
587
) ) ;
587
588
588
589
// ## Running LDK
589
- // Step 13 : Initialize networking
590
+ // Step 14 : Initialize networking
590
591
591
592
let peer_manager_connection_handler = peer_manager. clone ( ) ;
592
593
let listening_port = args. ldk_peer_listening_port ;
@@ -612,26 +613,22 @@ async fn start_ldk() {
612
613
}
613
614
} ) ;
614
615
615
- // Step 14: Connect and Disconnect Blocks
616
- if chain_tip. is_none ( ) {
617
- chain_tip = Some ( init:: validate_best_block_header ( bitcoind_client. as_ref ( ) ) . await . unwrap ( ) ) ;
618
- }
616
+ // Step 15: Connect and Disconnect Blocks
619
617
let channel_manager_listener = channel_manager. clone ( ) ;
620
618
let chain_monitor_listener = chain_monitor. clone ( ) ;
621
619
let bitcoind_block_source = bitcoind_client. clone ( ) ;
622
620
let network = args. network ;
623
621
tokio:: spawn ( async move {
624
622
let chain_poller = poll:: ChainPoller :: new ( bitcoind_block_source. as_ref ( ) , network) ;
625
623
let chain_listener = ( chain_monitor_listener, channel_manager_listener) ;
626
- let mut spv_client =
627
- SpvClient :: new ( chain_tip. unwrap ( ) , chain_poller, & mut cache, & chain_listener) ;
624
+ let mut spv_client = SpvClient :: new ( chain_tip, chain_poller, & mut cache, & chain_listener) ;
628
625
loop {
629
626
spv_client. poll_best_tip ( ) . await . unwrap ( ) ;
630
627
tokio:: time:: sleep ( Duration :: from_secs ( 1 ) ) . await ;
631
628
}
632
629
} ) ;
633
630
634
- // Step 15 : Handle LDK Events
631
+ // Step 16 : Handle LDK Events
635
632
let channel_manager_event_listener = channel_manager. clone ( ) ;
636
633
let keys_manager_listener = keys_manager. clone ( ) ;
637
634
// TODO: persist payment info to disk
@@ -656,15 +653,15 @@ async fn start_ldk() {
656
653
) ) ;
657
654
} ;
658
655
659
- // Step 16 : Initialize routing ProbabilisticScorer
656
+ // Step 17 : Initialize routing ProbabilisticScorer
660
657
let scorer_path = format ! ( "{}/scorer" , ldk_data_dir. clone( ) ) ;
661
658
let scorer = Arc :: new ( Mutex :: new ( disk:: read_scorer (
662
659
Path :: new ( & scorer_path) ,
663
660
Arc :: clone ( & network_graph) ,
664
661
Arc :: clone ( & logger) ,
665
662
) ) ) ;
666
663
667
- // Step 17 : Create InvoicePayer
664
+ // Step 18 : Create InvoicePayer
668
665
let router = DefaultRouter :: new (
669
666
network_graph. clone ( ) ,
670
667
logger. clone ( ) ,
@@ -679,10 +676,10 @@ async fn start_ldk() {
679
676
payment:: Retry :: Timeout ( Duration :: from_secs ( 10 ) ) ,
680
677
) ) ;
681
678
682
- // Step 18 : Persist ChannelManager and NetworkGraph
679
+ // Step 19 : Persist ChannelManager and NetworkGraph
683
680
let persister = Arc :: new ( FilesystemPersister :: new ( ldk_data_dir. clone ( ) ) ) ;
684
681
685
- // Step 19 : Background Processing
682
+ // Step 20 : Background Processing
686
683
let background_processor = BackgroundProcessor :: start (
687
684
persister,
688
685
invoice_payer. clone ( ) ,
0 commit comments