@@ -25,9 +25,8 @@ pub enum SignerState {
25
25
26
26
/// `ReadyToSign` state. The signer is registered and ready to sign new messages.
27
27
ReadyToSign {
28
- /// Time point when signer transited to the state.
29
- time_point : TimePoint ,
30
-
28
+ /// Epoch when signer transited to the state.
29
+ epoch : Epoch ,
31
30
/// Last signed entity type that the signer signed since beginning of this state.
32
31
last_signed_entity_type : Option < SignedEntityType > ,
33
32
} ,
@@ -55,7 +54,7 @@ impl SignerState {
55
54
matches ! (
56
55
* self ,
57
56
SignerState :: ReadyToSign {
58
- time_point : _,
57
+ epoch : _,
59
58
last_signed_entity_type: _
60
59
}
61
60
)
@@ -76,13 +75,10 @@ impl Display for SignerState {
76
75
write ! ( f, "RegisteredNotAbleToSign - {epoch}" )
77
76
}
78
77
Self :: ReadyToSign {
79
- time_point ,
78
+ epoch ,
80
79
last_signed_entity_type,
81
80
} => {
82
- write ! (
83
- f,
84
- "ReadyToSign - {time_point} - {last_signed_entity_type:?}"
85
- )
81
+ write ! ( f, "ReadyToSign - {epoch} - {last_signed_entity_type:?}" )
86
82
}
87
83
}
88
84
}
@@ -173,7 +169,9 @@ impl StateMachine {
173
169
info ! ( "new Epoch found" ) ;
174
170
info ! ( " ⋅ transiting to REGISTERED" ) ;
175
171
* state = self
176
- . transition_from_unregistered_to_registered_state ( epoch_settings)
172
+ . transition_from_unregistered_to_one_of_registered_states (
173
+ epoch_settings,
174
+ )
177
175
. await ?;
178
176
} else {
179
177
info ! (
@@ -198,7 +196,7 @@ impl StateMachine {
198
196
}
199
197
200
198
SignerState :: ReadyToSign {
201
- time_point ,
199
+ epoch ,
202
200
last_signed_entity_type,
203
201
} => {
204
202
fn is_same_signed_entity_type (
@@ -209,7 +207,7 @@ impl StateMachine {
209
207
== last_signed_entity_type. as_ref ( )
210
208
}
211
209
212
- if let Some ( new_epoch) = self . has_epoch_changed ( time_point . epoch ) . await ? {
210
+ if let Some ( new_epoch) = self . has_epoch_changed ( * epoch) . await ? {
213
211
info ! ( "→ Epoch has changed, transiting to UNREGISTERED" ) ;
214
212
* state = self
215
213
. transition_from_ready_to_sign_to_unregistered ( new_epoch)
@@ -244,6 +242,7 @@ impl StateMachine {
244
242
info ! ( " → we can sign this certificate, transiting to READY_TO_SIGN" ) ;
245
243
* state = self
246
244
. transition_from_ready_to_sign_to_ready_to_sign (
245
+ * epoch,
247
246
& pending_certificate,
248
247
)
249
248
. await ?;
@@ -306,7 +305,7 @@ impl StateMachine {
306
305
}
307
306
308
307
/// Launch the transition process from the `Unregistered` to `ReadyToSign` or `RegisteredNotAbleToSign` state.
309
- async fn transition_from_unregistered_to_registered_state (
308
+ async fn transition_from_unregistered_to_one_of_registered_states (
310
309
& self ,
311
310
epoch_settings : EpochSettings ,
312
311
) -> Result < SignerState , RuntimeError > {
@@ -365,7 +364,7 @@ impl StateMachine {
365
364
message : "Failed to check if signer can sign in the current epoch in 'unregistered → ?' phase" . to_string ( ) ,
366
365
nested_error : Some ( e) ,
367
366
} ) ? {
368
- true => Ok ( SignerState :: ReadyToSign { time_point , last_signed_entity_type : None } ) ,
367
+ true => Ok ( SignerState :: ReadyToSign { epoch , last_signed_entity_type : None } ) ,
369
368
false => Ok ( SignerState :: RegisteredNotAbleToSign { epoch } ) ,
370
369
}
371
370
}
@@ -393,6 +392,7 @@ impl StateMachine {
393
392
/// Launch the transition process from the `ReadyToSign` to the `ReadyToSign` state.
394
393
async fn transition_from_ready_to_sign_to_ready_to_sign (
395
394
& self ,
395
+ state_epoch : Epoch ,
396
396
pending_certificate : & CertificatePending ,
397
397
) -> Result < SignerState , RuntimeError > {
398
398
let current_epoch = pending_certificate. epoch ;
@@ -440,9 +440,7 @@ impl StateMachine {
440
440
. signature_registration_success_last_epoch_gauge_set ( current_epoch) ;
441
441
442
442
Ok ( SignerState :: ReadyToSign {
443
- time_point : self
444
- . get_current_time_point ( "ready to sign → ready to sign" )
445
- . await ?,
443
+ epoch : state_epoch,
446
444
last_signed_entity_type : Some ( pending_certificate. to_owned ( ) . signed_entity_type ) ,
447
445
} )
448
446
}
@@ -658,12 +656,7 @@ mod tests {
658
656
. await
659
657
. expect ( "Cycling the state machine should not fail" ) ;
660
658
661
- if let SignerState :: ReadyToSign {
662
- time_point : _,
663
- last_signed_entity_type : _,
664
- } = state_machine. get_state ( ) . await
665
- {
666
- } else {
659
+ if !state_machine. get_state ( ) . await . is_ready_to_sign ( ) {
667
660
panic ! (
668
661
"state machine did not return a ReadyToSign state but {:?}" ,
669
662
state_machine. get_state( ) . await
@@ -735,7 +728,7 @@ mod tests {
735
728
736
729
let state_machine = init_state_machine (
737
730
SignerState :: ReadyToSign {
738
- time_point : TimePoint :: new ( 0 , 100 , ChainPoint :: dummy ( ) ) ,
731
+ epoch : Epoch ( 0 ) ,
739
732
last_signed_entity_type : None ,
740
733
} ,
741
734
runner,
@@ -759,7 +752,7 @@ mod tests {
759
752
chain_point : ChainPoint :: dummy ( ) ,
760
753
} ;
761
754
let state = SignerState :: ReadyToSign {
762
- time_point : time_point. clone ( ) ,
755
+ epoch : time_point. epoch ,
763
756
last_signed_entity_type : None ,
764
757
} ;
765
758
@@ -790,7 +783,7 @@ mod tests {
790
783
791
784
assert_eq ! (
792
785
SignerState :: ReadyToSign {
793
- time_point,
786
+ epoch : time_point. epoch ,
794
787
last_signed_entity_type: None
795
788
} ,
796
789
state_machine. get_state( ) . await ,
@@ -808,7 +801,7 @@ mod tests {
808
801
} ;
809
802
let certificate_pending_clone = certificate_pending. clone ( ) ;
810
803
let state = SignerState :: ReadyToSign {
811
- time_point : time_point. clone ( ) ,
804
+ epoch : time_point. epoch ,
812
805
last_signed_entity_type : Some ( certificate_pending. signed_entity_type . clone ( ) ) ,
813
806
} ;
814
807
let time_point_clone = time_point. clone ( ) ;
@@ -832,7 +825,7 @@ mod tests {
832
825
833
826
assert_eq ! (
834
827
SignerState :: ReadyToSign {
835
- time_point,
828
+ epoch : time_point. epoch ,
836
829
last_signed_entity_type: Some ( certificate_pending_clone. signed_entity_type)
837
830
} ,
838
831
state_machine. get_state( ) . await ,
@@ -845,7 +838,7 @@ mod tests {
845
838
async fn ready_to_sign_to_ready_to_sign_when_can_sign_the_first_signed_entity_type ( ) {
846
839
let time_point = TimePoint :: dummy ( ) ;
847
840
let state = SignerState :: ReadyToSign {
848
- time_point : time_point. clone ( ) ,
841
+ epoch : time_point. epoch ,
849
842
last_signed_entity_type : None ,
850
843
} ;
851
844
let certificate_pending = CertificatePending {
@@ -864,7 +857,7 @@ mod tests {
864
857
async fn ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one ( ) {
865
858
let time_point = TimePoint :: dummy ( ) ;
866
859
let state = SignerState :: ReadyToSign {
867
- time_point : time_point. clone ( ) ,
860
+ epoch : time_point. epoch ,
868
861
last_signed_entity_type : Some ( SignedEntityType :: CardanoStakeDistribution (
869
862
time_point. epoch ,
870
863
) ) ,
@@ -882,24 +875,51 @@ mod tests {
882
875
. await
883
876
}
884
877
878
+ #[ tokio:: test]
879
+ async fn ready_to_sign_to_ready_to_sign_when_different_state_than_previous_return_state_with_same_epoch (
880
+ ) {
881
+ let time_point = TimePoint :: dummy ( ) ;
882
+ let state = SignerState :: ReadyToSign {
883
+ epoch : time_point. epoch ,
884
+ last_signed_entity_type : Some ( SignedEntityType :: CardanoStakeDistribution (
885
+ time_point. epoch ,
886
+ ) ) ,
887
+ } ;
888
+ let certificate_pending = CertificatePending {
889
+ epoch : time_point. epoch + 10 , // Check that the epoch
890
+ signed_entity_type : SignedEntityType :: MithrilStakeDistribution ( time_point. epoch ) ,
891
+ ..fake_data:: certificate_pending ( )
892
+ } ;
893
+
894
+ assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one (
895
+ state,
896
+ certificate_pending,
897
+ )
898
+ . await
899
+ }
900
+
885
901
async fn assert_ready_to_sign_to_ready_to_sign_when_different_state_than_previous_one (
886
- state : SignerState ,
902
+ initial_state : SignerState ,
887
903
certificate_pending : CertificatePending ,
888
904
) {
889
- let time_point = match state . clone ( ) {
905
+ let initial_state_epoch = match initial_state . clone ( ) {
890
906
SignerState :: ReadyToSign {
891
- time_point ,
907
+ epoch ,
892
908
last_signed_entity_type : _,
893
- } => time_point ,
909
+ } => epoch ,
894
910
_ => panic ! ( "Invalid state, use only ReadyToSign" ) ,
895
911
} ;
912
+ let time_point = TimePoint {
913
+ epoch : initial_state_epoch,
914
+ ..TimePoint :: dummy ( )
915
+ } ;
896
916
897
917
let certificate_pending_clone = certificate_pending. clone ( ) ;
898
- let time_point_clone = time_point. clone ( ) ;
899
918
let mut runner = MockSignerRunner :: new ( ) ;
900
919
runner
901
920
. expect_get_current_time_point ( )
902
- . returning ( move || Ok ( time_point_clone. to_owned ( ) ) ) ;
921
+ . once ( )
922
+ . returning ( move || Ok ( time_point. to_owned ( ) ) ) ;
903
923
runner
904
924
. expect_get_pending_certificate ( )
905
925
. once ( )
@@ -921,15 +941,15 @@ mod tests {
921
941
. once ( )
922
942
. returning ( move |_| true ) ;
923
943
924
- let state_machine = init_state_machine ( state , runner) ;
944
+ let state_machine = init_state_machine ( initial_state . clone ( ) , runner) ;
925
945
state_machine
926
946
. cycle ( )
927
947
. await
928
948
. expect ( "Cycling the state machine should not fail" ) ;
929
949
930
950
assert_eq ! (
931
951
SignerState :: ReadyToSign {
932
- time_point ,
952
+ epoch : initial_state_epoch ,
933
953
last_signed_entity_type: Some ( certificate_pending_clone. signed_entity_type)
934
954
} ,
935
955
state_machine. get_state( ) . await ,
0 commit comments