@@ -91,6 +91,7 @@ impl BlockProducerVrfEvaluatorState {
9191 best_tip_epoch,
9292 root_block_epoch,
9393 current_epoch,
94+ is_next_epoch_seed_finalized,
9495 staking_epoch_data,
9596 next_epoch_data,
9697 ..
@@ -111,7 +112,7 @@ impl BlockProducerVrfEvaluatorState {
111112 if !self . is_epoch_evaluated ( best_tip_epoch) {
112113 self . epoch_context = EpochContext :: Current ( ( * staking_epoch_data) . into ( ) )
113114 } else if !self . is_epoch_evaluated ( best_tip_epoch + 1 ) {
114- if root_block_epoch == best_tip_epoch {
115+ if root_block_epoch == best_tip_epoch && is_next_epoch_seed_finalized {
115116 self . epoch_context = EpochContext :: Next ( ( * next_epoch_data) . into ( ) )
116117 } else {
117118 self . epoch_context = EpochContext :: Waiting
@@ -495,6 +496,7 @@ pub enum BlockProducerVrfEvaluatorStatus {
495496 ReadinessCheck {
496497 time : redux:: Timestamp ,
497498 current_epoch : Option < u32 > ,
499+ is_next_epoch_seed_finalized : bool ,
498500 best_tip_epoch : u32 ,
499501 root_block_epoch : u32 ,
500502 is_current_epoch_evaluated : bool ,
@@ -658,6 +660,7 @@ mod test {
658660 best_tip_epoch: 0 ,
659661 is_current_epoch_evaluated: false ,
660662 is_next_epoch_evaluated: false ,
663+ is_next_epoch_seed_finalized: false ,
661664 last_evaluated_epoch: None ,
662665 staking_epoch_data: Box :: new( DUMMY_STAKING_EPOCH_DATA . to_owned( ) ) ,
663666 next_epoch_data: Box :: new( DUMMY_NEXT_EPOCH_DATA . to_owned( ) ) ,
@@ -680,6 +683,7 @@ mod test {
680683 best_tip_epoch: 0 ,
681684 is_current_epoch_evaluated: true ,
682685 is_next_epoch_evaluated: false ,
686+ is_next_epoch_seed_finalized: true ,
683687 last_evaluated_epoch: Some ( 0 ) ,
684688 staking_epoch_data: Box :: new( DUMMY_STAKING_EPOCH_DATA . to_owned( ) ) ,
685689 next_epoch_data: Box :: new( DUMMY_NEXT_EPOCH_DATA . to_owned( ) ) ,
@@ -702,6 +706,7 @@ mod test {
702706 best_tip_epoch: 0 ,
703707 is_current_epoch_evaluated: true ,
704708 is_next_epoch_evaluated: true ,
709+ is_next_epoch_seed_finalized: true ,
705710 last_evaluated_epoch: Some ( 1 ) ,
706711 staking_epoch_data: Box :: new( DUMMY_STAKING_EPOCH_DATA . to_owned( ) ) ,
707712 next_epoch_data: Box :: new( DUMMY_NEXT_EPOCH_DATA . to_owned( ) ) ,
@@ -724,6 +729,7 @@ mod test {
724729 best_tip_epoch: 2 ,
725730 is_current_epoch_evaluated: false ,
726731 is_next_epoch_evaluated: false ,
732+ is_next_epoch_seed_finalized: false ,
727733 last_evaluated_epoch: None ,
728734 staking_epoch_data: Box :: new( DUMMY_STAKING_EPOCH_DATA . to_owned( ) ) ,
729735 next_epoch_data: Box :: new( DUMMY_NEXT_EPOCH_DATA . to_owned( ) ) ,
@@ -747,6 +753,7 @@ mod test {
747753 is_current_epoch_evaluated: true ,
748754 is_next_epoch_evaluated: false ,
749755 last_evaluated_epoch: Some ( 2 ) ,
756+ is_next_epoch_seed_finalized: false ,
750757 staking_epoch_data: Box :: new( DUMMY_STAKING_EPOCH_DATA . to_owned( ) ) ,
751758 next_epoch_data: Box :: new( DUMMY_NEXT_EPOCH_DATA . to_owned( ) ) ,
752759 } ,
@@ -804,6 +811,7 @@ mod test {
804811 #[ test]
805812 fn generic_epoch_correctly_switch_to_next_epoch ( ) {
806813 // Staking ledger not yet materialized (wait k=290 blocks)
814+ // The epoch seed is not finalized yet
807815 let mut vrf_evaluator_state = SECOND_EPOCH_CURRENT_EPOCH_EVALUATED_WAIT_FOR_NEXT
808816 . lock ( )
809817 . unwrap ( ) ;
@@ -815,13 +823,15 @@ mod test {
815823
816824 // Epoch has changed but the root is still from the previous epoch.
817825 // Next epoch must not be evaluated yet.
826+ // The epoch seed is not finalized yet.
818827 vrf_evaluator_state. status = BlockProducerVrfEvaluatorStatus :: ReadinessCheck {
819828 time : redux:: Timestamp :: global_now ( ) ,
820829 current_epoch : Some ( 2 ) , // TODO(adonagy)
821830 root_block_epoch : 1 ,
822831 best_tip_epoch : 2 ,
823832 is_current_epoch_evaluated : true ,
824833 is_next_epoch_evaluated : false ,
834+ is_next_epoch_seed_finalized : false ,
825835 last_evaluated_epoch : Some ( 2 ) ,
826836 staking_epoch_data : Box :: new ( DUMMY_STAKING_EPOCH_DATA . to_owned ( ) ) ,
827837 next_epoch_data : Box :: new ( DUMMY_NEXT_EPOCH_DATA . to_owned ( ) ) ,
@@ -834,14 +844,36 @@ mod test {
834844 ) ) ;
835845
836846 // Epoch has changed, and the root is already at that epoch too.
837- // Next epoch must be evaluated now .
847+ // The epoch seed is still not finalized .
838848 vrf_evaluator_state. status = BlockProducerVrfEvaluatorStatus :: ReadinessCheck {
839849 time : redux:: Timestamp :: global_now ( ) ,
840850 current_epoch : Some ( 2 ) , // TODO(adonagy)
841851 root_block_epoch : 2 ,
842852 best_tip_epoch : 2 ,
843853 is_current_epoch_evaluated : true ,
844854 is_next_epoch_evaluated : false ,
855+ is_next_epoch_seed_finalized : false ,
856+ last_evaluated_epoch : Some ( 2 ) ,
857+ staking_epoch_data : Box :: new ( DUMMY_STAKING_EPOCH_DATA . to_owned ( ) ) ,
858+ next_epoch_data : Box :: new ( DUMMY_NEXT_EPOCH_DATA . to_owned ( ) ) ,
859+ } ;
860+
861+ vrf_evaluator_state. set_epoch_context ( ) ;
862+ assert ! ( matches!(
863+ vrf_evaluator_state. epoch_context( ) ,
864+ EpochContext :: Waiting
865+ ) ) ;
866+
867+ // Epoch has changed, and the root is already at that epoch too.
868+ // The epoch seed is also finalized.
869+ vrf_evaluator_state. status = BlockProducerVrfEvaluatorStatus :: ReadinessCheck {
870+ time : redux:: Timestamp :: global_now ( ) ,
871+ current_epoch : Some ( 2 ) , // TODO(adonagy)
872+ root_block_epoch : 2 ,
873+ best_tip_epoch : 2 ,
874+ is_current_epoch_evaluated : true ,
875+ is_next_epoch_evaluated : false ,
876+ is_next_epoch_seed_finalized : true ,
845877 last_evaluated_epoch : Some ( 2 ) ,
846878 staking_epoch_data : Box :: new ( DUMMY_STAKING_EPOCH_DATA . to_owned ( ) ) ,
847879 next_epoch_data : Box :: new ( DUMMY_NEXT_EPOCH_DATA . to_owned ( ) ) ,
0 commit comments