Skip to content

Commit e77ce8d

Browse files
authored
Merge pull request #5830 from stacks-network/chore/cleanup-multiple-miners-tests
Chore/cleanup multiple miners tests
2 parents 037f020 + 0745611 commit e77ce8d

File tree

3 files changed

+2334
-7348
lines changed

3 files changed

+2334
-7348
lines changed

testnet/stacks-node/src/tests/nakamoto_integrations.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4114,7 +4114,8 @@ fn follower_bootup_across_multiple_cycles() {
41144114

41154115
debug!("Booted follower-thread");
41164116

4117-
wait_for(300, || {
4117+
// Wait a long time for the follower to catch up because CI is slow.
4118+
wait_for(600, || {
41184119
sleep_ms(1000);
41194120
let Ok(follower_node_info) = get_chain_info_result(&follower_conf) else {
41204121
return Ok(false);
@@ -10779,11 +10780,6 @@ fn test_tenure_extend_from_flashblocks() {
1077910780
let btc_regtest_controller = &mut signer_test.running_nodes.btc_regtest_controller;
1078010781
let coord_channel = signer_test.running_nodes.coord_channel.clone();
1078110782
let counters = signer_test.running_nodes.counters.clone();
10782-
let nakamoto_test_skip_commit_op = signer_test
10783-
.running_nodes
10784-
.nakamoto_test_skip_commit_op
10785-
.clone();
10786-
let nakamoto_miner_directives = signer_test.running_nodes.nakamoto_miner_directives.clone();
1078710783

1078810784
let tx_fee = 1_000;
1078910785

@@ -10837,7 +10833,7 @@ fn test_tenure_extend_from_flashblocks() {
1083710833
next_block_and_mine_commit(btc_regtest_controller, 60, &naka_conf, &counters).unwrap();
1083810834

1083910835
// prevent the miner from sending another block-commit
10840-
nakamoto_test_skip_commit_op.set(true);
10836+
counters.naka_skip_commit_op.set(true);
1084110837

1084210838
let info_before = get_chain_info(&naka_conf);
1084310839

@@ -10870,7 +10866,7 @@ fn test_tenure_extend_from_flashblocks() {
1087010866
// mine another Bitcoin block right away, and force it to be a flash block
1087110867
btc_regtest_controller.bootstrap_chain(1);
1087210868

10873-
let miner_directives_before = nakamoto_miner_directives.load(Ordering::SeqCst);
10869+
let miner_directives_before = counters.naka_miner_directives.load(Ordering::SeqCst);
1087410870

1087510871
// unblock the relayer so it can process the flash block sortition.
1087610872
// Given the above, this will be an `Extend` tenure.
@@ -10929,13 +10925,12 @@ fn test_tenure_extend_from_flashblocks() {
1092910925
}
1093010926

1093110927
// unstall miner thread and allow block-commits again
10932-
nakamoto_test_skip_commit_op.set(false);
10928+
counters.naka_skip_commit_op.set(false);
1093310929
TEST_MINE_STALL.set(false);
1093410930

1093510931
// wait for the miner directive to be processed
1093610932
wait_for(60, || {
10937-
let directives_cnt = nakamoto_miner_directives.load(Ordering::SeqCst);
10938-
Ok(directives_cnt > miner_directives_before)
10933+
Ok(counters.naka_miner_directives.load(Ordering::SeqCst) > miner_directives_before)
1093910934
})
1094010935
.unwrap();
1094110936

testnet/stacks-node/src/tests/signer/mod.rs

Lines changed: 13 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
mod v0;
1616

1717
use std::collections::HashSet;
18-
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
18+
use std::sync::atomic::{AtomicBool, Ordering};
1919
use std::sync::{Arc, Mutex};
2020
use std::thread;
2121
use std::time::{Duration, Instant};
2222

2323
use clarity::boot_util::boot_code_id;
2424
use clarity::vm::types::PrincipalData;
2525
use libsigner::v0::messages::{
26-
BlockAccepted, BlockRejection, BlockResponse, MessageSlotID, PeerInfo, SignerMessage,
26+
BlockAccepted, BlockResponse, MessageSlotID, PeerInfo, SignerMessage,
2727
};
2828
use libsigner::{BlockProposal, SignerEntries, SignerEventTrait};
2929
use stacks::chainstate::coordinator::comm::CoordinatorChannels;
@@ -36,22 +36,21 @@ use stacks::net::api::postblock_proposal::{
3636
BlockValidateOk, BlockValidateReject, BlockValidateResponse,
3737
};
3838
use stacks::types::chainstate::{StacksAddress, StacksPublicKey};
39-
use stacks::types::{PrivateKey, PublicKey};
39+
use stacks::types::PrivateKey;
4040
use stacks::util::get_epoch_time_secs;
4141
use stacks::util::hash::MerkleHashFunc;
4242
use stacks::util::secp256k1::{MessageSignature, Secp256k1PublicKey};
4343
use stacks_common::codec::StacksMessageCodec;
4444
use stacks_common::consts::SIGNER_SLOTS_PER_USER;
4545
use stacks_common::types::StacksEpochId;
4646
use stacks_common::util::hash::Sha512Trunc256Sum;
47-
use stacks_common::util::tests::TestFlag;
4847
use stacks_signer::client::{ClientError, SignerSlotID, StackerDB, StacksClient};
4948
use stacks_signer::config::{build_signer_config_tomls, GlobalConfig as SignerConfig, Network};
5049
use stacks_signer::runloop::{SignerResult, State, StateInfo};
5150
use stacks_signer::{Signer, SpawnedSigner};
5251

5352
use super::nakamoto_integrations::{check_nakamoto_empty_block_heuristics, wait_for};
54-
use crate::neon::{Counters, RunLoopCounter};
53+
use crate::neon::Counters;
5554
use crate::run_loop::boot_nakamoto;
5655
use crate::tests::bitcoin_regtest::BitcoinCoreController;
5756
use crate::tests::nakamoto_integrations::{
@@ -72,17 +71,6 @@ pub struct RunningNodes {
7271
pub btcd_controller: BitcoinCoreController,
7372
pub run_loop_thread: thread::JoinHandle<()>,
7473
pub run_loop_stopper: Arc<AtomicBool>,
75-
pub vrfs_submitted: RunLoopCounter,
76-
pub commits_submitted: RunLoopCounter,
77-
pub last_commit_burn_height: RunLoopCounter,
78-
pub blocks_processed: RunLoopCounter,
79-
pub sortitions_processed: RunLoopCounter,
80-
pub nakamoto_blocks_proposed: RunLoopCounter,
81-
pub nakamoto_blocks_mined: RunLoopCounter,
82-
pub nakamoto_blocks_rejected: RunLoopCounter,
83-
pub nakamoto_blocks_signer_pushed: RunLoopCounter,
84-
pub nakamoto_miner_directives: Arc<AtomicU64>,
85-
pub nakamoto_test_skip_commit_op: TestFlag<bool>,
8674
pub counters: Counters,
8775
pub coord_channel: Arc<Mutex<CoordinatorChannels>>,
8876
pub conf: NeonConfig,
@@ -337,7 +325,7 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
337325
/// Note: do not use nakamoto blocks mined heuristic if running a test with multiple miners
338326
fn mine_nakamoto_block(&mut self, timeout: Duration, use_nakamoto_blocks_mined: bool) {
339327
let mined_block_time = Instant::now();
340-
let mined_before = self.running_nodes.nakamoto_blocks_mined.get();
328+
let mined_before = self.running_nodes.counters.naka_mined_blocks.get();
341329
let info_before = self.get_peer_info();
342330
next_block_and_mine_commit(
343331
&mut self.running_nodes.btc_regtest_controller,
@@ -349,7 +337,7 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
349337

350338
wait_for(timeout.as_secs(), || {
351339
let info_after = self.get_peer_info();
352-
let blocks_mined = self.running_nodes.nakamoto_blocks_mined.get();
340+
let blocks_mined = self.running_nodes.counters.naka_mined_blocks.get();
353341
Ok(info_after.stacks_tip_height > info_before.stacks_tip_height
354342
&& (!use_nakamoto_blocks_mined || blocks_mined > mined_before))
355343
})
@@ -391,14 +379,14 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
391379
/// to ensure that the block was mined.
392380
/// Note: this function does _not_ mine a BTC block.
393381
fn wait_for_nakamoto_block(&mut self, timeout_secs: u64, f: impl FnOnce() -> ()) {
394-
let blocks_before = self.running_nodes.nakamoto_blocks_mined.get();
382+
let blocks_before = self.running_nodes.counters.naka_mined_blocks.get();
395383
let info_before = self.get_peer_info();
396384

397385
f();
398386

399387
// Verify that the block was mined
400388
wait_for(timeout_secs, || {
401-
let blocks_mined = self.running_nodes.nakamoto_blocks_mined.get();
389+
let blocks_mined = self.running_nodes.counters.naka_mined_blocks.get();
402390
let info = self.get_peer_info();
403391
Ok(blocks_mined > blocks_before
404392
&& info.stacks_tip_height > info_before.stacks_tip_height)
@@ -509,7 +497,7 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
509497
// advance to epoch 3.0 and trigger a sign round (cannot vote on blocks in pre epoch 3.0)
510498
run_until_burnchain_height(
511499
&mut self.running_nodes.btc_regtest_controller,
512-
&self.running_nodes.blocks_processed,
500+
&self.running_nodes.counters.blocks_processed,
513501
epoch_30_boundary,
514502
&self.running_nodes.conf,
515503
);
@@ -621,100 +609,6 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
621609
}
622610
}
623611

624-
pub fn wait_for_block_acceptance(
625-
&self,
626-
timeout_secs: u64,
627-
signer_signature_hash: &Sha512Trunc256Sum,
628-
expected_signers: &[StacksPublicKey],
629-
) -> Result<(), String> {
630-
// Make sure that at least 70% of signers accepted the block proposal
631-
wait_for(timeout_secs, || {
632-
let signatures = test_observer::get_stackerdb_chunks()
633-
.into_iter()
634-
.flat_map(|chunk| chunk.modified_slots)
635-
.filter_map(|chunk| {
636-
let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice())
637-
.expect("Failed to deserialize SignerMessage");
638-
if let SignerMessage::BlockResponse(BlockResponse::Accepted(accepted)) = message
639-
{
640-
if accepted.signer_signature_hash == *signer_signature_hash
641-
&& expected_signers.iter().any(|pk| {
642-
pk.verify(
643-
accepted.signer_signature_hash.bits(),
644-
&accepted.signature,
645-
)
646-
.expect("Failed to verify signature")
647-
})
648-
{
649-
return Some(accepted.signature);
650-
}
651-
}
652-
None
653-
})
654-
.collect::<HashSet<_>>();
655-
Ok(signatures.len() > expected_signers.len() * 7 / 10)
656-
})
657-
}
658-
659-
pub fn wait_for_block_rejections(
660-
&self,
661-
timeout_secs: u64,
662-
expected_signers: &[StacksPublicKey],
663-
) -> Result<(), String> {
664-
wait_for(timeout_secs, || {
665-
let stackerdb_events = test_observer::get_stackerdb_chunks();
666-
let block_rejections: HashSet<_> = stackerdb_events
667-
.into_iter()
668-
.flat_map(|chunk| chunk.modified_slots)
669-
.filter_map(|chunk| {
670-
let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice())
671-
.expect("Failed to deserialize SignerMessage");
672-
match message {
673-
SignerMessage::BlockResponse(BlockResponse::Rejected(rejection)) => {
674-
let rejected_pubkey = rejection
675-
.recover_public_key()
676-
.expect("Failed to recover public key from rejection");
677-
if expected_signers.contains(&rejected_pubkey) {
678-
Some(rejected_pubkey)
679-
} else {
680-
None
681-
}
682-
}
683-
_ => None,
684-
}
685-
})
686-
.collect::<HashSet<_>>();
687-
Ok(block_rejections.len() == expected_signers.len())
688-
})
689-
}
690-
691-
/// Get all block rejections for a given block
692-
pub fn get_block_rejections(
693-
&self,
694-
signer_signature_hash: &Sha512Trunc256Sum,
695-
) -> Vec<BlockRejection> {
696-
let stackerdb_events = test_observer::get_stackerdb_chunks();
697-
let block_rejections = stackerdb_events
698-
.into_iter()
699-
.flat_map(|chunk| chunk.modified_slots)
700-
.filter_map(|chunk| {
701-
let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice())
702-
.expect("Failed to deserialize SignerMessage");
703-
match message {
704-
SignerMessage::BlockResponse(BlockResponse::Rejected(rejection)) => {
705-
if rejection.signer_signature_hash == *signer_signature_hash {
706-
Some(rejection)
707-
} else {
708-
None
709-
}
710-
}
711-
_ => None,
712-
}
713-
})
714-
.collect::<Vec<_>>();
715-
block_rejections
716-
}
717-
718612
/// Get the latest block response from the given slot
719613
pub fn get_latest_block_response(&self, slot_id: u32) -> BlockResponse {
720614
let mut stackerdb = StackerDB::new_normal(
@@ -919,21 +813,8 @@ fn setup_stx_btc_node<G: FnMut(&mut NeonConfig)>(
919813

920814
let mut run_loop = boot_nakamoto::BootRunLoop::new(naka_conf.clone()).unwrap();
921815
let run_loop_stopper = run_loop.get_termination_switch();
922-
let Counters {
923-
blocks_processed,
924-
sortitions_processed,
925-
naka_submitted_vrfs: vrfs_submitted,
926-
naka_submitted_commits: commits_submitted,
927-
naka_submitted_commit_last_burn_height: last_commit_burn_height,
928-
naka_proposed_blocks: naka_blocks_proposed,
929-
naka_mined_blocks: naka_blocks_mined,
930-
naka_rejected_blocks: naka_blocks_rejected,
931-
naka_miner_directives,
932-
naka_skip_commit_op: nakamoto_test_skip_commit_op,
933-
naka_signer_pushed_blocks,
934-
..
935-
} = run_loop.counters();
936816
let counters = run_loop.counters();
817+
let blocks_processed = counters.blocks_processed.clone();
937818

938819
let coord_channel = run_loop.coordinator_channels();
939820
let run_loop_thread = thread::spawn(move || run_loop.start(None, 0));
@@ -944,32 +825,21 @@ fn setup_stx_btc_node<G: FnMut(&mut NeonConfig)>(
944825

945826
// First block wakes up the run loop.
946827
info!("Mine first block...");
947-
next_block_and_wait(&mut btc_regtest_controller, &blocks_processed);
828+
next_block_and_wait(&mut btc_regtest_controller, &counters.blocks_processed);
948829

949830
// Second block will hold our VRF registration.
950831
info!("Mine second block...");
951-
next_block_and_wait(&mut btc_regtest_controller, &blocks_processed);
832+
next_block_and_wait(&mut btc_regtest_controller, &counters.blocks_processed);
952833

953834
// Third block will be the first mined Stacks block.
954835
info!("Mine third block...");
955-
next_block_and_wait(&mut btc_regtest_controller, &blocks_processed);
836+
next_block_and_wait(&mut btc_regtest_controller, &counters.blocks_processed);
956837

957838
RunningNodes {
958839
btcd_controller,
959840
btc_regtest_controller,
960841
run_loop_thread,
961842
run_loop_stopper,
962-
vrfs_submitted,
963-
commits_submitted,
964-
last_commit_burn_height,
965-
blocks_processed,
966-
sortitions_processed,
967-
nakamoto_blocks_proposed: naka_blocks_proposed,
968-
nakamoto_blocks_mined: naka_blocks_mined,
969-
nakamoto_blocks_rejected: naka_blocks_rejected,
970-
nakamoto_blocks_signer_pushed: naka_signer_pushed_blocks,
971-
nakamoto_test_skip_commit_op,
972-
nakamoto_miner_directives: naka_miner_directives.0,
973843
coord_channel,
974844
counters,
975845
conf: naka_conf,

0 commit comments

Comments
 (0)