Skip to content

Commit 2016d02

Browse files
committed
Mine an extra block and tenure to ensure correct behaviour
Signed-off-by: Jacinta Ferrant <[email protected]>
1 parent 7591cff commit 2016d02

File tree

3 files changed

+81
-3
lines changed

3 files changed

+81
-3
lines changed

stackslib/src/chainstate/nakamoto/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2989,6 +2989,7 @@ impl NakamotoChainState {
29892989
debug!(
29902990
"Append nakamoto block";
29912991
"block" => format!("{}/{block_hash}", block.header.consensus_hash),
2992+
"block_id" => %block.header.block_id(),
29922993
"parent_block" => %block.header.parent_block_id,
29932994
"stacks_height" => next_block_height,
29942995
"total_burns" => block.header.burn_spent,

testnet/stacks-node/src/event_dispatcher.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ pub struct MinedMicroblockEvent {
128128
#[derive(Clone, Debug, Serialize, Deserialize)]
129129
pub struct MinedNakamotoBlockEvent {
130130
pub target_burn_height: u64,
131+
pub parent_block_id: String,
131132
pub block_hash: String,
132133
pub block_id: String,
133134
pub stacks_height: u64,
@@ -1252,6 +1253,7 @@ impl EventDispatcher {
12521253

12531254
let payload = serde_json::to_value(MinedNakamotoBlockEvent {
12541255
target_burn_height,
1256+
parent_block_id: block.header.parent_block_id.to_string(),
12551257
block_hash: block.header.block_hash().to_string(),
12561258
block_id: block.header.block_id().to_string(),
12571259
stacks_height: block.header.chain_length,

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

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3178,7 +3178,7 @@ fn forked_tenure_is_ignored() {
31783178
let observer_port = test_observer::EVENT_OBSERVER_PORT;
31793179
naka_conf.events_observers.insert(EventObserverConfig {
31803180
endpoint: format!("localhost:{observer_port}"),
3181-
events_keys: vec![EventKeyType::AnyEvent],
3181+
events_keys: vec![EventKeyType::AnyEvent, EventKeyType::MinedBlocks],
31823182
});
31833183

31843184
let mut btcd_controller = BitcoinCoreController::new(naka_conf.clone());
@@ -3290,11 +3290,12 @@ fn forked_tenure_is_ignored() {
32903290
thread::sleep(Duration::from_secs(1));
32913291
}
32923292

3293+
info!("Tenure B broadcasted a block. Issue the next bitcon block and unstall block commits.");
32933294
let block_tenure_b = NakamotoChainState::get_canonical_block_header(chainstate.db(), &sortdb)
32943295
.unwrap()
32953296
.unwrap();
3296-
3297-
info!("Tenure B broadcasted a block. Issue the next bitcon block and unstall block commits.");
3297+
let blocks = test_observer::get_mined_nakamoto_blocks();
3298+
let block_b = blocks.last().unwrap();
32983299

32993300
info!("Starting tenure C.");
33003301
// Submit a block commit op for tenure C
@@ -3312,19 +3313,93 @@ fn forked_tenure_is_ignored() {
33123313
let block_tenure_c = NakamotoChainState::get_canonical_block_header(chainstate.db(), &sortdb)
33133314
.unwrap()
33143315
.unwrap();
3316+
let blocks = test_observer::get_mined_nakamoto_blocks();
3317+
let block_c = blocks.last().unwrap();
3318+
3319+
// Now let's produce a second block for tenure C and ensure it builds off of block C.
3320+
let blocks_before = mined_blocks.load(Ordering::SeqCst);
3321+
next_block_and(&mut btc_regtest_controller, 60, || {
3322+
let blocks_count = mined_blocks.load(Ordering::SeqCst);
3323+
Ok(blocks_count > blocks_before)
3324+
})
3325+
.unwrap();
3326+
3327+
info!("Tenure C produced a second block!");
3328+
3329+
let block_2_tenure_c = NakamotoChainState::get_canonical_block_header(chainstate.db(), &sortdb)
3330+
.unwrap()
3331+
.unwrap();
3332+
let blocks = test_observer::get_mined_nakamoto_blocks();
3333+
let block_2_c = blocks.last().unwrap();
3334+
3335+
info!("Starting tenure D.");
3336+
// Submit a block commit op for tenure D
3337+
let commits_before = commits_submitted.load(Ordering::SeqCst);
3338+
next_block_and(&mut btc_regtest_controller, 60, || {
3339+
let commits_count = commits_submitted.load(Ordering::SeqCst);
3340+
Ok(commits_count > commits_before)
3341+
})
3342+
.unwrap();
33153343

3344+
// Wait for a stacks block to be broadcasted
3345+
let blocks_before = mined_blocks.load(Ordering::SeqCst);
3346+
next_block_and(&mut btc_regtest_controller, 60, || {
3347+
let blocks_count = mined_blocks.load(Ordering::SeqCst);
3348+
Ok(blocks_count > blocks_before)
3349+
})
3350+
.unwrap();
3351+
let block_tenure_d = NakamotoChainState::get_canonical_block_header(chainstate.db(), &sortdb)
3352+
.unwrap()
3353+
.unwrap();
3354+
let blocks = test_observer::get_mined_nakamoto_blocks();
3355+
let block_d = blocks.last().unwrap();
33163356
assert_ne!(block_tenure_b, block_tenure_a);
33173357
assert_ne!(block_tenure_b, block_tenure_c);
3358+
assert_ne!(block_tenure_c, block_tenure_a);
3359+
33183360
// Block B was built atop block A
33193361
assert_eq!(
33203362
block_tenure_b.stacks_block_height,
33213363
block_tenure_a.stacks_block_height + 1
33223364
);
3365+
assert_eq!(
3366+
block_b.parent_block_id,
3367+
block_tenure_a.index_block_hash().to_string()
3368+
);
3369+
33233370
// Block C was built AFTER Block B was built, but BEFORE it was broadcasted, so it should be built off of Block A
33243371
assert_eq!(
33253372
block_tenure_c.stacks_block_height,
33263373
block_tenure_a.stacks_block_height + 1
33273374
);
3375+
assert_eq!(
3376+
block_c.parent_block_id,
3377+
block_tenure_a.index_block_hash().to_string()
3378+
);
3379+
3380+
assert_ne!(block_tenure_c, block_2_tenure_c);
3381+
assert_ne!(block_2_tenure_c, block_tenure_d);
3382+
assert_ne!(block_tenure_c, block_tenure_d);
3383+
3384+
// Second block of tenure C builds off of block C
3385+
assert_eq!(
3386+
block_2_tenure_c.stacks_block_height,
3387+
block_tenure_c.stacks_block_height + 1,
3388+
);
3389+
assert_eq!(
3390+
block_2_c.parent_block_id,
3391+
block_tenure_c.index_block_hash().to_string()
3392+
);
3393+
3394+
// Tenure D builds off of the second block of tenure C
3395+
assert_eq!(
3396+
block_tenure_d.stacks_block_height,
3397+
block_2_tenure_c.stacks_block_height + 1,
3398+
);
3399+
assert_eq!(
3400+
block_d.parent_block_id,
3401+
block_2_tenure_c.index_block_hash().to_string()
3402+
);
33283403

33293404
coord_channel
33303405
.lock()

0 commit comments

Comments
 (0)