@@ -3178,7 +3178,7 @@ fn forked_tenure_is_ignored() {
3178
3178
let observer_port = test_observer:: EVENT_OBSERVER_PORT ;
3179
3179
naka_conf. events_observers . insert ( EventObserverConfig {
3180
3180
endpoint : format ! ( "localhost:{observer_port}" ) ,
3181
- events_keys : vec ! [ EventKeyType :: AnyEvent ] ,
3181
+ events_keys : vec ! [ EventKeyType :: AnyEvent , EventKeyType :: MinedBlocks ] ,
3182
3182
} ) ;
3183
3183
3184
3184
let mut btcd_controller = BitcoinCoreController :: new ( naka_conf. clone ( ) ) ;
@@ -3290,11 +3290,12 @@ fn forked_tenure_is_ignored() {
3290
3290
thread:: sleep ( Duration :: from_secs ( 1 ) ) ;
3291
3291
}
3292
3292
3293
+ info ! ( "Tenure B broadcasted a block. Issue the next bitcon block and unstall block commits." ) ;
3293
3294
let block_tenure_b = NakamotoChainState :: get_canonical_block_header ( chainstate. db ( ) , & sortdb)
3294
3295
. unwrap ( )
3295
3296
. 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 ( ) ;
3298
3299
3299
3300
info ! ( "Starting tenure C." ) ;
3300
3301
// Submit a block commit op for tenure C
@@ -3312,19 +3313,93 @@ fn forked_tenure_is_ignored() {
3312
3313
let block_tenure_c = NakamotoChainState :: get_canonical_block_header ( chainstate. db ( ) , & sortdb)
3313
3314
. unwrap ( )
3314
3315
. 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 ( ) ;
3315
3343
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 ( ) ;
3316
3356
assert_ne ! ( block_tenure_b, block_tenure_a) ;
3317
3357
assert_ne ! ( block_tenure_b, block_tenure_c) ;
3358
+ assert_ne ! ( block_tenure_c, block_tenure_a) ;
3359
+
3318
3360
// Block B was built atop block A
3319
3361
assert_eq ! (
3320
3362
block_tenure_b. stacks_block_height,
3321
3363
block_tenure_a. stacks_block_height + 1
3322
3364
) ;
3365
+ assert_eq ! (
3366
+ block_b. parent_block_id,
3367
+ block_tenure_a. index_block_hash( ) . to_string( )
3368
+ ) ;
3369
+
3323
3370
// Block C was built AFTER Block B was built, but BEFORE it was broadcasted, so it should be built off of Block A
3324
3371
assert_eq ! (
3325
3372
block_tenure_c. stacks_block_height,
3326
3373
block_tenure_a. stacks_block_height + 1
3327
3374
) ;
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
+ ) ;
3328
3403
3329
3404
coord_channel
3330
3405
. lock ( )
0 commit comments