@@ -86,6 +86,10 @@ pub trait Runner {
86
86
& self ,
87
87
maybe_signature : Option < SingleSignatures > ,
88
88
) -> Result < ( ) , Box < dyn StdError + Sync + Send > > ;
89
+
90
+ /// Read the current era and update the EraChecker.
91
+ async fn update_era_checker ( & self , epoch : Epoch )
92
+ -> Result < ( ) , Box < dyn StdError + Sync + Send > > ;
89
93
}
90
94
91
95
/// This type represents the errors thrown from the Runner.
@@ -429,6 +433,25 @@ impl Runner for SignerRunner {
429
433
Ok ( ( ) )
430
434
}
431
435
}
436
+
437
+ async fn update_era_checker (
438
+ & self ,
439
+ epoch : Epoch ,
440
+ ) -> Result < ( ) , Box < dyn StdError + Sync + Send > > {
441
+ let era_token = self
442
+ . services
443
+ . era_reader
444
+ . read_era_epoch_token ( epoch)
445
+ . await
446
+ . map_err ( |e| Box :: new ( e) ) ?;
447
+
448
+ self . services . era_checker . change_era (
449
+ era_token. get_current_supported_era ( ) ?,
450
+ era_token. get_current_epoch ( ) ,
451
+ ) ;
452
+
453
+ Ok ( ( ) )
454
+ }
432
455
}
433
456
434
457
#[ cfg( test) ]
@@ -438,7 +461,7 @@ mod tests {
438
461
crypto_helper:: ProtocolInitializer ,
439
462
digesters:: { DumbImmutableDigester , DumbImmutableFileObserver } ,
440
463
entities:: { Epoch , StakeDistribution } ,
441
- era:: { EraChecker , SupportedEra } ,
464
+ era:: { adapters :: EraReaderBootstrapAdapter , EraChecker , EraReader } ,
442
465
store:: {
443
466
adapter:: { DumbStoreAdapter , MemoryAdapter } ,
444
467
StakeStore , StakeStorer ,
@@ -467,34 +490,45 @@ mod tests {
467
490
}
468
491
}
469
492
470
- fn init_services ( ) -> SignerServices {
493
+ async fn init_services ( ) -> SignerServices {
471
494
let adapter: MemoryAdapter < Epoch , ProtocolInitializer > = MemoryAdapter :: new ( None ) . unwrap ( ) ;
472
495
let chain_observer = Arc :: new ( FakeObserver :: default ( ) ) ;
473
- let era_checker = Arc :: new ( EraChecker :: new ( SupportedEra :: dummy ( ) ) ) ;
496
+ let beacon_provider = Arc :: new ( BeaconProviderImpl :: new (
497
+ chain_observer. clone ( ) ,
498
+ Arc :: new ( DumbImmutableFileObserver :: default ( ) ) ,
499
+ CardanoNetwork :: TestNet ( 42 ) ,
500
+ ) ) ;
501
+ let era_reader = Arc :: new ( EraReader :: new ( Box :: new ( EraReaderBootstrapAdapter ) ) ) ;
502
+ let era_epoch_token = era_reader
503
+ . read_era_epoch_token ( beacon_provider. get_current_beacon ( ) . await . unwrap ( ) . epoch )
504
+ . await
505
+ . unwrap ( ) ;
506
+ let era_checker = Arc :: new ( EraChecker :: new (
507
+ era_epoch_token. get_current_supported_era ( ) . unwrap ( ) ,
508
+ era_epoch_token. get_current_epoch ( ) ,
509
+ ) ) ;
510
+
474
511
SignerServices {
475
512
stake_store : Arc :: new ( StakeStore :: new ( Box :: new ( DumbStoreAdapter :: new ( ) ) , None ) ) ,
476
513
certificate_handler : Arc :: new ( DumbCertificateHandler :: default ( ) ) ,
477
- chain_observer : chain_observer . clone ( ) ,
514
+ chain_observer,
478
515
digester : Arc :: new ( DumbImmutableDigester :: new ( DIGESTER_RESULT , true ) ) ,
479
516
single_signer : Arc :: new ( MithrilSingleSigner :: new ( "1" . to_string ( ) ) ) ,
480
- beacon_provider : Arc :: new ( BeaconProviderImpl :: new (
481
- chain_observer,
482
- Arc :: new ( DumbImmutableFileObserver :: default ( ) ) ,
483
- CardanoNetwork :: TestNet ( 42 ) ,
484
- ) ) ,
517
+ beacon_provider,
485
518
protocol_initializer_store : Arc :: new ( ProtocolInitializerStore :: new (
486
519
Box :: new ( adapter) ,
487
520
None ,
488
521
) ) ,
489
522
era_checker,
523
+ era_reader,
490
524
}
491
525
}
492
526
493
- fn init_runner (
527
+ async fn init_runner (
494
528
maybe_services : Option < SignerServices > ,
495
529
maybe_config : Option < Config > ,
496
530
) -> SignerRunner {
497
- let services = init_services ( ) ;
531
+ let services = init_services ( ) . await ;
498
532
let config = Config {
499
533
aggregator_endpoint : "http://0.0.0.0:3000" . to_string ( ) ,
500
534
cardano_cli_path : PathBuf :: new ( ) ,
@@ -520,15 +554,15 @@ mod tests {
520
554
521
555
#[ tokio:: test]
522
556
async fn test_get_current_beacon ( ) {
523
- let mut services = init_services ( ) ;
557
+ let mut services = init_services ( ) . await ;
524
558
let expected = fake_data:: beacon ( ) ;
525
559
let mut beacon_provider = MockFakeBeaconProvider :: new ( ) ;
526
560
beacon_provider
527
561
. expect_get_current_beacon ( )
528
562
. once ( )
529
563
. returning ( || Ok ( fake_data:: beacon ( ) ) ) ;
530
564
services. beacon_provider = Arc :: new ( beacon_provider) ;
531
- let runner = init_runner ( Some ( services) , None ) ;
565
+ let runner = init_runner ( Some ( services) , None ) . await ;
532
566
533
567
assert_eq ! (
534
568
expected,
@@ -541,15 +575,15 @@ mod tests {
541
575
542
576
#[ tokio:: test]
543
577
async fn test_update_stake_distribution ( ) {
544
- let services = init_services ( ) ;
578
+ let services = init_services ( ) . await ;
545
579
let stake_store = services. stake_store . clone ( ) ;
546
580
let current_epoch = services
547
581
. chain_observer
548
582
. get_current_epoch ( )
549
583
. await
550
584
. expect ( "chain observer should not fail" )
551
585
. expect ( "the observer should return an epoch" ) ;
552
- let runner = init_runner ( Some ( services) , None ) ;
586
+ let runner = init_runner ( Some ( services) , None ) . await ;
553
587
assert ! ( stake_store
554
588
. get_stakes( current_epoch)
555
589
. await
@@ -572,7 +606,7 @@ mod tests {
572
606
573
607
#[ tokio:: test]
574
608
async fn test_register_signer_to_aggregator ( ) {
575
- let mut services = init_services ( ) ;
609
+ let mut services = init_services ( ) . await ;
576
610
let certificate_handler = Arc :: new ( DumbCertificateHandler :: default ( ) ) ;
577
611
services. certificate_handler = certificate_handler. clone ( ) ;
578
612
let protocol_initializer_store = services. protocol_initializer_store . clone ( ) ;
@@ -595,7 +629,7 @@ mod tests {
595
629
. save_stakes ( epoch, stakes)
596
630
. await
597
631
. unwrap ( ) ;
598
- let runner = init_runner ( Some ( services) , None ) ;
632
+ let runner = init_runner ( Some ( services) , None ) . await ;
599
633
let epoch = chain_observer
600
634
. current_beacon
601
635
. read ( )
@@ -630,9 +664,9 @@ mod tests {
630
664
631
665
#[ tokio:: test]
632
666
async fn test_can_i_sign ( ) {
633
- let services = init_services ( ) ;
667
+ let services = init_services ( ) . await ;
634
668
let protocol_initializer_store = services. protocol_initializer_store . clone ( ) ;
635
- let runner = init_runner ( Some ( services) , None ) ;
669
+ let runner = init_runner ( Some ( services) , None ) . await ;
636
670
let mut pending_certificate = fake_data:: certificate_pending ( ) ;
637
671
let epoch = pending_certificate. beacon . epoch ;
638
672
let mut signer = & mut pending_certificate. signers [ 0 ] ;
@@ -657,9 +691,9 @@ mod tests {
657
691
658
692
#[ tokio:: test]
659
693
async fn test_associate_signers_with_stake ( ) {
660
- let services = init_services ( ) ;
694
+ let services = init_services ( ) . await ;
661
695
let stake_store = services. stake_store . clone ( ) ;
662
- let runner = init_runner ( Some ( services) , None ) ;
696
+ let runner = init_runner ( Some ( services) , None ) . await ;
663
697
let epoch = Epoch ( 12 ) ;
664
698
let expected = fake_data:: signers_with_stakes ( 5 ) ;
665
699
let signers = expected
@@ -687,7 +721,7 @@ mod tests {
687
721
688
722
#[ tokio:: test]
689
723
async fn test_compute_message ( ) {
690
- let mut services = init_services ( ) ;
724
+ let mut services = init_services ( ) . await ;
691
725
let current_beacon = services
692
726
. beacon_provider
693
727
. get_current_beacon ( )
@@ -722,7 +756,7 @@ mod tests {
722
756
. expect ( "an avk should have been computed" ) ;
723
757
expected. set_message_part ( ProtocolMessagePartKey :: NextAggregateVerificationKey , avk) ;
724
758
725
- let runner = init_runner ( Some ( services) , None ) ;
759
+ let runner = init_runner ( Some ( services) , None ) . await ;
726
760
let message = runner
727
761
. compute_message ( & current_beacon, & next_signers)
728
762
. await
@@ -733,7 +767,7 @@ mod tests {
733
767
734
768
#[ tokio:: test]
735
769
async fn test_compute_single_signature ( ) {
736
- let mut services = init_services ( ) ;
770
+ let mut services = init_services ( ) . await ;
737
771
let current_beacon = services
738
772
. beacon_provider
739
773
. get_current_beacon ( )
@@ -773,7 +807,7 @@ mod tests {
773
807
. compute_single_signatures ( & message, & signers, & protocol_initializer)
774
808
. expect ( "compute_single_signatures should not fail" ) ;
775
809
776
- let runner = init_runner ( Some ( services) , None ) ;
810
+ let runner = init_runner ( Some ( services) , None ) . await ;
777
811
let single_signature = runner
778
812
. compute_single_signature ( current_beacon. epoch , & message, & signers)
779
813
. await
@@ -783,18 +817,33 @@ mod tests {
783
817
784
818
#[ tokio:: test]
785
819
async fn test_send_single_signature ( ) {
786
- let mut services = init_services ( ) ;
820
+ let mut services = init_services ( ) . await ;
787
821
let mut certificate_handler = MockCertificateHandler :: new ( ) ;
788
822
certificate_handler
789
823
. expect_register_signatures ( )
790
824
. once ( )
791
825
. returning ( |_| Ok ( ( ) ) ) ;
792
826
services. certificate_handler = Arc :: new ( certificate_handler) ;
793
- let runner = init_runner ( Some ( services) , None ) ;
827
+ let runner = init_runner ( Some ( services) , None ) . await ;
794
828
795
829
runner
796
830
. send_single_signature ( Some ( fake_data:: single_signatures ( vec ! [ 2 , 5 , 12 ] ) ) )
797
831
. await
798
832
. expect ( "send_single_signature should not fail" ) ;
799
833
}
834
+
835
+ #[ tokio:: test]
836
+ async fn test_update_era_checker ( ) {
837
+ let services = init_services ( ) . await ;
838
+ let beacon_provider = services. beacon_provider . clone ( ) ;
839
+ let era_checker = services. era_checker . clone ( ) ;
840
+ let mut beacon = beacon_provider. get_current_beacon ( ) . await . unwrap ( ) ;
841
+
842
+ assert_eq ! ( beacon. epoch, era_checker. current_epoch( ) ) ;
843
+ let runner = init_runner ( Some ( services) , None ) . await ;
844
+ beacon. epoch += 1 ;
845
+ runner. update_era_checker ( beacon. epoch ) . await . unwrap ( ) ;
846
+
847
+ assert_eq ! ( beacon. epoch, era_checker. current_epoch( ) ) ;
848
+ }
800
849
}
0 commit comments