@@ -250,16 +250,21 @@ impl NodeBuilder {
250250 pub fn build_with_store < K : KVStore + Sync + Send + ' static > (
251251 & self , kv_store : Arc < K > ,
252252 ) -> 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+ ) ?;
253259 let config = Arc :: new ( self . config . clone ( ) ) ;
254260
255- let runtime = Arc :: new ( RwLock :: new ( None ) ) ;
256261 build_with_store_internal (
257262 config,
258- self . entropy_source_config . as_ref ( ) ,
259263 self . chain_data_source_config . as_ref ( ) ,
260264 self . gossip_source_config . as_ref ( ) ,
265+ seed_bytes,
266+ logger,
261267 kv_store,
262- runtime,
263268 )
264269 }
265270}
@@ -377,57 +382,27 @@ impl ArcedNodeBuilder {
377382
378383/// Builds a [`Node`] instance according to the options previously configured.
379384fn 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 > ,
384388) -> 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-
402389 // 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-
421390 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+ } ) ?;
423395
424396 let wallet_name = bdk:: wallet:: wallet_name_from_descriptor (
425397 Bip84 ( xprv, bdk:: KeychainKind :: External ) ,
426398 Some ( Bip84 ( xprv, bdk:: KeychainKind :: Internal ) ) ,
427399 config. network ,
428400 & Secp256k1 :: new ( ) ,
429401 )
430- . map_err ( |_| BuildError :: WalletSetupFailed ) ?;
402+ . map_err ( |e| {
403+ log_error ! ( logger, "Failed to derive wallet name: {}" , e) ;
404+ BuildError :: WalletSetupFailed
405+ } ) ?;
431406
432407 let database_path = format ! ( "{}/bdk_wallet_{}.sqlite" , config. storage_dir_path, wallet_name) ;
433408 let database = SqliteDatabase :: new ( database_path) ;
@@ -438,7 +413,10 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
438413 config. network ,
439414 database,
440415 )
441- . map_err ( |_| BuildError :: WalletSetupFailed ) ?;
416+ . map_err ( |e| {
417+ log_error ! ( logger, "Failed to set up wallet: {}" , e) ;
418+ BuildError :: WalletSetupFailed
419+ } ) ?;
442420
443421 let ( blockchain, tx_sync) = match chain_data_source_config {
444422 Some ( ChainDataSourceConfig :: Esplora ( server_url) ) => {
@@ -459,6 +437,7 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
459437 }
460438 } ;
461439
440+ let runtime = Arc :: new ( RwLock :: new ( None ) ) ;
462441 let wallet =
463442 Arc :: new ( Wallet :: new ( blockchain, bdk_wallet, Arc :: clone ( & runtime) , Arc :: clone ( & logger) ) ) ;
464443
@@ -472,9 +451,11 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
472451 ) ) ;
473452
474453 // 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+
478459 let ldk_seed_bytes: [ u8 ; 32 ] = xprv. private_key . secret_bytes ( ) ;
479460 let keys_manager = Arc :: new ( KeysManager :: new (
480461 & ldk_seed_bytes,
@@ -615,10 +596,6 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
615596 ) ) ;
616597 let ephemeral_bytes: [ u8 ; 32 ] = keys_manager. get_secure_random_bytes ( ) ;
617598
618- let cur_time = SystemTime :: now ( )
619- . duration_since ( SystemTime :: UNIX_EPOCH )
620- . map_err ( |_| BuildError :: InvalidSystemTime ) ?;
621-
622599 // Initialize the GossipSource
623600 // Use the configured gossip source, if the user set one, otherwise default to P2PNetwork.
624601 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>(
634611 Arc :: clone ( & kv_store) ,
635612 Arc :: clone ( & logger) ,
636613 )
637- . map_err ( |_| BuildError :: WriteFailed ) ?;
614+ . map_err ( |e| {
615+ log_error ! ( logger, "Failed writing to store: {}" , e) ;
616+ BuildError :: WriteFailed
617+ } ) ?;
638618 p2p_source
639619 }
640620 GossipSourceConfig :: RapidGossipSync ( rgs_server) => {
@@ -670,9 +650,17 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
670650 }
671651 } ;
672652
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+
673658 let peer_manager = Arc :: new ( PeerManager :: new (
674659 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+ } ) ?,
676664 & ephemeral_bytes,
677665 Arc :: clone ( & logger) ,
678666 IgnoringMessageHandler { } ,
@@ -736,3 +724,38 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
736724 payment_store,
737725 } )
738726}
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