diff --git a/rpc/src/error.rs b/rpc/src/error.rs index 60533c20..2017f8c8 100644 --- a/rpc/src/error.rs +++ b/rpc/src/error.rs @@ -34,6 +34,8 @@ pub enum FailureCode { Finalize = 0x15, + ElectrumConnectivity = 0x16, + UnexpectedRequest = 0x80, /// Daemon launcher error diff --git a/src/bucketd/processor.rs b/src/bucketd/processor.rs index 056b5b40..752ea59b 100644 --- a/src/bucketd/processor.rs +++ b/src/bucketd/processor.rs @@ -14,6 +14,7 @@ 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}; @@ -34,6 +35,8 @@ 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 { @@ -127,6 +130,15 @@ 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, @@ -177,7 +189,7 @@ impl Runtime { trace!("Starting with contract state {:?}", state); debug!("Validating consignment {} for contract {}", id, contract_id); - let status = Validator::validate(&consignment, &self.electrum); + let status = Validator::validate(&consignment, &self._new_electrum_client()?); info!("Consignment validation result is {}", status.validity()); match status.validity() { diff --git a/src/bucketd/service.rs b/src/bucketd/service.rs index 18f2c9e3..44981533 100644 --- a/src/bucketd/service.rs +++ b/src/bucketd/service.rs @@ -17,7 +17,6 @@ use amplify::num::u24; use bitcoin::secp256k1::rand::random; use bitcoin::{OutPoint, Txid}; use commit_verify::ConsensusCommit; -use electrum_client::Client as ElectrumClient; use internet2::addr::NodeAddr; use internet2::ZmqSocketType; use microservices::error::BootstrapError; @@ -83,7 +82,7 @@ pub fn run(config: Config) -> Result<(), BootstrapError> { pub struct Runtime { id: DaemonId, - pub(crate) electrum: ElectrumClient, + pub(crate) electrum_url: String, pub(crate) store: store_rpc::Client, } @@ -96,15 +95,12 @@ impl Runtime { let id = random(); - let electrum = ElectrumClient::new(&config.electrum_url) - .map_err(|_| LaunchError::ElectrumConnectivity)?; - info!("Bucket runtime started successfully"); Ok(Self { id, store, - electrum, + electrum_url: config.electrum_url, }) } } diff --git a/src/error.rs b/src/error.rs index 0b863818..997f8e9e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -71,6 +71,9 @@ 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), @@ -98,6 +101,7 @@ 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 {