@@ -711,7 +711,7 @@ impl MultipleMinerTest {
711
711
sortdb : & SortitionDB ,
712
712
cause : TenureChangeCause ,
713
713
timeout_secs : u64 ,
714
- ) -> Result < ( ) , String > {
714
+ ) -> Result < serde_json :: Value , String > {
715
715
let start = Instant :: now ( ) ;
716
716
let stacks_height_before = self . get_peer_stacks_tip_height ( ) ;
717
717
self . mine_bitcoin_blocks_and_confirm ( sortdb, 1 , timeout_secs) ?;
@@ -939,7 +939,8 @@ fn wait_for_tenure_change_tx(
939
939
timeout_secs : u64 ,
940
940
cause : TenureChangeCause ,
941
941
expected_height : u64 ,
942
- ) -> Result < ( ) , String > {
942
+ ) -> Result < serde_json:: Value , String > {
943
+ let mut result = None ;
943
944
wait_for ( timeout_secs, || {
944
945
let blocks = test_observer:: get_blocks ( ) ;
945
946
for block in blocks {
@@ -954,14 +955,16 @@ fn wait_for_tenure_change_tx(
954
955
if let TransactionPayload :: TenureChange ( payload) = & parsed. payload {
955
956
if payload. cause == cause {
956
957
info ! ( "Found tenure change transaction: {parsed:?}" ) ;
958
+ result = Some ( block) ;
957
959
return Ok ( true ) ;
958
960
}
959
961
}
960
962
}
961
963
}
962
964
}
963
965
Ok ( false )
964
- } )
966
+ } ) ?;
967
+ Ok ( result. unwrap ( ) )
965
968
}
966
969
967
970
/// Waits for a block proposal to be observed in the test_observer stackerdb chunks at the expected height
@@ -3040,16 +3043,19 @@ fn tenure_extend_with_other_transactions() {
3040
3043
let idle_timeout = Duration :: from_secs ( 30 ) ;
3041
3044
let mut signer_test: SignerTest < SpawnedSigner > = SignerTest :: new_with_config_modifications (
3042
3045
num_signers,
3043
- vec ! [ ( sender_addr, send_amt + send_fee) ] ,
3046
+ vec ! [ ( sender_addr, ( send_amt + send_fee) * 2 ) ] ,
3044
3047
|config| {
3045
3048
config. tenure_idle_timeout = idle_timeout;
3049
+ config. tenure_idle_timeout_buffer = Duration :: from_secs ( 1 ) ;
3046
3050
} ,
3047
3051
|config| {
3048
3052
config. miner . tenure_extend_cost_threshold = 0 ;
3049
3053
} ,
3050
3054
None ,
3051
3055
None ,
3052
3056
) ;
3057
+ let miner_sk = signer_test. running_nodes . conf . miner . mining_key . unwrap ( ) ;
3058
+ let miner_pk = StacksPublicKey :: from_private ( & miner_sk) ;
3053
3059
let http_origin = format ! ( "http://{}" , & signer_test. running_nodes. conf. node. rpc_bind) ;
3054
3060
3055
3061
signer_test. boot_to_epoch_3 ( ) ;
@@ -3060,65 +3066,62 @@ fn tenure_extend_with_other_transactions() {
3060
3066
info ! ( "Pause miner so it doesn't propose a block before the tenure extend" ) ;
3061
3067
TEST_MINE_STALL . set ( true ) ;
3062
3068
3063
- // Submit a transaction to be included with the tenure extend
3069
+ info ! ( "---- Trigger a block proposal but pause its broadcast ----" ) ;
3070
+ let stacks_tip_height = get_chain_info ( & signer_test. running_nodes . conf ) . stacks_tip_height ;
3071
+ // Submit a transaction to force a response from signers that indicate that the tenure extend timeout is exceeded
3072
+ let mut sender_nonce = 0 ;
3064
3073
let transfer_tx = make_stacks_transfer (
3065
3074
& sender_sk,
3066
- 0 ,
3075
+ sender_nonce ,
3067
3076
send_fee,
3068
3077
signer_test. running_nodes . conf . burnchain . chain_id ,
3069
3078
& recipient,
3070
3079
send_amt,
3071
3080
) ;
3072
- let _tx = submit_tx ( & http_origin, & transfer_tx) ;
3081
+ let _ = submit_tx ( & http_origin, & transfer_tx) ;
3082
+ sender_nonce += 1 ;
3083
+
3084
+ TEST_BROADCAST_PROPOSAL_STALL . set ( vec ! [ miner_pk] ) ;
3085
+ TEST_MINE_STALL . set ( false ) ;
3073
3086
3074
3087
info ! ( "---- Wait for tenure extend timeout ----" ) ;
3088
+ sleep_ms ( idle_timeout. as_millis ( ) as u64 + 5 ) ;
3075
3089
3076
- sleep_ms ( idle_timeout. as_millis ( ) as u64 + 1000 ) ;
3090
+ TEST_MINE_STALL . set ( true ) ;
3091
+ TEST_BROADCAST_PROPOSAL_STALL . set ( vec ! [ ] ) ;
3092
+ // Submit a transaction to be included with the tenure extend
3093
+ let transfer_tx = make_stacks_transfer (
3094
+ & sender_sk,
3095
+ sender_nonce,
3096
+ send_fee,
3097
+ signer_test. running_nodes . conf . burnchain . chain_id ,
3098
+ & recipient,
3099
+ send_amt,
3100
+ ) ;
3101
+ let to_find = submit_tx ( & http_origin, & transfer_tx) ;
3077
3102
3078
- info ! ( "---- Resume miner to propose a block with the tenure extend ----" ) ;
3103
+ info ! ( "---- Resume miner to propose a block with the tenure extend and transfer tx ----" ) ;
3079
3104
TEST_MINE_STALL . set ( false ) ;
3080
-
3081
3105
// Now, wait for a block with a tenure extend
3082
- wait_for ( idle_timeout. as_secs ( ) + 10 , || {
3083
- let blocks = test_observer:: get_blocks ( ) ;
3084
- let last_block = & blocks. last ( ) . unwrap ( ) ;
3085
- let transactions = last_block[ "transactions" ] . as_array ( ) . unwrap ( ) ;
3086
- let ( first_tx, other_txs) = transactions. split_first ( ) . unwrap ( ) ;
3087
- let raw_tx = first_tx[ "raw_tx" ] . as_str ( ) . unwrap ( ) ;
3088
- let tx_bytes = hex_bytes ( & raw_tx[ 2 ..] ) . unwrap ( ) ;
3089
- let parsed = StacksTransaction :: consensus_deserialize ( & mut & tx_bytes[ ..] ) . unwrap ( ) ;
3090
- let found_tenure_extend = match & parsed. payload {
3091
- TransactionPayload :: TenureChange ( payload)
3092
- if payload. cause == TenureChangeCause :: Extended =>
3093
- {
3094
- info ! ( "Found tenure extend transaction: {parsed:?}" ) ;
3095
- true
3096
- }
3097
- _ => false ,
3098
- } ;
3099
- if found_tenure_extend {
3100
- let found_transfer = other_txs. iter ( ) . any ( |tx| {
3101
- let raw_tx = tx[ "raw_tx" ] . as_str ( ) . unwrap ( ) ;
3102
- let tx_bytes = hex_bytes ( & raw_tx[ 2 ..] ) . unwrap ( ) ;
3103
- let parsed = StacksTransaction :: consensus_deserialize ( & mut & tx_bytes[ ..] ) . unwrap ( ) ;
3104
- match & parsed. payload {
3105
- TransactionPayload :: TokenTransfer ( ..) => true ,
3106
- _ => false ,
3107
- }
3108
- } ) ;
3109
- if found_transfer {
3110
- info ! ( "Found transfer transaction" ) ;
3111
- Ok ( true )
3112
- } else {
3113
- Err ( "No transfer transaction found together with the tenure extend" . to_string ( ) )
3114
- }
3115
- } else {
3116
- info ! ( "No tenure change transaction found" ) ;
3117
- Ok ( false )
3118
- }
3119
- } )
3106
+ let block = wait_for_tenure_change_tx (
3107
+ idle_timeout. as_secs ( ) + 10 ,
3108
+ TenureChangeCause :: Extended ,
3109
+ stacks_tip_height + 2 ,
3110
+ )
3120
3111
. expect ( "Timed out waiting for a block with a tenure extend" ) ;
3121
-
3112
+ let transactions = block[ "transactions" ] . as_array ( ) . unwrap ( ) ;
3113
+ assert ! (
3114
+ transactions. len( ) > 1 ,
3115
+ "Expected at least 2 transactions in the block"
3116
+ ) ;
3117
+ assert ! (
3118
+ transactions. iter( ) . any( |tx| {
3119
+ let tx = tx. as_object( ) . unwrap( ) ;
3120
+ let txid = tx[ "txid" ] . as_str( ) . unwrap( ) ;
3121
+ txid[ 2 ..] == to_find
3122
+ } ) ,
3123
+ "Failed to find the transfer tx in the block"
3124
+ ) ;
3122
3125
signer_test. shutdown ( ) ;
3123
3126
}
3124
3127
0 commit comments