@@ -158,7 +158,6 @@ impl Runner for SignerRunner {
158
158
debug ! ( "RUNNER: register_signer_to_aggregator" ) ;
159
159
160
160
let ( epoch, protocol_parameters) = {
161
- // Release the lock quickly at the end of this scope.
162
161
let epoch_service = self . services . epoch_service . read ( ) . await ;
163
162
let epoch = epoch_service. epoch_of_current_data ( ) ?;
164
163
let protocol_parameters = epoch_service. next_protocol_parameters ( ) ?;
@@ -260,18 +259,15 @@ impl Runner for SignerRunner {
260
259
}
261
260
262
261
async fn can_sign_current_epoch ( & self ) -> StdResult < bool > {
263
- let epoch = self . epoch_service_read ( ) . await . epoch_of_current_data ( ) ? ;
264
-
262
+ let epoch_service = self . epoch_service_read ( ) . await ;
263
+ let epoch = epoch_service . epoch_of_current_data ( ) ? ;
265
264
if let Some ( protocol_initializer) = self
266
265
. services
267
266
. protocol_initializer_store
268
267
. get_protocol_initializer ( epoch. offset_to_signer_retrieval_epoch ( ) ?)
269
268
. await ?
270
269
{
271
270
debug ! ( " > got protocol initializer for this epoch ({epoch})" ) ;
272
-
273
- let epoch_service = self . epoch_service_read ( ) . await ;
274
-
275
271
return epoch_service. can_signer_sign_current_epoch (
276
272
self . services . single_signer . get_party_id ( ) ,
277
273
protocol_initializer,
@@ -453,7 +449,7 @@ mod tests {
453
449
MKMap , MKMapNode , MKTreeNode , MKTreeStoreInMemory , MKTreeStorer , ProtocolInitializer ,
454
450
} ,
455
451
digesters:: { DumbImmutableDigester , DumbImmutableFileObserver } ,
456
- entities:: { BlockNumber , BlockRange , CardanoDbBeacon , Epoch } ,
452
+ entities:: { BlockNumber , BlockRange , CardanoDbBeacon , Epoch , ProtocolParameters } ,
457
453
era:: { adapters:: EraReaderBootstrapAdapter , EraChecker , EraReader } ,
458
454
signable_builder:: {
459
455
BlockRangeRootRetriever , CardanoImmutableFilesFullSignableBuilder ,
@@ -467,7 +463,10 @@ mod tests {
467
463
use mithril_persistence:: store:: adapter:: { DumbStoreAdapter , MemoryAdapter } ;
468
464
use mithril_persistence:: store:: { StakeStore , StakeStorer } ;
469
465
use mockall:: mock;
470
- use std:: { path:: Path , sync:: Arc } ;
466
+ use rand_chacha:: ChaCha20Rng ;
467
+ use rand_core:: SeedableRng ;
468
+
469
+ use std:: { path:: Path , path:: PathBuf , sync:: Arc } ;
471
470
472
471
use crate :: metrics:: MetricsService ;
473
472
use crate :: services:: {
@@ -509,6 +508,58 @@ mod tests {
509
508
}
510
509
}
511
510
511
+ struct FakeEpochServiceImpl {
512
+ epoch_returned : Epoch ,
513
+ can_signer_sign_current_epoch_returned : Result < bool , String > ,
514
+ }
515
+
516
+ #[ async_trait]
517
+ impl EpochService for FakeEpochServiceImpl {
518
+ fn inform_epoch_settings ( & mut self , _epoch_settings : EpochSettings ) -> StdResult < ( ) > {
519
+ Ok ( ( ) )
520
+ }
521
+ fn epoch_of_current_data ( & self ) -> StdResult < Epoch > {
522
+ Ok ( self . epoch_returned )
523
+ }
524
+ fn next_protocol_parameters ( & self ) -> StdResult < & ProtocolParameters > {
525
+ unimplemented ! ( )
526
+ }
527
+ fn current_signers ( & self ) -> StdResult < & Vec < Signer > > {
528
+ unimplemented ! ( )
529
+ }
530
+ fn next_signers ( & self ) -> StdResult < & Vec < Signer > > {
531
+ unimplemented ! ( )
532
+ }
533
+ async fn current_signers_with_stake ( & self ) -> StdResult < Vec < SignerWithStake > > {
534
+ Ok ( vec ! [ ] )
535
+ }
536
+ async fn next_signers_with_stake ( & self ) -> StdResult < Vec < SignerWithStake > > {
537
+ Ok ( vec ! [ ] )
538
+ }
539
+
540
+ fn can_signer_sign_current_epoch (
541
+ & self ,
542
+ _party_id : PartyId ,
543
+ _protocol_initializer : ProtocolInitializer ,
544
+ ) -> StdResult < bool > {
545
+ match & self . can_signer_sign_current_epoch_returned {
546
+ Ok ( result) => Ok ( * result) ,
547
+ Err ( e) => Err ( anyhow:: anyhow!( e. clone( ) ) ) ,
548
+ }
549
+ }
550
+ }
551
+
552
+ fn dummy_protocol_initializer ( ) -> ProtocolInitializer {
553
+ ProtocolInitializer :: setup (
554
+ fake_data:: protocol_parameters ( ) . into ( ) ,
555
+ None :: < PathBuf > ,
556
+ Some ( 0 ) ,
557
+ 1234 ,
558
+ & mut ChaCha20Rng :: from_seed ( [ 0 ; 32 ] ) ,
559
+ )
560
+ . unwrap ( )
561
+ }
562
+
512
563
async fn init_services ( ) -> SignerDependencyContainer {
513
564
let adapter: MemoryAdapter < Epoch , ProtocolInitializer > = MemoryAdapter :: new ( None ) . unwrap ( ) ;
514
565
let stake_distribution_signers = fake_data:: signers_with_stakes ( 2 ) ;
@@ -713,6 +764,125 @@ mod tests {
713
764
) ;
714
765
}
715
766
767
+ #[ tokio:: test]
768
+ async fn can_sign_signed_entity_type_when_signed_entity_type_is_locked ( ) {
769
+ let signed_entity_type = SignedEntityType :: MithrilStakeDistribution ( Epoch ( 9 ) ) ;
770
+ let signed_entity_type_lock = Arc :: new ( SignedEntityTypeLock :: new ( ) ) ;
771
+ signed_entity_type_lock. lock ( & signed_entity_type) . await ;
772
+ let mut services = init_services ( ) . await ;
773
+ services. signed_entity_type_lock = signed_entity_type_lock. clone ( ) ;
774
+
775
+ let runner = init_runner ( Some ( services) , None ) . await ;
776
+
777
+ assert ! (
778
+ !runner
779
+ . can_sign_signed_entity_type( & signed_entity_type)
780
+ . await
781
+ ) ;
782
+ }
783
+
784
+ #[ tokio:: test]
785
+ async fn can_sign_signed_entity_type_when_signed_entity_type_is_not_locked ( ) {
786
+ let signed_entity_type = SignedEntityType :: MithrilStakeDistribution ( Epoch ( 9 ) ) ;
787
+ let signed_entity_type_lock = Arc :: new ( SignedEntityTypeLock :: new ( ) ) ;
788
+ let mut services = init_services ( ) . await ;
789
+ services. signed_entity_type_lock = signed_entity_type_lock. clone ( ) ;
790
+
791
+ let runner = init_runner ( Some ( services) , None ) . await ;
792
+
793
+ assert ! (
794
+ runner
795
+ . can_sign_signed_entity_type( & signed_entity_type)
796
+ . await
797
+ ) ;
798
+ }
799
+
800
+ #[ tokio:: test]
801
+ async fn can_sign_current_epoch_returns_false_when_epoch_service_returns_false ( ) {
802
+ let mut services = init_services ( ) . await ;
803
+ let epoch_service = FakeEpochServiceImpl {
804
+ epoch_returned : Epoch ( 8 ) ,
805
+ can_signer_sign_current_epoch_returned : Ok ( false ) ,
806
+ } ;
807
+ services. epoch_service = Arc :: new ( RwLock :: new ( epoch_service) ) ;
808
+
809
+ services
810
+ . protocol_initializer_store
811
+ . save_protocol_initializer ( Epoch ( 7 ) , dummy_protocol_initializer ( ) )
812
+ . await
813
+ . unwrap ( ) ;
814
+
815
+ let runner = init_runner ( Some ( services) , None ) . await ;
816
+
817
+ assert ! ( !runner. can_sign_current_epoch( ) . await . unwrap( ) ) ;
818
+ }
819
+
820
+ #[ tokio:: test]
821
+ async fn can_sign_current_epoch_returns_true_when_epoch_service_returns_true ( ) {
822
+ let mut services = init_services ( ) . await ;
823
+
824
+ let epoch_service = FakeEpochServiceImpl {
825
+ epoch_returned : Epoch ( 8 ) ,
826
+ can_signer_sign_current_epoch_returned : Ok ( true ) ,
827
+ } ;
828
+ services. epoch_service = Arc :: new ( RwLock :: new ( epoch_service) ) ;
829
+
830
+ services
831
+ . protocol_initializer_store
832
+ . save_protocol_initializer ( Epoch ( 7 ) , dummy_protocol_initializer ( ) )
833
+ . await
834
+ . unwrap ( ) ;
835
+
836
+ let runner = init_runner ( Some ( services) , None ) . await ;
837
+
838
+ assert ! ( runner. can_sign_current_epoch( ) . await . unwrap( ) ) ;
839
+ }
840
+
841
+ #[ tokio:: test]
842
+ async fn can_sign_current_epoch_when_epoch_service_returns_error ( ) {
843
+ let mut services = init_services ( ) . await ;
844
+
845
+ let epoch_service = FakeEpochServiceImpl {
846
+ epoch_returned : Epoch ( 8 ) ,
847
+ can_signer_sign_current_epoch_returned : Err ( "Simulate an error" . to_string ( ) ) ,
848
+ } ;
849
+ services. epoch_service = Arc :: new ( RwLock :: new ( epoch_service) ) ;
850
+
851
+ services
852
+ . protocol_initializer_store
853
+ . save_protocol_initializer ( Epoch ( 7 ) , dummy_protocol_initializer ( ) )
854
+ . await
855
+ . unwrap ( ) ;
856
+
857
+ let runner = init_runner ( Some ( services) , None ) . await ;
858
+
859
+ assert ! ( runner. can_sign_current_epoch( ) . await . is_err( ) ) ;
860
+ }
861
+
862
+ #[ tokio:: test]
863
+ async fn can_sign_current_epoch_returns_false_when_cannot_get_protocol_initializer_for_current_epoch (
864
+ ) {
865
+ let mut services = init_services ( ) . await ;
866
+
867
+ let epoch_service = FakeEpochServiceImpl {
868
+ epoch_returned : Epoch ( 8 ) ,
869
+ can_signer_sign_current_epoch_returned : Ok ( true ) ,
870
+ } ;
871
+ services. epoch_service = Arc :: new ( RwLock :: new ( epoch_service) ) ;
872
+
873
+ let runner = init_runner ( Some ( services) , None ) . await ;
874
+
875
+ assert ! ( runner
876
+ . services
877
+ . protocol_initializer_store
878
+ . get_protocol_initializer( Epoch ( 7 ) )
879
+ . await
880
+ . unwrap( )
881
+ . is_none( ) ) ;
882
+
883
+ assert ! ( !runner. can_sign_current_epoch( ) . await . unwrap( ) ) ;
884
+ }
885
+
716
886
#[ tokio:: test]
717
887
async fn test_compute_message ( ) {
718
888
let mut services = init_services ( ) . await ;
0 commit comments