@@ -713,7 +713,7 @@ impl MultipleMinerTest {
713
713
sortdb : & SortitionDB ,
714
714
cause : TenureChangeCause ,
715
715
timeout_secs : u64 ,
716
- ) -> Result < ( ) , String > {
716
+ ) -> Result < serde_json :: Value , String > {
717
717
let start = Instant :: now ( ) ;
718
718
let stacks_height_before = self . get_peer_stacks_tip_height ( ) ;
719
719
self . mine_bitcoin_blocks_and_confirm ( sortdb, 1 , timeout_secs) ?;
@@ -941,7 +941,8 @@ fn wait_for_tenure_change_tx(
941
941
timeout_secs : u64 ,
942
942
cause : TenureChangeCause ,
943
943
expected_height : u64 ,
944
- ) -> Result < ( ) , String > {
944
+ ) -> Result < serde_json:: Value , String > {
945
+ let mut result = None ;
945
946
wait_for ( timeout_secs, || {
946
947
let blocks = test_observer:: get_blocks ( ) ;
947
948
for block in blocks {
@@ -956,14 +957,16 @@ fn wait_for_tenure_change_tx(
956
957
if let TransactionPayload :: TenureChange ( payload) = & parsed. payload {
957
958
if payload. cause == cause {
958
959
info ! ( "Found tenure change transaction: {parsed:?}" ) ;
960
+ result = Some ( block) ;
959
961
return Ok ( true ) ;
960
962
}
961
963
}
962
964
}
963
965
}
964
966
}
965
967
Ok ( false )
966
- } )
968
+ } ) ?;
969
+ Ok ( result. unwrap ( ) )
967
970
}
968
971
969
972
/// Waits for a block proposal to be observed in the test_observer stackerdb chunks at the expected height
@@ -3166,16 +3169,19 @@ fn tenure_extend_with_other_transactions() {
3166
3169
let idle_timeout = Duration :: from_secs ( 30 ) ;
3167
3170
let mut signer_test: SignerTest < SpawnedSigner > = SignerTest :: new_with_config_modifications (
3168
3171
num_signers,
3169
- vec ! [ ( sender_addr, send_amt + send_fee) ] ,
3172
+ vec ! [ ( sender_addr, ( send_amt + send_fee) * 2 ) ] ,
3170
3173
|config| {
3171
3174
config. tenure_idle_timeout = idle_timeout;
3175
+ config. tenure_idle_timeout_buffer = Duration :: from_secs ( 1 ) ;
3172
3176
} ,
3173
3177
|config| {
3174
3178
config. miner . tenure_extend_cost_threshold = 0 ;
3175
3179
} ,
3176
3180
None ,
3177
3181
None ,
3178
3182
) ;
3183
+ let miner_sk = signer_test. running_nodes . conf . miner . mining_key . unwrap ( ) ;
3184
+ let miner_pk = StacksPublicKey :: from_private ( & miner_sk) ;
3179
3185
let http_origin = format ! ( "http://{}" , & signer_test. running_nodes. conf. node. rpc_bind) ;
3180
3186
3181
3187
signer_test. boot_to_epoch_3 ( ) ;
@@ -3186,65 +3192,62 @@ fn tenure_extend_with_other_transactions() {
3186
3192
info ! ( "Pause miner so it doesn't propose a block before the tenure extend" ) ;
3187
3193
TEST_MINE_STALL . set ( true ) ;
3188
3194
3189
- // Submit a transaction to be included with the tenure extend
3195
+ info ! ( "---- Trigger a block proposal but pause its broadcast ----" ) ;
3196
+ let stacks_tip_height = get_chain_info ( & signer_test. running_nodes . conf ) . stacks_tip_height ;
3197
+ // Submit a transaction to force a response from signers that indicate that the tenure extend timeout is exceeded
3198
+ let mut sender_nonce = 0 ;
3190
3199
let transfer_tx = make_stacks_transfer (
3191
3200
& sender_sk,
3192
- 0 ,
3201
+ sender_nonce ,
3193
3202
send_fee,
3194
3203
signer_test. running_nodes . conf . burnchain . chain_id ,
3195
3204
& recipient,
3196
3205
send_amt,
3197
3206
) ;
3198
- let _tx = submit_tx ( & http_origin, & transfer_tx) ;
3207
+ let _ = submit_tx ( & http_origin, & transfer_tx) ;
3208
+ sender_nonce += 1 ;
3209
+
3210
+ TEST_BROADCAST_PROPOSAL_STALL . set ( vec ! [ miner_pk] ) ;
3211
+ TEST_MINE_STALL . set ( false ) ;
3199
3212
3200
3213
info ! ( "---- Wait for tenure extend timeout ----" ) ;
3214
+ sleep_ms ( idle_timeout. as_millis ( ) as u64 + 5 ) ;
3201
3215
3202
- sleep_ms ( idle_timeout. as_millis ( ) as u64 + 1000 ) ;
3216
+ TEST_MINE_STALL . set ( true ) ;
3217
+ TEST_BROADCAST_PROPOSAL_STALL . set ( vec ! [ ] ) ;
3218
+ // Submit a transaction to be included with the tenure extend
3219
+ let transfer_tx = make_stacks_transfer (
3220
+ & sender_sk,
3221
+ sender_nonce,
3222
+ send_fee,
3223
+ signer_test. running_nodes . conf . burnchain . chain_id ,
3224
+ & recipient,
3225
+ send_amt,
3226
+ ) ;
3227
+ let to_find = submit_tx ( & http_origin, & transfer_tx) ;
3203
3228
3204
- info ! ( "---- Resume miner to propose a block with the tenure extend ----" ) ;
3229
+ info ! ( "---- Resume miner to propose a block with the tenure extend and transfer tx ----" ) ;
3205
3230
TEST_MINE_STALL . set ( false ) ;
3206
-
3207
3231
// Now, wait for a block with a tenure extend
3208
- wait_for ( idle_timeout. as_secs ( ) + 10 , || {
3209
- let blocks = test_observer:: get_blocks ( ) ;
3210
- let last_block = & blocks. last ( ) . unwrap ( ) ;
3211
- let transactions = last_block[ "transactions" ] . as_array ( ) . unwrap ( ) ;
3212
- let ( first_tx, other_txs) = transactions. split_first ( ) . unwrap ( ) ;
3213
- let raw_tx = first_tx[ "raw_tx" ] . as_str ( ) . unwrap ( ) ;
3214
- let tx_bytes = hex_bytes ( & raw_tx[ 2 ..] ) . unwrap ( ) ;
3215
- let parsed = StacksTransaction :: consensus_deserialize ( & mut & tx_bytes[ ..] ) . unwrap ( ) ;
3216
- let found_tenure_extend = match & parsed. payload {
3217
- TransactionPayload :: TenureChange ( payload)
3218
- if payload. cause == TenureChangeCause :: Extended =>
3219
- {
3220
- info ! ( "Found tenure extend transaction: {parsed:?}" ) ;
3221
- true
3222
- }
3223
- _ => false ,
3224
- } ;
3225
- if found_tenure_extend {
3226
- let found_transfer = other_txs. iter ( ) . any ( |tx| {
3227
- let raw_tx = tx[ "raw_tx" ] . as_str ( ) . unwrap ( ) ;
3228
- let tx_bytes = hex_bytes ( & raw_tx[ 2 ..] ) . unwrap ( ) ;
3229
- let parsed = StacksTransaction :: consensus_deserialize ( & mut & tx_bytes[ ..] ) . unwrap ( ) ;
3230
- match & parsed. payload {
3231
- TransactionPayload :: TokenTransfer ( ..) => true ,
3232
- _ => false ,
3233
- }
3234
- } ) ;
3235
- if found_transfer {
3236
- info ! ( "Found transfer transaction" ) ;
3237
- Ok ( true )
3238
- } else {
3239
- Err ( "No transfer transaction found together with the tenure extend" . to_string ( ) )
3240
- }
3241
- } else {
3242
- info ! ( "No tenure change transaction found" ) ;
3243
- Ok ( false )
3244
- }
3245
- } )
3232
+ let block = wait_for_tenure_change_tx (
3233
+ idle_timeout. as_secs ( ) + 10 ,
3234
+ TenureChangeCause :: Extended ,
3235
+ stacks_tip_height + 2 ,
3236
+ )
3246
3237
. expect ( "Timed out waiting for a block with a tenure extend" ) ;
3247
-
3238
+ let transactions = block[ "transactions" ] . as_array ( ) . unwrap ( ) ;
3239
+ assert ! (
3240
+ transactions. len( ) > 1 ,
3241
+ "Expected at least 2 transactions in the block"
3242
+ ) ;
3243
+ assert ! (
3244
+ transactions. iter( ) . any( |tx| {
3245
+ let tx = tx. as_object( ) . unwrap( ) ;
3246
+ let txid = tx[ "txid" ] . as_str( ) . unwrap( ) ;
3247
+ txid[ 2 ..] == to_find
3248
+ } ) ,
3249
+ "Failed to find the transfer tx in the block"
3250
+ ) ;
3248
3251
signer_test. shutdown ( ) ;
3249
3252
}
3250
3253
0 commit comments