Skip to content

Commit 6f8d7c6

Browse files
committed
Merge branch 'develop' of https://github.com/stacks-network/stacks-core into chore/clippy-assertions-assign-op-approx-constant
2 parents 0cdc3cc + e77ce8d commit 6f8d7c6

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
@@ -4112,7 +4112,8 @@ fn follower_bootup_across_multiple_cycles() {
41124112

41134113
debug!("Booted follower-thread");
41144114

4115-
wait_for(300, || {
4115+
// Wait a long time for the follower to catch up because CI is slow.
4116+
wait_for(600, || {
41164117
sleep_ms(1000);
41174118
let Ok(follower_node_info) = get_chain_info_result(&follower_conf) else {
41184119
return Ok(false);
@@ -10774,11 +10775,6 @@ fn test_tenure_extend_from_flashblocks() {
1077410775
let btc_regtest_controller = &mut signer_test.running_nodes.btc_regtest_controller;
1077510776
let coord_channel = signer_test.running_nodes.coord_channel.clone();
1077610777
let counters = signer_test.running_nodes.counters.clone();
10777-
let nakamoto_test_skip_commit_op = signer_test
10778-
.running_nodes
10779-
.nakamoto_test_skip_commit_op
10780-
.clone();
10781-
let nakamoto_miner_directives = signer_test.running_nodes.nakamoto_miner_directives.clone();
1078210778

1078310779
let tx_fee = 1_000;
1078410780

@@ -10832,7 +10828,7 @@ fn test_tenure_extend_from_flashblocks() {
1083210828
next_block_and_mine_commit(btc_regtest_controller, 60, &naka_conf, &counters).unwrap();
1083310829

1083410830
// prevent the miner from sending another block-commit
10835-
nakamoto_test_skip_commit_op.set(true);
10831+
counters.naka_skip_commit_op.set(true);
1083610832

1083710833
let info_before = get_chain_info(&naka_conf);
1083810834

@@ -10865,7 +10861,7 @@ fn test_tenure_extend_from_flashblocks() {
1086510861
// mine another Bitcoin block right away, and force it to be a flash block
1086610862
btc_regtest_controller.bootstrap_chain(1);
1086710863

10868-
let miner_directives_before = nakamoto_miner_directives.load(Ordering::SeqCst);
10864+
let miner_directives_before = counters.naka_miner_directives.load(Ordering::SeqCst);
1086910865

1087010866
// unblock the relayer so it can process the flash block sortition.
1087110867
// Given the above, this will be an `Extend` tenure.
@@ -10924,13 +10920,12 @@ fn test_tenure_extend_from_flashblocks() {
1092410920
}
1092510921

1092610922
// unstall miner thread and allow block-commits again
10927-
nakamoto_test_skip_commit_op.set(false);
10923+
counters.naka_skip_commit_op.set(false);
1092810924
TEST_MINE_STALL.set(false);
1092910925

1093010926
// wait for the miner directive to be processed
1093110927
wait_for(60, || {
10932-
let directives_cnt = nakamoto_miner_directives.load(Ordering::SeqCst);
10933-
Ok(directives_cnt > miner_directives_before)
10928+
Ok(counters.naka_miner_directives.load(Ordering::SeqCst) > miner_directives_before)
1093410929
})
1093510930
.unwrap();
1093610931

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,
@@ -334,7 +322,7 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
334322
/// Note: do not use nakamoto blocks mined heuristic if running a test with multiple miners
335323
fn mine_nakamoto_block(&mut self, timeout: Duration, use_nakamoto_blocks_mined: bool) {
336324
let mined_block_time = Instant::now();
337-
let mined_before = self.running_nodes.nakamoto_blocks_mined.get();
325+
let mined_before = self.running_nodes.counters.naka_mined_blocks.get();
338326
let info_before = self.get_peer_info();
339327
next_block_and_mine_commit(
340328
&mut self.running_nodes.btc_regtest_controller,
@@ -346,7 +334,7 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
346334

347335
wait_for(timeout.as_secs(), || {
348336
let info_after = self.get_peer_info();
349-
let blocks_mined = self.running_nodes.nakamoto_blocks_mined.get();
337+
let blocks_mined = self.running_nodes.counters.naka_mined_blocks.get();
350338
Ok(info_after.stacks_tip_height > info_before.stacks_tip_height
351339
&& (!use_nakamoto_blocks_mined || blocks_mined > mined_before))
352340
})
@@ -388,14 +376,14 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
388376
/// to ensure that the block was mined.
389377
/// Note: this function does _not_ mine a BTC block.
390378
fn wait_for_nakamoto_block(&mut self, timeout_secs: u64, f: impl FnOnce() -> ()) {
391-
let blocks_before = self.running_nodes.nakamoto_blocks_mined.get();
379+
let blocks_before = self.running_nodes.counters.naka_mined_blocks.get();
392380
let info_before = self.get_peer_info();
393381

394382
f();
395383

396384
// Verify that the block was mined
397385
wait_for(timeout_secs, || {
398-
let blocks_mined = self.running_nodes.nakamoto_blocks_mined.get();
386+
let blocks_mined = self.running_nodes.counters.naka_mined_blocks.get();
399387
let info = self.get_peer_info();
400388
Ok(blocks_mined > blocks_before
401389
&& info.stacks_tip_height > info_before.stacks_tip_height)
@@ -506,7 +494,7 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
506494
// advance to epoch 3.0 and trigger a sign round (cannot vote on blocks in pre epoch 3.0)
507495
run_until_burnchain_height(
508496
&mut self.running_nodes.btc_regtest_controller,
509-
&self.running_nodes.blocks_processed,
497+
&self.running_nodes.counters.blocks_processed,
510498
epoch_30_boundary,
511499
&self.running_nodes.conf,
512500
);
@@ -618,100 +606,6 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
618606
}
619607
}
620608

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

917811
let mut run_loop = boot_nakamoto::BootRunLoop::new(naka_conf.clone()).unwrap();
918812
let run_loop_stopper = run_loop.get_termination_switch();
919-
let Counters {
920-
blocks_processed,
921-
sortitions_processed,
922-
naka_submitted_vrfs: vrfs_submitted,
923-
naka_submitted_commits: commits_submitted,
924-
naka_submitted_commit_last_burn_height: last_commit_burn_height,
925-
naka_proposed_blocks: naka_blocks_proposed,
926-
naka_mined_blocks: naka_blocks_mined,
927-
naka_rejected_blocks: naka_blocks_rejected,
928-
naka_miner_directives,
929-
naka_skip_commit_op: nakamoto_test_skip_commit_op,
930-
naka_signer_pushed_blocks,
931-
..
932-
} = run_loop.counters();
933813
let counters = run_loop.counters();
814+
let blocks_processed = counters.blocks_processed.clone();
934815

935816
let coord_channel = run_loop.coordinator_channels();
936817
let run_loop_thread = thread::spawn(move || run_loop.start(None, 0));
@@ -941,32 +822,21 @@ fn setup_stx_btc_node<G: FnMut(&mut NeonConfig)>(
941822

942823
// First block wakes up the run loop.
943824
info!("Mine first block...");
944-
next_block_and_wait(&mut btc_regtest_controller, &blocks_processed);
825+
next_block_and_wait(&mut btc_regtest_controller, &counters.blocks_processed);
945826

946827
// Second block will hold our VRF registration.
947828
info!("Mine second block...");
948-
next_block_and_wait(&mut btc_regtest_controller, &blocks_processed);
829+
next_block_and_wait(&mut btc_regtest_controller, &counters.blocks_processed);
949830

950831
// Third block will be the first mined Stacks block.
951832
info!("Mine third block...");
952-
next_block_and_wait(&mut btc_regtest_controller, &blocks_processed);
833+
next_block_and_wait(&mut btc_regtest_controller, &counters.blocks_processed);
953834

954835
RunningNodes {
955836
btcd_controller,
956837
btc_regtest_controller,
957838
run_loop_thread,
958839
run_loop_stopper,
959-
vrfs_submitted,
960-
commits_submitted,
961-
last_commit_burn_height,
962-
blocks_processed,
963-
sortitions_processed,
964-
nakamoto_blocks_proposed: naka_blocks_proposed,
965-
nakamoto_blocks_mined: naka_blocks_mined,
966-
nakamoto_blocks_rejected: naka_blocks_rejected,
967-
nakamoto_blocks_signer_pushed: naka_signer_pushed_blocks,
968-
nakamoto_test_skip_commit_op,
969-
nakamoto_miner_directives: naka_miner_directives.0,
970840
coord_channel,
971841
counters,
972842
conf: naka_conf,

0 commit comments

Comments
 (0)