@@ -2982,6 +2982,7 @@ fn duplicate_signers() {
2982
2982
2983
2983
// First two signers have same private key
2984
2984
signer_stacks_private_keys[ 1 ] = signer_stacks_private_keys[ 0 ] ;
2985
+ let unique_signers = num_signers - 1 ;
2985
2986
let duplicate_pubkey = Secp256k1PublicKey :: from_private ( & signer_stacks_private_keys[ 0 ] ) ;
2986
2987
let duplicate_pubkey_from_copy =
2987
2988
Secp256k1PublicKey :: from_private ( & signer_stacks_private_keys[ 1 ] ) ;
@@ -3007,5 +3008,53 @@ fn duplicate_signers() {
3007
3008
3008
3009
signer_test. mine_and_verify_confirmed_naka_block ( timeout, num_signers) ;
3009
3010
3011
+ info ! ( "------------------------- Read all `BlockResponse::Accepted` messages -------------------------" ) ;
3012
+
3013
+ let mut signer_accepted_responses = vec ! [ ] ;
3014
+ let start_polling = Instant :: now ( ) ;
3015
+ while start_polling. elapsed ( ) <= timeout {
3016
+ std:: thread:: sleep ( Duration :: from_secs ( 1 ) ) ;
3017
+ let messages = test_observer:: get_stackerdb_chunks ( )
3018
+ . into_iter ( )
3019
+ . flat_map ( |chunk| chunk. modified_slots )
3020
+ . filter_map ( |chunk| {
3021
+ SignerMessage :: consensus_deserialize ( & mut chunk. data . as_slice ( ) ) . ok ( )
3022
+ } )
3023
+ . filter_map ( |message| match message {
3024
+ SignerMessage :: BlockResponse ( BlockResponse :: Accepted ( m) ) => {
3025
+ info ! ( "Message(accepted): {message:?}" ) ;
3026
+ Some ( m)
3027
+ }
3028
+ _ => {
3029
+ debug ! ( "Message(ignored): {message:?}" ) ;
3030
+ None
3031
+ }
3032
+ } ) ;
3033
+ signer_accepted_responses. extend ( messages) ;
3034
+ }
3035
+
3036
+ info ! ( "------------------------- Assert there are {unique_signers} unique signatures and recovered pubkeys -------------------------" ) ;
3037
+
3038
+ // Pick a message hash
3039
+ let ( selected_sighash, _) = signer_accepted_responses
3040
+ . iter ( )
3041
+ . min_by_key ( |( sighash, _) | * sighash)
3042
+ . copied ( )
3043
+ . expect ( "No `BlockResponse::Accepted` messages recieved" ) ;
3044
+
3045
+ // Filter only resonses for selected block and collect unique pubkeys and signatures
3046
+ let ( pubkeys, signatures) : ( HashSet < _ > , HashSet < _ > ) = signer_accepted_responses
3047
+ . into_iter ( )
3048
+ . filter ( |( hash, _) | * hash == selected_sighash)
3049
+ . map ( |( msg, sig) | {
3050
+ let pubkey = Secp256k1PublicKey :: recover_to_pubkey ( msg. bits ( ) , & sig)
3051
+ . expect ( "Failed to recover pubkey" ) ;
3052
+ ( pubkey, sig)
3053
+ } )
3054
+ . unzip ( ) ;
3055
+
3056
+ assert_eq ! ( pubkeys. len( ) , unique_signers) ;
3057
+ assert_eq ! ( signatures. len( ) , unique_signers) ;
3058
+
3010
3059
signer_test. shutdown ( ) ;
3011
3060
}
0 commit comments