diff --git a/stacks-node/src/burnchains/bitcoin_regtest_controller.rs b/stacks-node/src/burnchains/bitcoin_regtest_controller.rs index 5a54d6121c0..506a75d2d67 100644 --- a/stacks-node/src/burnchains/bitcoin_regtest_controller.rs +++ b/stacks-node/src/burnchains/bitcoin_regtest_controller.rs @@ -93,7 +93,10 @@ pub struct BitcoinRegtestController { burnchain_config: Option, ongoing_block_commit: Option, should_keep_running: Option>, - rpc_client: BitcoinRpcClient, + /// Optional Bitcoin RPC client used to interact with a `bitcoind` node. + /// - For **miner** node this field must be always `Some`. + /// - For **other** node (e.g. follower node), this field is `None`. + rpc_client: Option, } #[derive(Clone)] @@ -371,8 +374,7 @@ impl BitcoinRegtestController { should_keep_running: should_keep_running.clone(), }; - let rpc_client = BitcoinRpcClient::from_stx_config(&config) - .expect("unable to instantiate the RPC client!"); + let rpc_client = Self::create_rpc_client_unchecked(&config); Self { use_coordinator: coordinator_channel, @@ -421,8 +423,7 @@ impl BitcoinRegtestController { should_keep_running: None, }; - let rpc_client = BitcoinRpcClient::from_stx_config(&config) - .expect("unable to instantiate the RPC client!"); + let rpc_client = Self::create_rpc_client_unchecked(&config); Self { use_coordinator: None, @@ -477,6 +478,32 @@ impl BitcoinRegtestController { } } + /// Attempt to create a new [`BitcoinRpcClient`] from the given [`Config`]. + /// + /// If the provided config indicates that the node is a **miner**, + /// tries to instantiate it or **panics** otherwise. + /// If the node is **not** a miner, returns None (e.g. follower node). + fn create_rpc_client_unchecked(config: &Config) -> Option { + config.node.miner.then(|| { + BitcoinRpcClient::from_stx_config(&config) + .expect("unable to instantiate the RPC client for miner node!") + }) + } + + /// Attempt to get a reference to the underlying [`BitcoinRpcClient`]. + /// + /// This function will panic if the RPC client has not been configured + /// (i.e. [`Self::create_rpc_client_unchecked`] returned `None` during initialization), + /// but an attempt is made to use it anyway. + /// + /// In practice, this means the node is expected to act as a miner, + /// yet no [`BitcoinRpcClient`] was created or properly configured. + fn get_rpc_client(&self) -> &BitcoinRpcClient { + self.rpc_client + .as_ref() + .expect("BUG: BitcoinRpcClient is required, but it has not been configured properly!") + } + /// Helium (devnet) blocks receiver. Returns the new burnchain tip. fn receive_blocks_helium(&mut self) -> BurnchainTip { let mut burnchain = self.get_burnchain(); @@ -686,7 +713,7 @@ impl BitcoinRegtestController { /// Retrieve all loaded wallets. pub fn list_wallets(&self) -> BitcoinRegtestControllerResult> { - Ok(self.rpc_client.list_wallets()?) + Ok(self.get_rpc_client().list_wallets()?) } /// Checks if the config-supplied wallet exists. @@ -695,7 +722,7 @@ impl BitcoinRegtestController { let wallets = self.list_wallets()?; let wallet = self.get_wallet_name(); if !wallets.contains(wallet) { - self.rpc_client.create_wallet(wallet, Some(true))? + self.get_rpc_client().create_wallet(wallet, Some(true))? } Ok(()) } @@ -1861,7 +1888,7 @@ impl BitcoinRegtestController { const UNCAPPED_FEE: f64 = 0.0; const MAX_BURN_AMOUNT: u64 = 1_000_000; - self.rpc_client + self.get_rpc_client() .send_raw_transaction(tx, Some(UNCAPPED_FEE), Some(MAX_BURN_AMOUNT)) .map(|txid| { debug!("Transaction {txid} sent successfully"); @@ -1933,7 +1960,9 @@ impl BitcoinRegtestController { .expect("FATAL: invalid public key bytes"); let address = self.get_miner_address(StacksEpochId::Epoch21, &public_key); - let result = self.rpc_client.generate_to_address(num_blocks, &address); + let result = self + .get_rpc_client() + .generate_to_address(num_blocks, &address); /* Temporary: not using `BitcoinRpcClientResultExt::ok_or_log_panic` (test code related), because we need this logic available outside `#[cfg(test)]` due to Helium network. @@ -1966,7 +1995,7 @@ impl BitcoinRegtestController { .expect("FATAL: invalid public key bytes"); let address = self.get_miner_address(StacksEpochId::Epoch21, &public_key); - self.rpc_client + self.get_rpc_client() .generate_block(&address, &[]) .ok_or_log_panic("generating block") } @@ -1975,7 +2004,7 @@ impl BitcoinRegtestController { #[cfg(test)] pub fn invalidate_block(&self, block: &BurnchainHeaderHash) { info!("Invalidating block {block}"); - self.rpc_client + self.get_rpc_client() .invalidate_block(block) .ok_or_log_panic("invalidate block") } @@ -1983,7 +2012,7 @@ impl BitcoinRegtestController { /// Retrieve the hash (as a [`BurnchainHeaderHash`]) of the block at the given height. #[cfg(test)] pub fn get_block_hash(&self, height: u64) -> BurnchainHeaderHash { - self.rpc_client + self.get_rpc_client() .get_block_hash(height) .unwrap_or_log_panic("retrieve block") } @@ -2041,7 +2070,7 @@ impl BitcoinRegtestController { /// Retrieves a raw [`Transaction`] by its [`Txid`] #[cfg(test)] pub fn get_raw_transaction(&self, txid: &Txid) -> Transaction { - self.rpc_client + self.get_rpc_client() .get_raw_transaction(txid) .unwrap_or_log_panic("retrieve raw tx") } @@ -2069,7 +2098,7 @@ impl BitcoinRegtestController { "Generate to address '{address}' for public key '{}'", &pks[0].to_hex() ); - self.rpc_client + self.get_rpc_client() .generate_to_address(num_blocks, &address) .ok_or_log_panic("generating block"); return; @@ -2087,7 +2116,7 @@ impl BitcoinRegtestController { &pk.to_hex(), ); } - self.rpc_client + self.get_rpc_client() .generate_to_address(1, &address) .ok_or_log_panic("generating block"); } @@ -2105,7 +2134,7 @@ impl BitcoinRegtestController { /// * `false` if the transaction is unconfirmed or could not be found. pub fn is_transaction_confirmed(&self, txid: &Txid) -> bool { match self - .rpc_client + .get_rpc_client() .get_transaction(self.get_wallet_name(), txid) { Ok(info) => info.confirmations > 0, @@ -2158,7 +2187,7 @@ impl BitcoinRegtestController { ); let descriptor = format!("addr({address})"); - let info = self.rpc_client.get_descriptor_info(&descriptor)?; + let info = self.get_rpc_client().get_descriptor_info(&descriptor)?; let descr_req = ImportDescriptorsRequest { descriptor: format!("addr({address})#{}", info.checksum), @@ -2166,7 +2195,7 @@ impl BitcoinRegtestController { internal: Some(true), }; - self.rpc_client + self.get_rpc_client() .import_descriptors(self.get_wallet_name(), &[&descr_req])?; } Ok(()) @@ -2227,11 +2256,11 @@ impl BitcoinRegtestController { utxos_to_exclude: &Option, block_height: u64, ) -> BitcoinRpcClientResult { - let bhh = self.rpc_client.get_block_hash(block_height)?; + let bhh = self.get_rpc_client().get_block_hash(block_height)?; const MIN_CONFIRMATIONS: u64 = 0; const MAX_CONFIRMATIONS: u64 = 9_999_999; - let unspents = self.rpc_client.list_unspent( + let unspents = self.get_rpc_client().list_unspent( &self.get_wallet_name(), Some(MIN_CONFIRMATIONS), Some(MAX_CONFIRMATIONS), @@ -2420,6 +2449,7 @@ mod tests { use std::env::{self, temp_dir}; use std::fs::File; use std::io::Write; + use std::panic::{self, AssertUnwindSafe}; use stacks::burnchains::BurnchainSigner; use stacks::config::DEFAULT_SATS_PER_VB; @@ -2430,7 +2460,9 @@ mod tests { use super::*; use crate::burnchains::bitcoin::core_controller::BitcoinCoreController; - use crate::burnchains::bitcoin_regtest_controller::tests::utils::to_address_legacy; + use crate::burnchains::bitcoin_regtest_controller::tests::utils::{ + create_follower_config, create_miner_config, to_address_legacy, + }; use crate::Keychain; mod utils { @@ -2444,8 +2476,9 @@ mod tests { use crate::burnchains::bitcoin::core_controller::BURNCHAIN_CONFIG_PEER_PORT_DISABLED; use crate::util::get_epoch_time_nanos; - pub fn create_config() -> Config { + pub fn create_miner_config() -> Config { let mut config = Config::default(); + config.node.miner = true; config.burnchain.magic_bytes = "T3".as_bytes().into(); config.burnchain.username = Some(String::from("user")); config.burnchain.password = Some(String::from("12345")); @@ -2683,6 +2716,18 @@ mod tests { burn_header_hash: BurnchainHeaderHash([0u8; 32]), } } + + pub fn create_follower_config() -> Config { + let mut config = Config::default(); + config.node.miner = false; + config.burnchain.magic_bytes = "T3".as_bytes().into(); + config.burnchain.username = None; + config.burnchain.password = None; + config.burnchain.peer_host = String::from("127.0.0.1"); + config.burnchain.peer_port = 8333; + config.node.working_dir = format!("/tmp/follower"); + config + } } #[test] @@ -2738,7 +2783,7 @@ mod tests { ]; // test serialize_tx() - let config = utils::create_config(); + let config = utils::create_miner_config(); let mut btc_controller = BitcoinRegtestController::new(config, None); let mut utxo_set = UTXOSet { @@ -2857,7 +2902,7 @@ mod tests { #[test] fn test_to_epoch_aware_pubkey() { - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); let pubkey = utils::create_miner1_pubkey(); config.miner.segwit = false; @@ -2895,7 +2940,7 @@ mod tests { #[test] fn test_get_miner_address() { - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); let pub_key = utils::create_miner1_pubkey(); config.miner.segwit = false; @@ -2933,6 +2978,86 @@ mod tests { ); } + #[test] + fn test_instantiate_with_burnchain_on_follower_node_ok() { + let config = create_follower_config(); + + let btc_controller = BitcoinRegtestController::with_burnchain(config, None, None, None); + + let result = panic::catch_unwind(AssertUnwindSafe(|| { + _ = btc_controller.get_rpc_client(); + })); + assert!( + result.is_err(), + "Invoking any Bitcoin RPC related method should panic." + ); + } + + #[test] + fn test_instantiate_with_burnchain_on_miner_node_ok() { + let config = create_miner_config(); + + let btc_controller = BitcoinRegtestController::with_burnchain(config, None, None, None); + + let _ = btc_controller.get_rpc_client(); + assert!(true, "Invoking any Bitcoin RPC related method should work."); + } + + #[test] + fn test_instantiate_with_burnchain_on_miner_node_failure() { + let mut config = create_miner_config(); + config.burnchain.username = None; + config.burnchain.password = None; + + let result = panic::catch_unwind(|| { + _ = BitcoinRegtestController::with_burnchain(config, None, None, None); + }); + assert!( + result.is_err(), + "Bitcoin RPC credentials are mandatory for miner node." + ); + } + + #[test] + fn test_instantiate_new_dummy_on_follower_node_ok() { + let config = create_follower_config(); + + let btc_controller = BitcoinRegtestController::new_dummy(config); + + let result = panic::catch_unwind(AssertUnwindSafe(|| { + _ = btc_controller.get_rpc_client(); + })); + assert!( + result.is_err(), + "Invoking any Bitcoin RPC related method should panic." + ); + } + + #[test] + fn test_instantiate_new_dummy_on_miner_node_ok() { + let config = create_miner_config(); + + let btc_controller = BitcoinRegtestController::new_dummy(config); + + let _ = btc_controller.get_rpc_client(); + assert!(true, "Invoking any Bitcoin RPC related method should work."); + } + + #[test] + fn test_instantiate_new_dummy_on_miner_node_failure() { + let mut config = create_miner_config(); + config.burnchain.username = None; + config.burnchain.password = None; + + let result = panic::catch_unwind(|| { + _ = BitcoinRegtestController::new_dummy(config); + }); + assert!( + result.is_err(), + "Bitcoin RPC credentials are mandatory for miner node." + ); + } + #[test] #[ignore] fn test_create_wallet_from_default_empty_name() { @@ -2940,7 +3065,7 @@ mod tests { return; } - let config = utils::create_config(); + let config = utils::create_miner_config(); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); btcd_controller @@ -2964,7 +3089,11 @@ mod tests { #[test] #[ignore] fn test_create_wallet_from_custom_name() { - let mut config = utils::create_config(); + if env::var("BITCOIND_TEST") != Ok("1".into()) { + return; + } + + let mut config = utils::create_miner_config(); config.burnchain.wallet_name = String::from("mywallet"); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -2992,7 +3121,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3020,7 +3149,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3057,7 +3186,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); config.burnchain.max_unspent_utxos = Some(10); @@ -3085,7 +3214,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3126,7 +3255,7 @@ mod tests { let miner1_pubkey = utils::create_miner1_pubkey(); let miner2_pubkey = utils::create_miner2_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner1_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3164,7 +3293,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3212,7 +3341,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3243,7 +3372,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3271,7 +3400,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3307,7 +3436,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3337,7 +3466,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let config = utils::create_config(); + let config = utils::create_miner_config(); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); btcd_controller @@ -3366,7 +3495,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let config = utils::create_config(); + let config = utils::create_miner_config(); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); btcd_controller @@ -3400,7 +3529,7 @@ mod tests { let miner_pubkey = utils::create_miner1_pubkey(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.miner.segwit = true; let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3436,7 +3565,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3495,7 +3624,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3544,7 +3673,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3595,7 +3724,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3678,7 +3807,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3751,7 +3880,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3796,7 +3925,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3846,7 +3975,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3896,7 +4025,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3932,7 +4061,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -3972,7 +4101,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -4017,7 +4146,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -4064,7 +4193,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -4097,7 +4226,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); @@ -4138,7 +4267,7 @@ mod tests { let miner_pubkey = keychain.get_pub_key(); let mut op_signer = keychain.generate_op_signer(); - let mut config = utils::create_config(); + let mut config = utils::create_miner_config(); config.burnchain.local_mining_public_key = Some(miner_pubkey.to_hex()); let mut btcd_controller = BitcoinCoreController::from_stx_config(&config); diff --git a/stacks-node/src/burnchains/rpc/bitcoin_rpc_client/mod.rs b/stacks-node/src/burnchains/rpc/bitcoin_rpc_client/mod.rs index 58eed7e3d02..bef521be80d 100644 --- a/stacks-node/src/burnchains/rpc/bitcoin_rpc_client/mod.rs +++ b/stacks-node/src/burnchains/rpc/bitcoin_rpc_client/mod.rs @@ -363,6 +363,10 @@ pub type BitcoinRpcClientResult = Result; impl BitcoinRpcClient { /// Create a [`BitcoinRpcClient`] from Stacks Configuration, mainly using [`stacks::config::BurnchainConfig`] + /// + /// # Notes + /// `username` and `password` configuration are mandatory (`bitcoind` requires authentication for rpc calls), + /// so a [`BitcoinRpcClientError::MissingCredentials`] is returned otherwise, pub fn from_stx_config(config: &Config) -> BitcoinRpcClientResult { let host = config.burnchain.peer_host.clone(); let port = config.burnchain.rpc_port; diff --git a/stacks-node/src/tests/neon_integrations.rs b/stacks-node/src/tests/neon_integrations.rs index 32a974f3096..b11bf78af94 100644 --- a/stacks-node/src/tests/neon_integrations.rs +++ b/stacks-node/src/tests/neon_integrations.rs @@ -6294,9 +6294,10 @@ fn antientropy_integration_test() { let burnchain_config = Burnchain::regtest(&conf_bootstrap_node.get_burn_db_path()); let target_height = 3 + (3 * burnchain_config.pox_constants.reward_cycle_length); + let conf_bootstrap_node_threaded = conf_bootstrap_node.clone(); let bootstrap_node_thread = thread::spawn(move || { let mut btc_regtest_controller = BitcoinRegtestController::with_burnchain( - conf_bootstrap_node.clone(), + conf_bootstrap_node_threaded.clone(), None, Some(burnchain_config.clone()), None, @@ -6306,7 +6307,7 @@ fn antientropy_integration_test() { eprintln!("Chain bootstrapped..."); - let mut run_loop = neon::RunLoop::new(conf_bootstrap_node.clone()); + let mut run_loop = neon::RunLoop::new(conf_bootstrap_node_threaded.clone()); let blocks_processed = run_loop.get_blocks_processed_arc(); let channel = run_loop.get_coordinator_channel().unwrap(); @@ -6397,7 +6398,7 @@ fn antientropy_integration_test() { ); let btc_regtest_controller = BitcoinRegtestController::with_burnchain( - conf_follower_node.clone(), + conf_bootstrap_node.clone(), None, Some(burnchain_config), None,