From b18787021290cac3663d7bc1e1779227acd94322 Mon Sep 17 00:00:00 2001 From: Aaron Blankstein Date: Fri, 26 Aug 2022 10:57:57 -0500 Subject: [PATCH 1/7] feat: add `pox_2_activation` configuration to burnchain config --- .../burnchains/bitcoin_regtest_controller.rs | 41 ++++++++----------- testnet/stacks-node/src/config.rs | 25 +++++++++++ testnet/stacks-node/src/neon_node.rs | 3 +- testnet/stacks-node/src/tests/epoch_205.rs | 3 +- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs b/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs index 2e2fdbc20..e05e5c359 100644 --- a/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs +++ b/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs @@ -75,7 +75,7 @@ pub struct BitcoinRegtestController { burnchain_db: Option, chain_tip: Option, use_coordinator: Option, - burnchain_config: Option, + burnchain_config: Burnchain, ongoing_block_commit: Option, should_keep_running: Option>, allow_rbf: bool, @@ -190,7 +190,7 @@ impl BitcoinRegtestController { pub fn with_burnchain( config: Config, coordinator_channel: Option, - burnchain_config: Option, + burnchain: Option, should_keep_running: Option>, ) -> Self { std::fs::create_dir_all(&config.get_burnchain_path_str()) @@ -242,6 +242,8 @@ impl BitcoinRegtestController { runtime: indexer_runtime, }; + let burnchain_config = burnchain.unwrap_or_else(|| Self::default_burnchain(&config)); + Self { use_coordinator: coordinator_channel, config, @@ -258,7 +260,7 @@ impl BitcoinRegtestController { /// create a dummy bitcoin regtest controller. /// used just for submitting bitcoin ops. - pub fn new_dummy(config: Config) -> Self { + pub fn new_dummy(config: Config, burnchain: Burnchain) -> Self { let (network, _) = config.burnchain.get_bitcoin_network(); let burnchain_params = BurnchainParameters::from_params(&config.burnchain.chain, &network) .expect("Bitcoin network unsupported"); @@ -294,28 +296,24 @@ impl BitcoinRegtestController { db: None, burnchain_db: None, chain_tip: None, - burnchain_config: None, + burnchain_config: burnchain, ongoing_block_commit: None, should_keep_running: None, allow_rbf: true, } } - fn default_burnchain(&self) -> Burnchain { - let (network_name, _network_type) = self.config.burnchain.get_bitcoin_network(); - match &self.burnchain_config { - Some(burnchain) => burnchain.clone(), - None => { - let working_dir = self.config.get_burn_db_path(); - match Burnchain::new(&working_dir, &self.config.burnchain.chain, &network_name) { - Ok(burnchain) => burnchain, - Err(e) => { - error!("Failed to instantiate burnchain: {}", e); - panic!() - } - } - } - } + fn default_burnchain(config: &Config) -> Burnchain { + let (network_name, _network_type) = config.burnchain.get_bitcoin_network(); + let working_dir = config.get_burn_db_path(); + let mut burnchain = Burnchain::new(&working_dir, &config.burnchain.chain, &network_name) + .unwrap_or_else(|e| { + error!("Failed to instantiate burnchain: {}", e); + panic!() + }); + config.update_pox_constants(&mut burnchain.pox_constants); + + burnchain } pub fn get_pox_constants(&self) -> PoxConstants { @@ -324,10 +322,7 @@ impl BitcoinRegtestController { } pub fn get_burnchain(&self) -> Burnchain { - match self.burnchain_config { - Some(ref burnchain) => burnchain.clone(), - None => self.default_burnchain(), - } + self.burnchain_config.clone() } fn receive_blocks_helium(&mut self) -> BurnchainTip { diff --git a/testnet/stacks-node/src/config.rs b/testnet/stacks-node/src/config.rs index 621e5b085..fbc8794db 100644 --- a/testnet/stacks-node/src/config.rs +++ b/testnet/stacks-node/src/config.rs @@ -6,6 +6,7 @@ use std::path::PathBuf; use rand::RngCore; use stacks::burnchains::bitcoin::BitcoinNetworkType; +use stacks::burnchains::PoxConstants; use stacks::burnchains::{MagicBytes, BLOCKSTACK_MAGIC_MAINNET}; use stacks::chainstate::stacks::index::marf::MARFOpenOpts; use stacks::chainstate::stacks::index::storage::TrieHashCalculationMode; @@ -394,6 +395,17 @@ lazy_static! { } impl Config { + /// This method applies any of this Config's configured PoX constants to the supplied + /// `PoxConstants` struct. + pub fn update_pox_constants(&self, pox_consts: &mut PoxConstants) { + if self.is_mainnet() { + return; + } + if let Some(pox_2_activation_height) = self.burnchain.pox_2_activation { + pox_consts.v1_unlock_height = pox_2_activation_height; + } + } + fn make_epochs( conf_epochs: &[StacksEpochConfigFile], burn_mode: &str, @@ -669,8 +681,18 @@ impl Config { .rbf_fee_increment .unwrap_or(default_burnchain_config.rbf_fee_increment), epochs: default_burnchain_config.epochs, + pox_2_activation: burnchain + .pox_2_activation + .or(default_burnchain_config.pox_2_activation), }; + // check that pox_2_activation hasn't been set in mainnet + if result.pox_2_activation.is_some() { + if let BitcoinNetworkType::Mainnet = result.get_bitcoin_network().1 { + return Err("PoX-2 Activation height is not configurable in mainnet".into()); + } + } + if let Some(ref conf_epochs) = burnchain.epochs { result.epochs = Some(Self::make_epochs( conf_epochs, @@ -1137,6 +1159,7 @@ pub struct BurnchainConfig { /// Custom override for the definitions of the epochs. This will only be applied for testnet and /// regtest nodes. pub epochs: Option>, + pub pox_2_activation: Option, } impl BurnchainConfig { @@ -1165,6 +1188,7 @@ impl BurnchainConfig { block_commit_tx_estimated_size: BLOCK_COMMIT_TX_ESTIM_SIZE, rbf_fee_increment: DEFAULT_RBF_FEE_RATE_INCREMENT, epochs: None, + pox_2_activation: None, } } @@ -1230,6 +1254,7 @@ pub struct BurnchainConfigFile { pub rbf_fee_increment: Option, pub max_rbf: Option, pub epochs: Option>, + pub pox_2_activation: Option, } #[derive(Clone, Debug, Default)] diff --git a/testnet/stacks-node/src/neon_node.rs b/testnet/stacks-node/src/neon_node.rs index 660f024ca..566232b7a 100644 --- a/testnet/stacks-node/src/neon_node.rs +++ b/testnet/stacks-node/src/neon_node.rs @@ -1022,7 +1022,8 @@ fn spawn_miner_relayer( > = HashMap::new(); let burn_fee_cap = config.burnchain.burn_fee_cap; - let mut bitcoin_controller = BitcoinRegtestController::new_dummy(config.clone()); + let mut bitcoin_controller = + BitcoinRegtestController::new_dummy(config.clone(), burnchain.clone()); let mut microblock_miner_state: Option = None; let mut miner_tip = None; // only set if we won the last sortition let mut last_microblock_tenure_time = 0; diff --git a/testnet/stacks-node/src/tests/epoch_205.rs b/testnet/stacks-node/src/tests/epoch_205.rs index 1a1acef4e..d7b90b077 100644 --- a/testnet/stacks-node/src/tests/epoch_205.rs +++ b/testnet/stacks-node/src/tests/epoch_205.rs @@ -545,8 +545,9 @@ fn transition_empty_blocks() { // second block will be the first mined Stacks block next_block_and_wait(&mut btc_regtest_controller, &blocks_processed); - let mut bitcoin_controller = BitcoinRegtestController::new_dummy(conf.clone()); let burnchain = Burnchain::regtest(&conf.get_burn_db_path()); + let mut bitcoin_controller = + BitcoinRegtestController::new_dummy(conf.clone(), burnchain.clone()); // these should all succeed across the epoch boundary for _i in 0..5 { From 3c07e23816f39c5f2d4100484c45587d48d7aece Mon Sep 17 00:00:00 2001 From: Greg Coppola Date: Fri, 2 Sep 2022 09:48:02 -0500 Subject: [PATCH 2/7] sort docs keywords and functions by name --- clarity/src/vm/docs/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clarity/src/vm/docs/mod.rs b/clarity/src/vm/docs/mod.rs index 2a5c5b767..ea12d21bc 100644 --- a/clarity/src/vm/docs/mod.rs +++ b/clarity/src/vm/docs/mod.rs @@ -2229,10 +2229,10 @@ fn make_all_api_reference() -> ReferenceAPIs { .iter() .map(|x| make_api_reference(x)) .collect(); - for data_type in DefineFunctions::ALL.iter() { functions.push(make_define_reference(data_type)) } + functions.sort_by(|x, y| x.name.cmp(&y.name)); let mut keywords = Vec::new(); for variable in NativeVariables::ALL.iter() { @@ -2241,6 +2241,7 @@ fn make_all_api_reference() -> ReferenceAPIs { keywords.push(api_ref) } } + keywords.sort_by(|x, y| x.name.cmp(&y.name)); ReferenceAPIs { functions, From e7c400777c2619dc4fafbb646b367620f83d3a93 Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Sat, 3 Sep 2022 12:52:42 +0200 Subject: [PATCH 3/7] fix: use `pox_2_activation` configuration in a few more areas --- testnet/stacks-node/src/node.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/testnet/stacks-node/src/node.rs b/testnet/stacks-node/src/node.rs index 45dae4db8..4688aad1d 100644 --- a/testnet/stacks-node/src/node.rs +++ b/testnet/stacks-node/src/node.rs @@ -300,11 +300,12 @@ impl Node { .iter() .map(|e| (e.address.clone(), e.amount)) .collect(); - let pox_constants = match config.burnchain.get_bitcoin_network() { + let mut pox_constants = match config.burnchain.get_bitcoin_network() { (_, BitcoinNetworkType::Mainnet) => PoxConstants::mainnet_default(), (_, BitcoinNetworkType::Testnet) => PoxConstants::testnet_default(), (_, BitcoinNetworkType::Regtest) => PoxConstants::regtest_default(), }; + config.update_pox_constants(&mut pox_constants); let mut boot_data = ChainStateBootData { initial_balances, @@ -447,7 +448,8 @@ impl Node { pub fn spawn_peer_server(&mut self, attachments_rx: Receiver>) { // we can call _open_ here rather than _connect_, since connect is first called in // make_genesis_block - let burnchain = Burnchain::regtest(&self.config.get_burn_db_path()); + let mut burnchain = Burnchain::regtest(&self.config.get_burn_db_path()); + &self.config.update_pox_constants(&mut burnchain.pox_constants); let sortdb = SortitionDB::open( &self.config.get_burn_db_file_path(), @@ -1003,7 +1005,9 @@ impl Node { ), }; - let burnchain = Burnchain::regtest(&self.config.get_burn_db_path()); + let mut burnchain = Burnchain::regtest(&self.config.get_burn_db_path()); + &self.config.update_pox_constants(&mut burnchain.pox_constants); + let commit_outs = if !burnchain.is_in_prepare_phase(burnchain_tip.block_snapshot.block_height + 1) { RewardSetInfo::into_commit_outs(None, self.config.is_mainnet()) From 352de9f768cc8090ead7bd2c5290956de85f667a Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Sat, 3 Sep 2022 18:29:41 +0200 Subject: [PATCH 4/7] chore: lint --- testnet/stacks-node/src/node.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testnet/stacks-node/src/node.rs b/testnet/stacks-node/src/node.rs index 4688aad1d..a3f239aeb 100644 --- a/testnet/stacks-node/src/node.rs +++ b/testnet/stacks-node/src/node.rs @@ -449,7 +449,7 @@ impl Node { // we can call _open_ here rather than _connect_, since connect is first called in // make_genesis_block let mut burnchain = Burnchain::regtest(&self.config.get_burn_db_path()); - &self.config.update_pox_constants(&mut burnchain.pox_constants); + self.config.update_pox_constants(&mut burnchain.pox_constants); let sortdb = SortitionDB::open( &self.config.get_burn_db_file_path(), @@ -1006,7 +1006,7 @@ impl Node { }; let mut burnchain = Burnchain::regtest(&self.config.get_burn_db_path()); - &self.config.update_pox_constants(&mut burnchain.pox_constants); + self.config.update_pox_constants(&mut burnchain.pox_constants); let commit_outs = if !burnchain.is_in_prepare_phase(burnchain_tip.block_snapshot.block_height + 1) { From 712099a46f1f61a5931cfdbab70cc2b73aa5faf1 Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Sun, 4 Sep 2022 07:46:33 +0200 Subject: [PATCH 5/7] chore: PR feedback --- .../src/burnchains/bitcoin_regtest_controller.rs | 5 +---- testnet/stacks-node/src/node.rs | 6 ++++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs b/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs index e05e5c359..bbdec5530 100644 --- a/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs +++ b/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs @@ -307,10 +307,7 @@ impl BitcoinRegtestController { let (network_name, _network_type) = config.burnchain.get_bitcoin_network(); let working_dir = config.get_burn_db_path(); let mut burnchain = Burnchain::new(&working_dir, &config.burnchain.chain, &network_name) - .unwrap_or_else(|e| { - error!("Failed to instantiate burnchain: {}", e); - panic!() - }); + .expect("Failed to instantiate burnchain"); config.update_pox_constants(&mut burnchain.pox_constants); burnchain diff --git a/testnet/stacks-node/src/node.rs b/testnet/stacks-node/src/node.rs index a3f239aeb..8ac2ef54c 100644 --- a/testnet/stacks-node/src/node.rs +++ b/testnet/stacks-node/src/node.rs @@ -449,7 +449,8 @@ impl Node { // we can call _open_ here rather than _connect_, since connect is first called in // make_genesis_block let mut burnchain = Burnchain::regtest(&self.config.get_burn_db_path()); - self.config.update_pox_constants(&mut burnchain.pox_constants); + self.config + .update_pox_constants(&mut burnchain.pox_constants); let sortdb = SortitionDB::open( &self.config.get_burn_db_file_path(), @@ -1006,7 +1007,8 @@ impl Node { }; let mut burnchain = Burnchain::regtest(&self.config.get_burn_db_path()); - self.config.update_pox_constants(&mut burnchain.pox_constants); + self.config + .update_pox_constants(&mut burnchain.pox_constants); let commit_outs = if !burnchain.is_in_prepare_phase(burnchain_tip.block_snapshot.block_height + 1) { From ad30e130ddbdb9b532d01422043f07038935683e Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Tue, 6 Sep 2022 23:12:36 +0200 Subject: [PATCH 6/7] fix: ensure epoch2.1 block height configuration is specified before possible pox_2_activation height --- testnet/stacks-node/src/config.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/testnet/stacks-node/src/config.rs b/testnet/stacks-node/src/config.rs index fbc8794db..d2e518fb0 100644 --- a/testnet/stacks-node/src/config.rs +++ b/testnet/stacks-node/src/config.rs @@ -410,6 +410,7 @@ impl Config { conf_epochs: &[StacksEpochConfigFile], burn_mode: &str, bitcoin_network: BitcoinNetworkType, + pox_2_activation: Option, ) -> Result, String> { let default_epochs = match bitcoin_network { BitcoinNetworkType::Mainnet => { @@ -500,6 +501,16 @@ impl Config { } } + if let Some(pox_2_activation) = pox_2_activation { + let last_epoch = out_epochs + .iter() + .find(|&e| e.epoch_id == StacksEpochId::Epoch21) + .ok_or("Cannot configure pox_2_activation if epoch 2.1 is not configured")?; + if last_epoch.start_height > pox_2_activation as u64 { + Err(format!("Cannot configure pox_2_activation at a lower height than the Epoch 2.1 start height. pox_2_activation = {}, epoch 2.1 start height = {}", pox_2_activation, last_epoch.start_height))?; + } + } + Ok(out_epochs) } @@ -698,6 +709,7 @@ impl Config { conf_epochs, &result.mode, result.get_bitcoin_network().1, + burnchain.pox_2_activation, )?); } From 923136bc39c66b042a83c4ea039a1f11ed935a01 Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Sun, 4 Sep 2022 08:46:40 +0200 Subject: [PATCH 7/7] fix: avoid pegging system resources during initial header sync when bitcoind rpc isn't yet available --- src/burnchains/burnchain.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/burnchains/burnchain.rs b/src/burnchains/burnchain.rs index b1524df93..a11f87c57 100644 --- a/src/burnchains/burnchain.rs +++ b/src/burnchains/burnchain.rs @@ -72,7 +72,7 @@ use crate::util_lib::db::Error as db_error; use stacks_common::address::public_keys_to_address_hash; use stacks_common::address::AddressHashMode; use stacks_common::deps_common::bitcoin::util::hash::Sha256dHash as BitcoinSha256dHash; -use stacks_common::util::get_epoch_time_ms; +use stacks_common::util::{get_epoch_time_ms, sleep_ms}; use stacks_common::util::get_epoch_time_secs; use stacks_common::util::hash::to_hex; use stacks_common::util::log; @@ -584,6 +584,7 @@ impl Burnchain { debug!("Fetch initial headers"); indexer.sync_headers(headers_height, None).map_err(|e| { error!("Failed to sync initial headers"); + sleep_ms(100); e })?; }