From 58f07a1c0bdaddb354111b709243a8c08904e147 Mon Sep 17 00:00:00 2001 From: Vihiga Tyonum Date: Wed, 12 Feb 2025 00:50:19 +0100 Subject: [PATCH] refactor: update nodes.rs file - replace `bitcoincore_rpc` client with `electrsd::Node` client - update rpc commands - update `electrsd` to v0.31.0 [Ticket: X] --- Cargo.lock | 264 +++++++++++++-------------------------------------- Cargo.toml | 2 +- src/error.rs | 3 + src/nodes.rs | 56 +++-------- 4 files changed, 83 insertions(+), 242 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d1cefba..a676665 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,6 +50,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + [[package]] name = "arrayvec" version = "0.7.6" @@ -161,21 +167,6 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-compat" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a8d4d2746f89841e49230dd26917df1876050f95abafafbe34f47cb534b88d7" -dependencies = [ - "byteorder", -] - [[package]] name = "base64ct" version = "1.6.0" @@ -266,7 +257,7 @@ checksum = "2ac1a1da33a22949c3e2b3a715431eaed50c2c9278c8cdac06f0254b7659291f" dependencies = [ "bdk_core", "bitcoin 0.32.5", - "bitcoincore-rpc 0.19.0", + "bitcoincore-rpc", ] [[package]] @@ -310,7 +301,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b272d5a3228799f7c917255fe26e788f6c29dd4a084a342d274a44352bbc0915" dependencies = [ "bdk_core", - "electrum-client 0.22.0", + "electrum-client", ] [[package]] @@ -387,18 +378,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "bitcoin" -version = "0.29.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0694ea59225b0c5f3cb405ff3f670e4828358ed26aec49dc352f730f0cb1a8a3" -dependencies = [ - "bech32 0.9.1", - "bitcoin_hashes 0.11.0", - "secp256k1 0.24.3", - "serde", -] - [[package]] name = "bitcoin" version = "0.30.2" @@ -470,15 +449,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bitcoin_hashes" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" -dependencies = [ - "serde", -] - [[package]] name = "bitcoin_hashes" version = "0.12.0" @@ -520,43 +490,19 @@ dependencies = [ "libc", ] -[[package]] -name = "bitcoincore-rpc" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0261b2bb7617e0c91b452a837bbd1291fd34ad6990cb8e3ffc28239cc045b5ca" -dependencies = [ - "bitcoincore-rpc-json 0.16.0", - "jsonrpc 0.12.1", - "log", - "serde", - "serde_json", -] - [[package]] name = "bitcoincore-rpc" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aedd23ae0fd321affb4bbbc36126c6f49a32818dc6b979395d24da8c9d4e80ee" dependencies = [ - "bitcoincore-rpc-json 0.19.0", - "jsonrpc 0.18.0", + "bitcoincore-rpc-json", + "jsonrpc", "log", "serde", "serde_json", ] -[[package]] -name = "bitcoincore-rpc-json" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c231bea28e314879c5aef240f6052e8a72a369e3c9f9b20d9bfbb33ad18029b2" -dependencies = [ - "bitcoin 0.29.2", - "serde", - "serde_json", -] - [[package]] name = "bitcoincore-rpc-json" version = "0.19.0" @@ -568,25 +514,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "bitcoind" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0716f11ae8033a7fe9c4aa06e9dbd798fb74d13d15bd890fedc10c996bf448a" -dependencies = [ - "bitcoin_hashes 0.11.0", - "bitcoincore-rpc 0.16.0", - "filetime", - "flate2", - "log", - "tar", - "tempfile", - "time", - "ureq", - "which", - "zip", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -649,9 +576,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.12" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" +checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" dependencies = [ "jobserver", "libc", @@ -754,9 +681,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.53" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24a03c8b52922d68a1589ad61032f2c1aa5a8158d2aa0d93c6e9534944bbad6" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] @@ -783,6 +710,46 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "corepc-client" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb85495f0577f4765ea2ece0a69003d38acdddba2ac06bdde180ac2b969a9a63" +dependencies = [ + "bitcoin 0.32.5", + "corepc-types", + "jsonrpc", + "log", + "serde", + "serde_json", +] + +[[package]] +name = "corepc-node" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887faf7fdf38a5b99b3efb69e18e27fb9de77c812c5c48956a8076c7f9076b99" +dependencies = [ + "anyhow", + "corepc-client", + "log", + "serde_json", + "tempfile", + "which", +] + +[[package]] +name = "corepc-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282d9bd7fd9d944471a0c0ad44fd1581acd87a79739652c5455ffdae25177db6" +dependencies = [ + "bitcoin 0.32.5", + "bitcoin-internals 0.3.0", + "serde", + "serde_json", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -874,31 +841,21 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "electrsd" -version = "0.22.2" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a51f3d3808c1ec7e7e0b434fd9e2be0e5ac973441c9929395ab2b14a952333d9" +checksum = "eaa7f6661c5890f51f09f54fb225cd37058202cf0ba53dbbd92a4374fe035904" dependencies = [ - "bitcoin_hashes 0.11.0", - "bitcoind", - "electrum-client 0.12.1", + "bitcoin_hashes 0.14.0", + "corepc-client", + "corepc-node", + "electrum-client", "log", + "minreq", "nix 0.25.1", - "ureq", + "which", "zip", ] -[[package]] -name = "electrum-client" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e1e1e452aef3ee772d19cc6272ef642f22ce0f4a9fb715ffe98010934e2ae1" -dependencies = [ - "bitcoin 0.29.2", - "log", - "serde", - "serde_json", -] - [[package]] name = "electrum-client" version = "0.22.0" @@ -912,7 +869,7 @@ dependencies = [ "rustls 0.23.22", "serde", "serde_json", - "webpki-roots 0.25.4", + "webpki-roots", "winapi", ] @@ -1013,18 +970,6 @@ dependencies = [ "windows-sys 0.28.0", ] -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - [[package]] name = "flate2" version = "1.0.35" @@ -1614,18 +1559,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonrpc" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f8423b78fc94d12ef1a4a9d13c348c9a78766dda0cc18817adf0faf77e670c8" -dependencies = [ - "base64-compat", - "serde", - "serde_derive", - "serde_json", -] - [[package]] name = "jsonrpc" version = "0.18.0" @@ -1674,7 +1607,6 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.8.0", "libc", - "redox_syscall", ] [[package]] @@ -1796,7 +1728,7 @@ dependencies = [ "rustls-webpki 0.101.7", "serde", "serde_json", - "webpki-roots 0.25.4", + "webpki-roots", ] [[package]] @@ -2486,7 +2418,6 @@ dependencies = [ "aws-lc-rs", "log", "once_cell", - "ring", "rustls-pki-types", "rustls-webpki 0.102.8", "subtle", @@ -2594,17 +2525,6 @@ dependencies = [ "secp256k1-sys 0.5.2", ] -[[package]] -name = "secp256k1" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" -dependencies = [ - "bitcoin_hashes 0.11.0", - "secp256k1-sys 0.6.1", - "serde", -] - [[package]] name = "secp256k1" version = "0.27.0" @@ -2638,15 +2558,6 @@ dependencies = [ "cc", ] -[[package]] -name = "secp256k1-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" -dependencies = [ - "cc", -] - [[package]] name = "secp256k1-sys" version = "0.8.1" @@ -2875,17 +2786,6 @@ dependencies = [ "libc", ] -[[package]] -name = "tar" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" -dependencies = [ - "filetime", - "libc", - "xattr", -] - [[package]] name = "target-lexicon" version = "0.12.16" @@ -3142,22 +3042,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "ureq" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" -dependencies = [ - "base64 0.22.1", - "flate2", - "log", - "once_cell", - "rustls 0.23.22", - "rustls-pki-types", - "url", - "webpki-roots 0.26.8", -] - [[package]] name = "url" version = "2.5.4" @@ -3318,15 +3202,6 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" -[[package]] -name = "webpki-roots" -version = "0.26.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "which" version = "4.4.2" @@ -3592,17 +3467,6 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" -[[package]] -name = "xattr" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" -dependencies = [ - "libc", - "linux-raw-sys", - "rustix", -] - [[package]] name = "yoke" version = "0.7.5" diff --git a/Cargo.toml b/Cargo.toml index 7e9a013..4dadc11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ rustyline = { version = "~9.0", optional = true } fd-lock = { version = "=3.0.2", optional = true } regex = { version = "1", optional = true } bdk-reserves = {version = "0.29.0", optional = true} -electrsd = { version= "0.22", features = ["bitcoind_22_0"], optional = true} +electrsd = { version= "0.31.0", optional = true} bdk_electrum ={ version = "0.20.1", optional = true} bdk_esplora ={ version = "0.15.0", features = ["async"], optional = true} bdk_bitcoind_rpc = {version = "0.17.1", optional = true} diff --git a/src/error.rs b/src/error.rs index b5996aa..2f3dce3 100644 --- a/src/error.rs +++ b/src/error.rs @@ -18,6 +18,9 @@ pub enum BDKCliError { #[error("Create transaction error: {0}")] CreateTx(#[from] bdk_wallet::error::CreateTxError), + #[error("CoreRPC error: {0}")] + CoreRPCError(#[from] electrsd::corepc_client::client_sync::Error), + #[error("Descriptor error: {0}")] DescriptorError(#[from] bdk_wallet::descriptor::error::Error), diff --git a/src/nodes.rs b/src/nodes.rs index b9b7921..00a98f2 100644 --- a/src/nodes.rs +++ b/src/nodes.rs @@ -16,12 +16,9 @@ #[cfg(feature = "regtest-node")] use { - crate::commands::NodeSubCommand, - bdk_wallet::{ - bitcoin::{Address, Amount}, - Error, - }, - electrsd::bitcoind::bitcoincore_rpc::{Client, RpcApi}, + crate::{commands::NodeSubCommand, error::BDKCliError as Error}, + bdk_wallet::bitcoin::{Address, Amount}, + electrsd::corepc_node::{Client, Node}, serde_json::Value, std::str::FromStr, }; @@ -34,20 +31,20 @@ pub enum Nodes { #[cfg(feature = "regtest-bitcoin")] /// A bitcoin core backend. Wallet connected to it via RPC. Bitcoin { - bitcoind: Box, + bitcoind: Box, }, #[cfg(feature = "regtest-electrum")] /// An Electrum backend with an underlying bitcoin core /// Wallet connected to it, via the electrum url. Electrum { - bitcoind: Box, + bitcoind: Box, electrsd: Box, }, /// An Esplora backend with an underlying bitcoin core /// Wallet connected to it, via the esplora url. #[cfg(any(feature = "regtest-esplora-ureq", feature = "regtest-esplora-reqwest"))] Esplora { - bitcoind: Box, + bitcoind: Box, esplorad: Box, }, } @@ -58,42 +55,21 @@ impl Nodes { pub fn exec_cmd(&self, cmd: NodeSubCommand) -> Result { let client = self.get_client()?; match cmd { - NodeSubCommand::GetInfo => Ok(serde_json::to_value( - client - .get_blockchain_info() - .map_err(|e| Error::Generic(e.to_string()))?, - )?), - - NodeSubCommand::GetNewAddress => Ok(serde_json::to_value( - client - .get_new_address(None, None) - .map_err(|e| Error::Generic(e.to_string()))?, - )?), + NodeSubCommand::GetInfo => Ok(serde_json::to_value(client.get_blockchain_info()?)?), + NodeSubCommand::GetNewAddress => Ok(serde_json::to_value(client.new_address()?)?), NodeSubCommand::Generate { block_num } => { - let core_addrs = client - .get_new_address(None, None) - .map_err(|e| Error::Generic(e.to_string()))?; - let block_hashes = client - .generate_to_address(block_num, &core_addrs) - .map_err(|e| Error::Generic(e.to_string()))?; + let core_addrs = client.new_address()?; + let block_hashes = client.generate_to_address(block_num as usize, &core_addrs)?; Ok(serde_json::to_value(block_hashes)?) } - NodeSubCommand::GetBalance => Ok(serde_json::to_value( - client - .get_balance(None, None) - .map_err(|e| Error::Generic(e.to_string()))? - .to_string(), - )?), + NodeSubCommand::GetBalance => Ok(serde_json::to_value(client.get_balance()?)?), NodeSubCommand::SendToAddress { address, amount } => { - let address = - Address::from_str(&address).map_err(|e| Error::Generic(e.to_string()))?; + let address = Address::from_str(&address)?.assume_checked(); let amount = Amount::from_sat(amount); - let txid = client - .send_to_address(&address, amount, None, None, None, None, None, None) - .map_err(|e| Error::Generic(e.to_string()))?; + let txid = client.send_to_address(&address, amount)?; Ok(serde_json::to_value(&txid)?) } @@ -103,9 +79,7 @@ impl Nodes { .iter() .map(|arg| serde_json::Value::from_str(arg)) .collect::, _>>()?; - client - .call::(cmd, &args) - .map_err(|e| Error::Generic(e.to_string())) + Ok(client.call::(cmd, &args)?) } } } @@ -119,7 +93,7 @@ impl Nodes { #[cfg(feature = "regtest-bitcoin")] Self::Bitcoin { bitcoind } => Ok(&bitcoind.client), #[cfg(feature = "regtest-electrum")] - Self::Electrum { bitcoind, .. } => Ok(&bitcoind.client), + Self::Electrum { bitcoind, .. } => Ok(&bitcoind.client), // question: shouldn't we initialize electrsd with bitcoind? #[cfg(any(feature = "regtest-esplora-ureq", feature = "regtest-esplora-reqwest"))] Self::Esplora { bitcoind, .. } => Ok(&bitcoind.client), } -- 2.49.0