5
5
// http://opensource.org/licenses/MIT>, at your option. You may not use this file except in
6
6
// accordance with one or both of these licenses.
7
7
8
- use crate :: config:: {
9
- default_user_config, Config , DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS , DEFAULT_ESPLORA_SERVER_URL ,
10
- WALLET_KEYS_SEED_LEN ,
11
- } ;
8
+ use crate :: chain:: { ChainSource , DEFAULT_ESPLORA_SERVER_URL } ;
9
+ use crate :: config:: { default_user_config, Config , EsploraSyncConfig , WALLET_KEYS_SEED_LEN } ;
10
+
12
11
use crate :: connection:: ConnectionManager ;
13
12
use crate :: event:: EventQueue ;
14
13
use crate :: fee_estimator:: OnchainFeeEstimator ;
15
14
use crate :: gossip:: GossipSource ;
16
- use crate :: io;
17
15
use crate :: io:: sqlite_store:: SqliteStore ;
16
+ use crate :: io:: utils:: { read_node_metrics, write_node_metrics} ;
18
17
#[ cfg( any( vss, vss_test) ) ]
19
18
use crate :: io:: vss_store:: VssStore ;
20
19
use crate :: liquidity:: LiquiditySource ;
@@ -29,6 +28,7 @@ use crate::types::{
29
28
} ;
30
29
use crate :: wallet:: persist:: KVStoreWalletPersister ;
31
30
use crate :: wallet:: Wallet ;
31
+ use crate :: { io, NodeMetrics } ;
32
32
use crate :: { LogLevel , Node } ;
33
33
34
34
use lightning:: chain:: { chainmonitor, BestBlock , Watch } ;
@@ -52,8 +52,6 @@ use lightning::util::sweep::OutputSweeper;
52
52
53
53
use lightning_persister:: fs_store:: FilesystemStore ;
54
54
55
- use lightning_transaction_sync:: EsploraSyncClient ;
56
-
57
55
use lightning_liquidity:: lsps2:: client:: LSPS2ClientConfig ;
58
56
use lightning_liquidity:: { LiquidityClientConfig , LiquidityManager } ;
59
57
@@ -79,7 +77,7 @@ use std::time::SystemTime;
79
77
80
78
#[ derive( Debug , Clone ) ]
81
79
enum ChainDataSourceConfig {
82
- Esplora ( String ) ,
80
+ Esplora { server_url : String , sync_config : Option < EsploraSyncConfig > } ,
83
81
}
84
82
85
83
#[ derive( Debug , Clone ) ]
@@ -239,8 +237,14 @@ impl NodeBuilder {
239
237
}
240
238
241
239
/// Configures the [`Node`] instance to source its chain data from the given Esplora server.
242
- pub fn set_esplora_server ( & mut self , esplora_server_url : String ) -> & mut Self {
243
- self . chain_data_source_config = Some ( ChainDataSourceConfig :: Esplora ( esplora_server_url) ) ;
240
+ ///
241
+ /// If no `sync_config` is given, default values are used. See [`EsploraSyncConfig`] for more
242
+ /// information.
243
+ pub fn set_chain_source_esplora (
244
+ & mut self , server_url : String , sync_config : Option < EsploraSyncConfig > ,
245
+ ) -> & mut Self {
246
+ self . chain_data_source_config =
247
+ Some ( ChainDataSourceConfig :: Esplora { server_url, sync_config } ) ;
244
248
self
245
249
}
246
250
@@ -466,8 +470,13 @@ impl ArcedNodeBuilder {
466
470
}
467
471
468
472
/// Configures the [`Node`] instance to source its chain data from the given Esplora server.
469
- pub fn set_esplora_server ( & self , esplora_server_url : String ) {
470
- self . inner . write ( ) . unwrap ( ) . set_esplora_server ( esplora_server_url) ;
473
+ ///
474
+ /// If no `sync_config` is given, default values are used. See [`EsploraSyncConfig`] for more
475
+ /// information.
476
+ pub fn set_chain_source_esplora (
477
+ & self , server_url : String , sync_config : Option < EsploraSyncConfig > ,
478
+ ) {
479
+ self . inner . write ( ) . unwrap ( ) . set_chain_source_esplora ( server_url, sync_config) ;
471
480
}
472
481
473
482
/// Configures the [`Node`] instance to source its gossip data from the Lightning peer-to-peer
@@ -555,6 +564,19 @@ fn build_with_store_internal(
555
564
liquidity_source_config : Option < & LiquiditySourceConfig > , seed_bytes : [ u8 ; 64 ] ,
556
565
logger : Arc < FilesystemLogger > , kv_store : Arc < DynStore > ,
557
566
) -> Result < Node , BuildError > {
567
+ // Initialize the status fields.
568
+ let is_listening = Arc :: new ( AtomicBool :: new ( false ) ) ;
569
+ let node_metrics = match read_node_metrics ( Arc :: clone ( & kv_store) , Arc :: clone ( & logger) ) {
570
+ Ok ( metrics) => Arc :: new ( RwLock :: new ( metrics) ) ,
571
+ Err ( e) => {
572
+ if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
573
+ Arc :: new ( RwLock :: new ( NodeMetrics :: default ( ) ) )
574
+ } else {
575
+ return Err ( BuildError :: ReadFailed ) ;
576
+ }
577
+ } ,
578
+ } ;
579
+
558
580
// Initialize the on-chain wallet and chain access
559
581
let xprv = bitcoin:: bip32:: Xpriv :: new_master ( config. network , & seed_bytes) . map_err ( |e| {
560
582
log_error ! ( logger, "Failed to derive master secret: {}" , e) ;
@@ -586,62 +608,54 @@ fn build_with_store_internal(
586
608
} ) ?,
587
609
} ;
588
610
589
- let ( esplora_client, tx_sync, tx_broadcaster, fee_estimator) = match chain_data_source_config {
590
- Some ( ChainDataSourceConfig :: Esplora ( server_url) ) => {
591
- let mut client_builder = esplora_client:: Builder :: new ( & server_url. clone ( ) ) ;
592
- client_builder = client_builder. timeout ( DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS ) ;
593
- let esplora_client = client_builder. build_async ( ) . unwrap ( ) ;
594
- let tx_sync = Arc :: new ( EsploraSyncClient :: from_client (
595
- esplora_client. clone ( ) ,
596
- Arc :: clone ( & logger) ,
597
- ) ) ;
598
- let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new (
599
- tx_sync. client ( ) . clone ( ) ,
600
- Arc :: clone ( & logger) ,
601
- ) ) ;
602
- let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new (
603
- tx_sync. client ( ) . clone ( ) ,
611
+ let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new ( Arc :: clone ( & logger) ) ) ;
612
+ let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new ( ) ) ;
613
+ let wallet = Arc :: new ( Wallet :: new (
614
+ bdk_wallet,
615
+ wallet_persister,
616
+ Arc :: clone ( & tx_broadcaster) ,
617
+ Arc :: clone ( & fee_estimator) ,
618
+ Arc :: clone ( & logger) ,
619
+ ) ) ;
620
+
621
+ let chain_source = match chain_data_source_config {
622
+ Some ( ChainDataSourceConfig :: Esplora { server_url, sync_config } ) => {
623
+ let sync_config = sync_config. unwrap_or ( EsploraSyncConfig :: default ( ) ) ;
624
+ Arc :: new ( ChainSource :: new_esplora (
625
+ server_url. clone ( ) ,
626
+ sync_config,
627
+ Arc :: clone ( & wallet) ,
628
+ Arc :: clone ( & fee_estimator) ,
629
+ Arc :: clone ( & tx_broadcaster) ,
630
+ Arc :: clone ( & kv_store) ,
604
631
Arc :: clone ( & config) ,
605
632
Arc :: clone ( & logger) ,
606
- ) ) ;
607
- ( esplora_client , tx_sync , tx_broadcaster , fee_estimator )
633
+ Arc :: clone ( & node_metrics ) ,
634
+ ) )
608
635
} ,
609
636
None => {
610
637
// Default to Esplora client.
611
638
let server_url = DEFAULT_ESPLORA_SERVER_URL . to_string ( ) ;
612
- let mut client_builder = esplora_client:: Builder :: new ( & server_url) ;
613
- client_builder = client_builder. timeout ( DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS ) ;
614
- let esplora_client = client_builder. build_async ( ) . unwrap ( ) ;
615
- let tx_sync = Arc :: new ( EsploraSyncClient :: from_client (
616
- esplora_client. clone ( ) ,
617
- Arc :: clone ( & logger) ,
618
- ) ) ;
619
- let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new (
620
- tx_sync. client ( ) . clone ( ) ,
621
- Arc :: clone ( & logger) ,
622
- ) ) ;
623
- let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new (
624
- tx_sync. client ( ) . clone ( ) ,
639
+ let sync_config = EsploraSyncConfig :: default ( ) ;
640
+ Arc :: new ( ChainSource :: new_esplora (
641
+ server_url. clone ( ) ,
642
+ sync_config,
643
+ Arc :: clone ( & wallet) ,
644
+ Arc :: clone ( & fee_estimator) ,
645
+ Arc :: clone ( & tx_broadcaster) ,
646
+ Arc :: clone ( & kv_store) ,
625
647
Arc :: clone ( & config) ,
626
648
Arc :: clone ( & logger) ,
627
- ) ) ;
628
- ( esplora_client , tx_sync , tx_broadcaster , fee_estimator )
649
+ Arc :: clone ( & node_metrics ) ,
650
+ ) )
629
651
} ,
630
652
} ;
631
653
632
654
let runtime = Arc :: new ( RwLock :: new ( None ) ) ;
633
- let wallet = Arc :: new ( Wallet :: new (
634
- bdk_wallet,
635
- wallet_persister,
636
- esplora_client,
637
- Arc :: clone ( & tx_broadcaster) ,
638
- Arc :: clone ( & fee_estimator) ,
639
- Arc :: clone ( & logger) ,
640
- ) ) ;
641
655
642
656
// Initialize the ChainMonitor
643
657
let chain_monitor: Arc < ChainMonitor > = Arc :: new ( chainmonitor:: ChainMonitor :: new (
644
- Some ( Arc :: clone ( & tx_sync ) ) ,
658
+ Some ( Arc :: clone ( & chain_source ) ) ,
645
659
Arc :: clone ( & tx_broadcaster) ,
646
660
Arc :: clone ( & logger) ,
647
661
Arc :: clone ( & fee_estimator) ,
@@ -824,23 +838,24 @@ fn build_with_store_internal(
824
838
Arc :: new ( GossipSource :: new_p2p ( Arc :: clone ( & network_graph) , Arc :: clone ( & logger) ) ) ;
825
839
826
840
// Reset the RGS sync timestamp in case we somehow switch gossip sources
827
- io:: utils:: write_latest_rgs_sync_timestamp (
828
- 0 ,
829
- Arc :: clone ( & kv_store) ,
830
- Arc :: clone ( & logger) ,
831
- )
832
- . map_err ( |e| {
833
- log_error ! ( logger, "Failed writing to store: {}" , e) ;
834
- BuildError :: WriteFailed
835
- } ) ?;
841
+ {
842
+ let mut locked_node_metrics = node_metrics. write ( ) . unwrap ( ) ;
843
+ locked_node_metrics. latest_rgs_snapshot_timestamp = None ;
844
+ write_node_metrics (
845
+ & * locked_node_metrics,
846
+ Arc :: clone ( & kv_store) ,
847
+ Arc :: clone ( & logger) ,
848
+ )
849
+ . map_err ( |e| {
850
+ log_error ! ( logger, "Failed writing to store: {}" , e) ;
851
+ BuildError :: WriteFailed
852
+ } ) ?;
853
+ }
836
854
p2p_source
837
855
} ,
838
856
GossipSourceConfig :: RapidGossipSync ( rgs_server) => {
839
- let latest_sync_timestamp = io:: utils:: read_latest_rgs_sync_timestamp (
840
- Arc :: clone ( & kv_store) ,
841
- Arc :: clone ( & logger) ,
842
- )
843
- . unwrap_or ( 0 ) ;
857
+ let latest_sync_timestamp =
858
+ node_metrics. read ( ) . unwrap ( ) . latest_rgs_snapshot_timestamp . unwrap_or ( 0 ) ;
844
859
Arc :: new ( GossipSource :: new_rgs (
845
860
rgs_server. clone ( ) ,
846
861
latest_sync_timestamp,
@@ -857,7 +872,7 @@ fn build_with_store_internal(
857
872
let liquidity_manager = Arc :: new ( LiquidityManager :: new (
858
873
Arc :: clone ( & keys_manager) ,
859
874
Arc :: clone ( & channel_manager) ,
860
- Some ( Arc :: clone ( & tx_sync ) ) ,
875
+ Some ( Arc :: clone ( & chain_source ) ) ,
861
876
None ,
862
877
None ,
863
878
liquidity_client_config,
@@ -925,7 +940,7 @@ fn build_with_store_internal(
925
940
let output_sweeper = match io:: utils:: read_output_sweeper (
926
941
Arc :: clone ( & tx_broadcaster) ,
927
942
Arc :: clone ( & fee_estimator) ,
928
- Arc :: clone ( & tx_sync ) ,
943
+ Arc :: clone ( & chain_source ) ,
929
944
Arc :: clone ( & keys_manager) ,
930
945
Arc :: clone ( & kv_store) ,
931
946
Arc :: clone ( & logger) ,
@@ -937,7 +952,7 @@ fn build_with_store_internal(
937
952
channel_manager. current_best_block ( ) ,
938
953
Arc :: clone ( & tx_broadcaster) ,
939
954
Arc :: clone ( & fee_estimator) ,
940
- Some ( Arc :: clone ( & tx_sync ) ) ,
955
+ Some ( Arc :: clone ( & chain_source ) ) ,
941
956
Arc :: clone ( & keys_manager) ,
942
957
Arc :: clone ( & keys_manager) ,
943
958
Arc :: clone ( & kv_store) ,
@@ -999,23 +1014,14 @@ fn build_with_store_internal(
999
1014
let ( stop_sender, _) = tokio:: sync:: watch:: channel ( ( ) ) ;
1000
1015
let ( event_handling_stopped_sender, _) = tokio:: sync:: watch:: channel ( ( ) ) ;
1001
1016
1002
- let is_listening = Arc :: new ( AtomicBool :: new ( false ) ) ;
1003
- let latest_wallet_sync_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
1004
- let latest_onchain_wallet_sync_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
1005
- let latest_fee_rate_cache_update_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
1006
- let latest_rgs_snapshot_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
1007
- let latest_node_announcement_broadcast_timestamp = Arc :: new ( RwLock :: new ( None ) ) ;
1008
- let latest_channel_monitor_archival_height = Arc :: new ( RwLock :: new ( None ) ) ;
1009
-
1010
1017
Ok ( Node {
1011
1018
runtime,
1012
1019
stop_sender,
1013
1020
event_handling_stopped_sender,
1014
1021
config,
1015
1022
wallet,
1016
- tx_sync ,
1023
+ chain_source ,
1017
1024
tx_broadcaster,
1018
- fee_estimator,
1019
1025
event_queue,
1020
1026
channel_manager,
1021
1027
chain_monitor,
@@ -1034,12 +1040,7 @@ fn build_with_store_internal(
1034
1040
peer_store,
1035
1041
payment_store,
1036
1042
is_listening,
1037
- latest_wallet_sync_timestamp,
1038
- latest_onchain_wallet_sync_timestamp,
1039
- latest_fee_rate_cache_update_timestamp,
1040
- latest_rgs_snapshot_timestamp,
1041
- latest_node_announcement_broadcast_timestamp,
1042
- latest_channel_monitor_archival_height,
1043
+ node_metrics,
1043
1044
} )
1044
1045
}
1045
1046
0 commit comments