@@ -250,16 +250,21 @@ impl NodeBuilder {
250
250
pub fn build_with_store < K : KVStore + Sync + Send + ' static > (
251
251
& self , kv_store : Arc < K > ,
252
252
) -> Result < Node < K > , BuildError > {
253
+ let logger = setup_logger ( & self . config ) ?;
254
+ let seed_bytes = seed_bytes_from_config (
255
+ & self . config ,
256
+ self . entropy_source_config . as_ref ( ) ,
257
+ Arc :: clone ( & logger) ,
258
+ ) ?;
253
259
let config = Arc :: new ( self . config . clone ( ) ) ;
254
260
255
- let runtime = Arc :: new ( RwLock :: new ( None ) ) ;
256
261
build_with_store_internal (
257
262
config,
258
- self . entropy_source_config . as_ref ( ) ,
259
263
self . chain_data_source_config . as_ref ( ) ,
260
264
self . gossip_source_config . as_ref ( ) ,
265
+ seed_bytes,
266
+ logger,
261
267
kv_store,
262
- runtime,
263
268
)
264
269
}
265
270
}
@@ -377,57 +382,27 @@ impl ArcedNodeBuilder {
377
382
378
383
/// Builds a [`Node`] instance according to the options previously configured.
379
384
fn build_with_store_internal < K : KVStore + Sync + Send + ' static > (
380
- config : Arc < Config > , entropy_source_config : Option < & EntropySourceConfig > ,
381
- chain_data_source_config : Option < & ChainDataSourceConfig > ,
382
- gossip_source_config : Option < & GossipSourceConfig > , kv_store : Arc < K > ,
383
- runtime : Arc < RwLock < Option < tokio:: runtime:: Runtime > > > ,
385
+ config : Arc < Config > , chain_data_source_config : Option < & ChainDataSourceConfig > ,
386
+ gossip_source_config : Option < & GossipSourceConfig > , seed_bytes : [ u8 ; 64 ] ,
387
+ logger : Arc < FilesystemLogger > , kv_store : Arc < K > ,
384
388
) -> Result < Node < K > , BuildError > {
385
- let ldk_data_dir = format ! ( "{}/ldk" , config. storage_dir_path) ;
386
- fs:: create_dir_all ( ldk_data_dir. clone ( ) ) . map_err ( |_| BuildError :: StoragePathAccessFailed ) ?;
387
-
388
- let bdk_data_dir = format ! ( "{}/bdk" , config. storage_dir_path) ;
389
- fs:: create_dir_all ( bdk_data_dir. clone ( ) ) . map_err ( |_| BuildError :: StoragePathAccessFailed ) ?;
390
-
391
- let log_dir = match & config. log_dir_path {
392
- Some ( log_dir) => String :: from ( log_dir) ,
393
- None => config. storage_dir_path . clone ( ) + "/logs" ,
394
- } ;
395
-
396
- // Initialize the Logger
397
- let logger = Arc :: new (
398
- FilesystemLogger :: new ( log_dir, config. log_level )
399
- . map_err ( |_| BuildError :: LoggerSetupFailed ) ?,
400
- ) ;
401
-
402
389
// Initialize the on-chain wallet and chain access
403
- let seed_bytes = match entropy_source_config {
404
- Some ( EntropySourceConfig :: SeedBytes ( bytes) ) => bytes. clone ( ) ,
405
- Some ( EntropySourceConfig :: SeedFile ( seed_path) ) => {
406
- io:: utils:: read_or_generate_seed_file ( seed_path, Arc :: clone ( & logger) )
407
- . map_err ( |_| BuildError :: InvalidSeedFile ) ?
408
- }
409
- Some ( EntropySourceConfig :: Bip39Mnemonic { mnemonic, passphrase } ) => match passphrase {
410
- Some ( passphrase) => mnemonic. to_seed ( passphrase) ,
411
- None => mnemonic. to_seed ( "" ) ,
412
- } ,
413
- None => {
414
- // Default to read or generate from the default location generate a seed file.
415
- let seed_path = format ! ( "{}/keys_seed" , config. storage_dir_path) ;
416
- io:: utils:: read_or_generate_seed_file ( & seed_path, Arc :: clone ( & logger) )
417
- . map_err ( |_| BuildError :: InvalidSeedFile ) ?
418
- }
419
- } ;
420
-
421
390
let xprv = bitcoin:: util:: bip32:: ExtendedPrivKey :: new_master ( config. network , & seed_bytes)
422
- . map_err ( |_| BuildError :: InvalidSeedBytes ) ?;
391
+ . map_err ( |e| {
392
+ log_error ! ( logger, "Failed to derive master secret: {}" , e) ;
393
+ BuildError :: InvalidSeedBytes
394
+ } ) ?;
423
395
424
396
let wallet_name = bdk:: wallet:: wallet_name_from_descriptor (
425
397
Bip84 ( xprv, bdk:: KeychainKind :: External ) ,
426
398
Some ( Bip84 ( xprv, bdk:: KeychainKind :: Internal ) ) ,
427
399
config. network ,
428
400
& Secp256k1 :: new ( ) ,
429
401
)
430
- . map_err ( |_| BuildError :: WalletSetupFailed ) ?;
402
+ . map_err ( |e| {
403
+ log_error ! ( logger, "Failed to derive wallet name: {}" , e) ;
404
+ BuildError :: WalletSetupFailed
405
+ } ) ?;
431
406
432
407
let database_path = format ! ( "{}/bdk_wallet_{}.sqlite" , config. storage_dir_path, wallet_name) ;
433
408
let database = SqliteDatabase :: new ( database_path) ;
@@ -438,7 +413,10 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
438
413
config. network ,
439
414
database,
440
415
)
441
- . map_err ( |_| BuildError :: WalletSetupFailed ) ?;
416
+ . map_err ( |e| {
417
+ log_error ! ( logger, "Failed to set up wallet: {}" , e) ;
418
+ BuildError :: WalletSetupFailed
419
+ } ) ?;
442
420
443
421
let ( blockchain, tx_sync) = match chain_data_source_config {
444
422
Some ( ChainDataSourceConfig :: Esplora ( server_url) ) => {
@@ -459,6 +437,7 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
459
437
}
460
438
} ;
461
439
440
+ let runtime = Arc :: new ( RwLock :: new ( None ) ) ;
462
441
let wallet =
463
442
Arc :: new ( Wallet :: new ( blockchain, bdk_wallet, Arc :: clone ( & runtime) , Arc :: clone ( & logger) ) ) ;
464
443
@@ -472,9 +451,11 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
472
451
) ) ;
473
452
474
453
// Initialize the KeysManager
475
- let cur_time = SystemTime :: now ( )
476
- . duration_since ( SystemTime :: UNIX_EPOCH )
477
- . map_err ( |_| BuildError :: InvalidSystemTime ) ?;
454
+ let cur_time = SystemTime :: now ( ) . duration_since ( SystemTime :: UNIX_EPOCH ) . map_err ( |e| {
455
+ log_error ! ( logger, "Failed to get current time: {}" , e) ;
456
+ BuildError :: InvalidSystemTime
457
+ } ) ?;
458
+
478
459
let ldk_seed_bytes: [ u8 ; 32 ] = xprv. private_key . secret_bytes ( ) ;
479
460
let keys_manager = Arc :: new ( KeysManager :: new (
480
461
& ldk_seed_bytes,
@@ -615,10 +596,6 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
615
596
) ) ;
616
597
let ephemeral_bytes: [ u8 ; 32 ] = keys_manager. get_secure_random_bytes ( ) ;
617
598
618
- let cur_time = SystemTime :: now ( )
619
- . duration_since ( SystemTime :: UNIX_EPOCH )
620
- . map_err ( |_| BuildError :: InvalidSystemTime ) ?;
621
-
622
599
// Initialize the GossipSource
623
600
// Use the configured gossip source, if the user set one, otherwise default to P2PNetwork.
624
601
let gossip_source_config = gossip_source_config. unwrap_or ( & GossipSourceConfig :: P2PNetwork ) ;
@@ -634,7 +611,10 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
634
611
Arc :: clone ( & kv_store) ,
635
612
Arc :: clone ( & logger) ,
636
613
)
637
- . map_err ( |_| BuildError :: WriteFailed ) ?;
614
+ . map_err ( |e| {
615
+ log_error ! ( logger, "Failed writing to store: {}" , e) ;
616
+ BuildError :: WriteFailed
617
+ } ) ?;
638
618
p2p_source
639
619
}
640
620
GossipSourceConfig :: RapidGossipSync ( rgs_server) => {
@@ -670,9 +650,17 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
670
650
}
671
651
} ;
672
652
653
+ let cur_time = SystemTime :: now ( ) . duration_since ( SystemTime :: UNIX_EPOCH ) . map_err ( |e| {
654
+ log_error ! ( logger, "Failed to get current time: {}" , e) ;
655
+ BuildError :: InvalidSystemTime
656
+ } ) ?;
657
+
673
658
let peer_manager = Arc :: new ( PeerManager :: new (
674
659
msg_handler,
675
- cur_time. as_secs ( ) . try_into ( ) . map_err ( |_| BuildError :: InvalidSystemTime ) ?,
660
+ cur_time. as_secs ( ) . try_into ( ) . map_err ( |e| {
661
+ log_error ! ( logger, "Failed to get current time: {}" , e) ;
662
+ BuildError :: InvalidSystemTime
663
+ } ) ?,
676
664
& ephemeral_bytes,
677
665
Arc :: clone ( & logger) ,
678
666
IgnoringMessageHandler { } ,
@@ -736,3 +724,38 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
736
724
payment_store,
737
725
} )
738
726
}
727
+
728
+ fn setup_logger ( config : & Config ) -> Result < Arc < FilesystemLogger > , BuildError > {
729
+ let log_dir = match & config. log_dir_path {
730
+ Some ( log_dir) => String :: from ( log_dir) ,
731
+ None => config. storage_dir_path . clone ( ) + "/logs" ,
732
+ } ;
733
+
734
+ Ok ( Arc :: new (
735
+ FilesystemLogger :: new ( log_dir, config. log_level )
736
+ . map_err ( |_| BuildError :: LoggerSetupFailed ) ?,
737
+ ) )
738
+ }
739
+
740
+ fn seed_bytes_from_config (
741
+ config : & Config , entropy_source_config : Option < & EntropySourceConfig > ,
742
+ logger : Arc < FilesystemLogger > ,
743
+ ) -> Result < [ u8 ; 64 ] , BuildError > {
744
+ match entropy_source_config {
745
+ Some ( EntropySourceConfig :: SeedBytes ( bytes) ) => Ok ( bytes. clone ( ) ) ,
746
+ Some ( EntropySourceConfig :: SeedFile ( seed_path) ) => {
747
+ Ok ( io:: utils:: read_or_generate_seed_file ( & seed_path, Arc :: clone ( & logger) )
748
+ . map_err ( |_| BuildError :: InvalidSeedFile ) ?)
749
+ }
750
+ Some ( EntropySourceConfig :: Bip39Mnemonic { mnemonic, passphrase } ) => match passphrase {
751
+ Some ( passphrase) => Ok ( mnemonic. to_seed ( passphrase) ) ,
752
+ None => Ok ( mnemonic. to_seed ( "" ) ) ,
753
+ } ,
754
+ None => {
755
+ // Default to read or generate from the default location generate a seed file.
756
+ let seed_path = format ! ( "{}/keys_seed" , config. storage_dir_path) ;
757
+ Ok ( io:: utils:: read_or_generate_seed_file ( & seed_path, Arc :: clone ( & logger) )
758
+ . map_err ( |_| BuildError :: InvalidSeedFile ) ?)
759
+ }
760
+ }
761
+ }
0 commit comments