Skip to content

Commit 42b7d62

Browse files
committed
Update allow_reorg_within_first_proposal_burn_block_timing_secs_scenario
This commit updates the scenario to correctly test the reorg, following @kantai suggestions. Addresses #6007 (comment).
1 parent 922eb75 commit 42b7d62

File tree

3 files changed

+149
-13
lines changed

3 files changed

+149
-13
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@ mod block_wait;
66
mod boot;
77
mod commit_ops;
88
mod shutdown;
9+
mod sortition;
910
mod stacks_mining;
1011
mod transfer;
1112

1213
pub use context::SignerTestContext;
1314

14-
pub use bitcoin_mining::{MineBitcoinBlock, MineBitcoinBlockTenureChangePrimaryMiner};
15-
pub use block_commit::{SubmitBlockCommitPrimaryMiner, SubmitBlockCommitSecondaryMiner};
15+
pub use bitcoin_mining::MineBitcoinBlock;
16+
pub use block_commit::SubmitBlockCommitSecondaryMiner;
1617
pub use block_wait::{WaitForBlockFromMiner1, WaitForBlockFromMiner2};
1718
pub use boot::BootToEpoch3;
1819
pub use commit_ops::{SkipCommitOpPrimaryMiner, SkipCommitOpSecondaryMiner};
1920
pub use shutdown::ShutdownMiners;
21+
pub use sortition::{
22+
VerifyLastSortitionWinnerReorged, VerifyMiner1WonSortition, VerifyMiner2WonSortition,
23+
};
2024
pub use stacks_mining::{PauseStacksMining, ResumeStacksMining};
21-
pub use transfer::SendTransferTx;
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
use std::sync::{Arc, Mutex};
2+
3+
use madhouse::{Command, CommandWrapper};
4+
use proptest::prelude::{Just, Strategy};
5+
6+
use crate::tests::signer::v0::{verify_sortition_winner, MultipleMinerTest};
7+
8+
use super::{context::SignerTestState, SignerTestContext};
9+
10+
pub struct VerifyMiner1WonSortition {
11+
miners: Arc<Mutex<MultipleMinerTest>>,
12+
}
13+
14+
impl VerifyMiner1WonSortition {
15+
pub fn new(miners: Arc<Mutex<MultipleMinerTest>>) -> Self {
16+
Self { miners }
17+
}
18+
}
19+
20+
impl Command<SignerTestState, SignerTestContext> for VerifyMiner1WonSortition {
21+
fn check(&self, _state: &SignerTestState) -> bool {
22+
info!(
23+
"Checking: Verifying miner 1 won sortition. Result: {:?}",
24+
true
25+
);
26+
true
27+
}
28+
29+
fn apply(&self, _state: &mut SignerTestState) {
30+
info!("Applying: Verifying miner 1 won sortition");
31+
32+
let (conf_1, _) = self.miners.lock().unwrap().get_node_configs();
33+
let burnchain = conf_1.get_burnchain();
34+
let sortdb = burnchain.open_sortition_db(true).unwrap();
35+
let (miner_pkh_1, _) = self.miners.lock().unwrap().get_miner_public_key_hashes();
36+
37+
verify_sortition_winner(&sortdb, &miner_pkh_1);
38+
}
39+
fn label(&self) -> String {
40+
"VERIFY_MINER_1_WON_SORTITION".to_string()
41+
}
42+
fn build(
43+
ctx: Arc<SignerTestContext>,
44+
) -> impl Strategy<Value = CommandWrapper<SignerTestState, SignerTestContext>> {
45+
Just(CommandWrapper::new(VerifyMiner1WonSortition::new(
46+
ctx.miners.clone(),
47+
)))
48+
}
49+
}
50+
51+
pub struct VerifyMiner2WonSortition {
52+
miners: Arc<Mutex<MultipleMinerTest>>,
53+
}
54+
55+
impl VerifyMiner2WonSortition {
56+
pub fn new(miners: Arc<Mutex<MultipleMinerTest>>) -> Self {
57+
Self { miners }
58+
}
59+
}
60+
61+
impl Command<SignerTestState, SignerTestContext> for VerifyMiner2WonSortition {
62+
fn check(&self, _state: &SignerTestState) -> bool {
63+
info!(
64+
"Checking: Verifying miner 2 won sortition. Result: {:?}",
65+
true
66+
);
67+
true
68+
}
69+
70+
fn apply(&self, _state: &mut SignerTestState) {
71+
info!("Applying: Verifying miner 2 won sortition");
72+
73+
let (conf_1, _) = self.miners.lock().unwrap().get_node_configs();
74+
let burnchain = conf_1.get_burnchain();
75+
let sortdb = burnchain.open_sortition_db(true).unwrap();
76+
let (_, miner_pkh_2) = self.miners.lock().unwrap().get_miner_public_key_hashes();
77+
78+
verify_sortition_winner(&sortdb, &miner_pkh_2);
79+
}
80+
fn label(&self) -> String {
81+
"VERIFY_MINER_2_WON_SORTITION".to_string()
82+
}
83+
fn build(
84+
ctx: Arc<SignerTestContext>,
85+
) -> impl Strategy<Value = CommandWrapper<SignerTestState, SignerTestContext>> {
86+
Just(CommandWrapper::new(VerifyMiner2WonSortition::new(
87+
ctx.miners.clone(),
88+
)))
89+
}
90+
}
91+
92+
pub struct VerifyLastSortitionWinnerReorged {
93+
miners: Arc<Mutex<MultipleMinerTest>>,
94+
}
95+
96+
impl VerifyLastSortitionWinnerReorged {
97+
pub fn new(miners: Arc<Mutex<MultipleMinerTest>>) -> Self {
98+
Self { miners }
99+
}
100+
}
101+
102+
impl Command<SignerTestState, SignerTestContext> for VerifyLastSortitionWinnerReorged {
103+
fn check(&self, _state: &SignerTestState) -> bool {
104+
info!(
105+
"Checking: Verifying last sortition winner reorged. Result: {:?}",
106+
true
107+
);
108+
true
109+
}
110+
111+
fn apply(&self, _state: &mut SignerTestState) {
112+
info!("Applying: Verifying last sortition winner reorged");
113+
self.miners
114+
.lock()
115+
.unwrap()
116+
.assert_last_sortition_winner_reorged();
117+
}
118+
119+
fn label(&self) -> String {
120+
"VERIFY_LAST_SORTITION_WINNER_REORGED".to_string()
121+
}
122+
123+
fn build(
124+
ctx: Arc<SignerTestContext>,
125+
) -> impl Strategy<Value = CommandWrapper<SignerTestState, SignerTestContext>> {
126+
Just(CommandWrapper::new(VerifyLastSortitionWinnerReorged::new(
127+
ctx.miners.clone(),
128+
)))
129+
}
130+
}

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,12 @@ impl MultipleMinerTest {
10561056
})
10571057
.expect("Timed out waiting for boostrapped node to catch up to the miner");
10581058
}
1059+
1060+
pub fn assert_last_sortition_winner_reorged(&self) {
1061+
let (conf_1, _) = self.get_node_configs();
1062+
let latest_sortition = get_sortition_info(&conf_1);
1063+
assert!(latest_sortition.stacks_parent_ch != latest_sortition.last_sortition_ch);
1064+
}
10591065
}
10601066

10611067
/// Returns whether the last block in the test observer contains a tenure change
@@ -1099,7 +1105,7 @@ fn verify_last_block_contains_tenure_change_tx(cause: TenureChangeCause) {
10991105
}
11001106

11011107
/// Verifies that the tip of the sortition database was won by the provided miner public key hash
1102-
fn verify_sortition_winner(sortdb: &SortitionDB, miner_pkh: &Hash160) {
1108+
pub fn verify_sortition_winner(sortdb: &SortitionDB, miner_pkh: &Hash160) {
11031109
let tip = SortitionDB::get_canonical_burn_chain_tip(sortdb.conn()).unwrap();
11041110
assert!(tip.sortition);
11051111
assert_eq!(&tip.miner_pk_hash.unwrap(), miner_pkh);
@@ -10450,19 +10456,16 @@ fn allow_reorg_within_first_proposal_burn_block_timing_secs_scenario() {
1045010456
SkipCommitOpSecondaryMiner,
1045110457
BootToEpoch3,
1045210458
SkipCommitOpPrimaryMiner,
10453-
MineBitcoinBlockTenureChangePrimaryMiner,
10454-
SubmitBlockCommitSecondaryMiner,
1045510459
PauseStacksMining,
1045610460
MineBitcoinBlock,
10457-
SubmitBlockCommitPrimaryMiner,
10461+
VerifyMiner1WonSortition,
10462+
SubmitBlockCommitSecondaryMiner,
1045810463
ResumeStacksMining,
10459-
WaitForBlockFromMiner2,
10460-
MineBitcoinBlock,
10461-
WaitForBlockFromMiner1,
10462-
SubmitBlockCommitPrimaryMiner,
10463-
SendTransferTx,
1046410464
WaitForBlockFromMiner1,
10465-
MineBitcoinBlockTenureChangePrimaryMiner,
10465+
MineBitcoinBlock,
10466+
VerifyMiner2WonSortition,
10467+
VerifyLastSortitionWinnerReorged,
10468+
WaitForBlockFromMiner2,
1046610469
ShutdownMiners
1046710470
]
1046810471
}

0 commit comments

Comments
 (0)