diff --git a/src/bucketd/processor.rs b/src/bucketd/processor.rs index 12751929..8d918bf5 100644 --- a/src/bucketd/processor.rs +++ b/src/bucketd/processor.rs @@ -14,7 +14,6 @@ use std::io::Write; use bitcoin::{OutPoint, Txid}; use commit_verify::{lnpbp4, CommitConceal, TaggedHash}; -use electrum_client::{Client as ElectrumClient, ConfigBuilder}; use psbt::Psbt; use rgb::psbt::RgbExt; use rgb::schema::{OwnedRightType, TransitionType}; @@ -35,8 +34,6 @@ use crate::amplify::Wrapper; use crate::db::{self, StoreRpcExt}; use crate::DaemonError; -const ELECTRUM_TIMEOUT: u8 = 4; - #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display, Error, From)] #[display(doc_comments)] pub enum StashError { @@ -130,15 +127,6 @@ pub enum FinalizeError { } impl Runtime { - fn _new_electrum_client(&self) -> Result { - let electrum_config = ConfigBuilder::new() - .timeout(Some(ELECTRUM_TIMEOUT)) - .expect("cannot fail since socks5 is unset") - .build(); - ElectrumClient::from_config(&self.electrum_url, electrum_config) - .map_err(|e| DaemonError::ElectrumConnectivity(e.to_string())) - } - /// Processes incoming transfer downloaded as a container locally pub(super) fn process_container( &mut self, @@ -189,7 +177,7 @@ impl Runtime { trace!("Starting with contract state {:?}", state); debug!("Validating consignment {} for contract {}", id, contract_id); - let status = Validator::validate(&consignment, &self._new_electrum_client()?); + let status = Validator::validate(&consignment, &self.electrum); info!("Consignment validation result is {}", status.validity()); match status.validity() { diff --git a/src/bucketd/service.rs b/src/bucketd/service.rs index 94d304e9..1553be55 100644 --- a/src/bucketd/service.rs +++ b/src/bucketd/service.rs @@ -17,6 +17,7 @@ use amplify::num::u24; use bitcoin::secp256k1::rand::random; use bitcoin::{OutPoint, Txid}; use commit_verify::ConsensusCommit; +use electrum_client::{Client as ElectrumClient, ConfigBuilder}; use internet2::addr::NodeAddr; use internet2::ZmqSocketType; use microservices::error::BootstrapError; @@ -45,6 +46,8 @@ use crate::bus::{ }; use crate::{Config, DaemonError, LaunchError}; +const ELECTRUM_TIMEOUT: u8 = 4; + pub fn run(config: Config) -> Result<(), BootstrapError> { let storm_endpoint = config.storm_endpoint.clone(); let rpc_endpoint = config.rpc_endpoint.clone(); @@ -82,7 +85,7 @@ pub fn run(config: Config) -> Result<(), BootstrapError> { pub struct Runtime { id: DaemonId, - pub(crate) electrum_url: String, + pub(crate) electrum: ElectrumClient, pub(crate) store: store_rpc::Client, } @@ -95,12 +98,19 @@ impl Runtime { let id = random(); + let electrum_config = ConfigBuilder::new() + .timeout(Some(ELECTRUM_TIMEOUT)) + .expect("cannot fail since socks5 is unset") + .build(); + let electrum = ElectrumClient::from_config(&config.electrum_url, electrum_config) + .map_err(|e| LaunchError::ElectrumConnectivity(e.to_string()))?; + info!("Bucket runtime started successfully"); Ok(Self { id, store, - electrum_url: config.electrum_url, + electrum, }) } } diff --git a/src/error.rs b/src/error.rs index 997f8e9e..b33ebe5e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -29,8 +29,8 @@ pub enum LaunchError { #[from] StoreConnection(ServerError), - /// can't connect to electrum server - ElectrumConnectivity, + /// electrum connectivity error. Details: {0} + ElectrumConnectivity(String), } impl microservices::error::Error for LaunchError {} @@ -71,9 +71,6 @@ pub(crate) enum DaemonError { #[from(bp::dbc::anchor::Error)] Finalize(FinalizeError), - /// electrum connectivity error. Details: {0} - ElectrumConnectivity(String), - /// the container which was requested to be processed is absent in sthe store NoContainer(ContainerId), @@ -101,7 +98,6 @@ impl From for RpcMsg { DaemonError::BucketLauncher(_) => FailureCode::Launcher, DaemonError::Stash(_) => FailureCode::Stash, DaemonError::Finalize(_) => FailureCode::Finalize, - DaemonError::ElectrumConnectivity(_) => FailureCode::ElectrumConnectivity, DaemonError::NoContainer(_) => FailureCode::Store, }; RpcMsg::Failure(rpc::Failure {