@@ -796,7 +796,8 @@ fn reloads_signer_set_in() {
796
796
Some ( Duration :: from_secs ( 15 ) ) ,
797
797
|_config| { } ,
798
798
|_| { } ,
799
- & [ ] ,
799
+ None ,
800
+ None ,
800
801
) ;
801
802
802
803
setup_epoch_3_reward_set (
@@ -925,7 +926,8 @@ fn forked_tenure_testing(
925
926
config. broadcast_signed_blocks = false ;
926
927
} ,
927
928
|_| { } ,
928
- & [ ] ,
929
+ None ,
930
+ None ,
929
931
) ;
930
932
let http_origin = format ! ( "http://{}" , & signer_test. running_nodes. conf. node. rpc_bind) ;
931
933
@@ -1429,7 +1431,8 @@ fn multiple_miners() {
1429
1431
false
1430
1432
} )
1431
1433
} ,
1432
- & [ btc_miner_1_pk. clone ( ) , btc_miner_2_pk. clone ( ) ] ,
1434
+ Some ( vec ! [ btc_miner_1_pk. clone( ) , btc_miner_2_pk. clone( ) ] ) ,
1435
+ None ,
1433
1436
) ;
1434
1437
let conf = signer_test. running_nodes . conf . clone ( ) ;
1435
1438
let mut conf_node_2 = conf. clone ( ) ;
@@ -1694,7 +1697,8 @@ fn miner_forking() {
1694
1697
false
1695
1698
} )
1696
1699
} ,
1697
- & [ btc_miner_1_pk. clone ( ) , btc_miner_2_pk. clone ( ) ] ,
1700
+ Some ( vec ! [ btc_miner_1_pk. clone( ) , btc_miner_2_pk. clone( ) ] ) ,
1701
+ None ,
1698
1702
) ;
1699
1703
let conf = signer_test. running_nodes . conf . clone ( ) ;
1700
1704
let mut conf_node_2 = conf. clone ( ) ;
@@ -2274,7 +2278,8 @@ fn empty_sortition() {
2274
2278
config. block_proposal_timeout = block_proposal_timeout;
2275
2279
} ,
2276
2280
|_| { } ,
2277
- & [ ] ,
2281
+ None ,
2282
+ None ,
2278
2283
) ;
2279
2284
let http_origin = format ! ( "http://{}" , & signer_test. running_nodes. conf. node. rpc_bind) ;
2280
2285
let short_timeout = Duration :: from_secs ( 20 ) ;
@@ -2455,7 +2460,8 @@ fn mock_sign_epoch_25() {
2455
2460
}
2456
2461
}
2457
2462
} ,
2458
- & [ ] ,
2463
+ None ,
2464
+ None ,
2459
2465
) ;
2460
2466
2461
2467
let epochs = signer_test
@@ -2659,7 +2665,8 @@ fn signer_set_rollover() {
2659
2665
}
2660
2666
naka_conf. node . rpc_bind = rpc_bind. clone ( ) ;
2661
2667
} ,
2662
- & [ ] ,
2668
+ None ,
2669
+ None ,
2663
2670
) ;
2664
2671
assert_eq ! (
2665
2672
new_spawned_signers[ 0 ] . config. node_host,
@@ -2873,7 +2880,8 @@ fn min_gap_between_blocks() {
2873
2880
|config| {
2874
2881
config. miner . min_time_between_blocks_ms = time_between_blocks_ms;
2875
2882
} ,
2876
- & [ ] ,
2883
+ None ,
2884
+ None ,
2877
2885
) ;
2878
2886
2879
2887
let http_origin = format ! ( "http://{}" , & signer_test. running_nodes. conf. node. rpc_bind) ;
@@ -2945,3 +2953,76 @@ fn min_gap_between_blocks() {
2945
2953
2946
2954
signer_test. shutdown ( ) ;
2947
2955
}
2956
+
2957
+ #[ test]
2958
+ #[ ignore]
2959
+ /// Test scenario where there are duplicate signers with the same private key
2960
+ /// First submitted signature should take precedence
2961
+ fn duplicate_signers ( ) {
2962
+ if env:: var ( "BITCOIND_TEST" ) != Ok ( "1" . into ( ) ) {
2963
+ return ;
2964
+ }
2965
+
2966
+ tracing_subscriber:: registry ( )
2967
+ . with ( fmt:: layer ( ) )
2968
+ . with ( EnvFilter :: from_default_env ( ) )
2969
+ . init ( ) ;
2970
+
2971
+ // Disable p2p broadcast of the nakamoto blocks, so that we rely
2972
+ // on the signer's using StackerDB to get pushed blocks
2973
+ * nakamoto_node:: miner:: TEST_SKIP_P2P_BROADCAST
2974
+ . lock ( )
2975
+ . unwrap ( ) = Some ( true ) ;
2976
+
2977
+ info ! ( "------------------------- Test Setup -------------------------" ) ;
2978
+ let num_signers = 5 ;
2979
+ let mut signer_stacks_private_keys = ( 0 ..num_signers)
2980
+ . map ( |_| StacksPrivateKey :: new ( ) )
2981
+ . collect :: < Vec < _ > > ( ) ;
2982
+
2983
+ // First two signers have same private key
2984
+ signer_stacks_private_keys[ 1 ] = signer_stacks_private_keys[ 0 ] ;
2985
+
2986
+ let mut signer_test: SignerTest < SpawnedSigner > = SignerTest :: new_with_config_modifications (
2987
+ num_signers,
2988
+ vec ! [ ] ,
2989
+ None ,
2990
+ |_| { } ,
2991
+ |_| { } ,
2992
+ None ,
2993
+ Some ( signer_stacks_private_keys) ,
2994
+ ) ;
2995
+ let timeout = Duration :: from_secs ( 30 ) ;
2996
+ let mined_blocks = signer_test. running_nodes . nakamoto_blocks_mined . clone ( ) ;
2997
+ let blocks_mined_before = mined_blocks. load ( Ordering :: SeqCst ) ;
2998
+
2999
+ signer_test. boot_to_epoch_3 ( ) ;
3000
+
3001
+ // give the system a chance to reach the Nakamoto start tip
3002
+ // mine a Nakamoto block
3003
+ wait_for ( 30 , || {
3004
+ let blocks_mined = mined_blocks. load ( Ordering :: SeqCst ) ;
3005
+ Ok ( blocks_mined > blocks_mined_before)
3006
+ } )
3007
+ . unwrap ( ) ;
3008
+
3009
+ info ! ( "------------------------- Test Mine and Verify Confirmed Nakamoto Block -------------------------" ) ;
3010
+ signer_test. mine_and_verify_confirmed_naka_block ( timeout, num_signers) ;
3011
+
3012
+ // Test prometheus metrics response
3013
+ #[ cfg( feature = "monitoring_prom" ) ]
3014
+ {
3015
+ let metrics_response = signer_test. get_signer_metrics ( ) ;
3016
+
3017
+ // Because 5 signers are running in the same process, the prometheus metrics
3018
+ // are incremented once for every signer. This is why we expect the metric to be
3019
+ // `5`, even though there is only one block proposed.
3020
+ let expected_result = format ! ( "stacks_signer_block_proposals_received {}" , num_signers) ;
3021
+ assert ! ( metrics_response. contains( & expected_result) ) ;
3022
+ let expected_result = format ! (
3023
+ "stacks_signer_block_responses_sent{{response_type=\" accepted\" }} {}" ,
3024
+ num_signers
3025
+ ) ;
3026
+ assert ! ( metrics_response. contains( & expected_result) ) ;
3027
+ }
3028
+ }
0 commit comments