github.com/prysmaticlabs/prysm@v1.4.4/endtoend/evaluators/validator.go (about) 1 package evaluators 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/pkg/errors" 8 "github.com/prysmaticlabs/prysm/endtoend/policies" 9 "github.com/prysmaticlabs/prysm/endtoend/types" 10 eth "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 11 "github.com/prysmaticlabs/prysm/shared/params" 12 "google.golang.org/grpc" 13 ) 14 15 var expectedParticipation = 0.95 // 95% participation to make room for minor issues. 16 17 // ValidatorsAreActive ensures the expected amount of validators are active. 18 var ValidatorsAreActive = types.Evaluator{ 19 Name: "validators_active_epoch_%d", 20 Policy: policies.AllEpochs, 21 Evaluation: validatorsAreActive, 22 } 23 24 // ValidatorsParticipating ensures the expected amount of validators are active. 25 var ValidatorsParticipating = types.Evaluator{ 26 Name: "validators_participating_epoch_%d", 27 Policy: policies.AfterNthEpoch(2), 28 Evaluation: validatorsParticipating, 29 } 30 31 func validatorsAreActive(conns ...*grpc.ClientConn) error { 32 conn := conns[0] 33 client := eth.NewBeaconChainClient(conn) 34 // Balances actually fluctuate but we just want to check initial balance. 35 validatorRequest := ð.ListValidatorsRequest{ 36 PageSize: int32(params.BeaconConfig().MinGenesisActiveValidatorCount), 37 Active: true, 38 } 39 validators, err := client.ListValidators(context.Background(), validatorRequest) 40 if err != nil { 41 return errors.Wrap(err, "failed to get validators") 42 } 43 44 expectedCount := params.BeaconConfig().MinGenesisActiveValidatorCount 45 receivedCount := uint64(len(validators.ValidatorList)) 46 if expectedCount != receivedCount { 47 return fmt.Errorf("expected validator count to be %d, recevied %d", expectedCount, receivedCount) 48 } 49 50 effBalanceLowCount := 0 51 exitEpochWrongCount := 0 52 withdrawEpochWrongCount := 0 53 for _, item := range validators.ValidatorList { 54 if valExited && item.Index == exitedIndex { 55 continue 56 } 57 if item.Validator.EffectiveBalance < params.BeaconConfig().MaxEffectiveBalance { 58 effBalanceLowCount++ 59 } 60 if item.Validator.ExitEpoch != params.BeaconConfig().FarFutureEpoch { 61 exitEpochWrongCount++ 62 } 63 if item.Validator.WithdrawableEpoch != params.BeaconConfig().FarFutureEpoch { 64 withdrawEpochWrongCount++ 65 } 66 } 67 68 if effBalanceLowCount > 0 { 69 return fmt.Errorf( 70 "%d validators did not have genesis validator effective balance of %d", 71 effBalanceLowCount, 72 params.BeaconConfig().MaxEffectiveBalance, 73 ) 74 } else if exitEpochWrongCount > 0 { 75 return fmt.Errorf("%d validators did not have genesis validator exit epoch of far future epoch", exitEpochWrongCount) 76 } else if withdrawEpochWrongCount > 0 { 77 return fmt.Errorf("%d validators did not have genesis validator withdrawable epoch of far future epoch", withdrawEpochWrongCount) 78 } 79 80 return nil 81 } 82 83 // validatorsParticipating ensures the validators have an acceptable participation rate. 84 func validatorsParticipating(conns ...*grpc.ClientConn) error { 85 conn := conns[0] 86 client := eth.NewBeaconChainClient(conn) 87 validatorRequest := ð.GetValidatorParticipationRequest{} 88 participation, err := client.GetValidatorParticipation(context.Background(), validatorRequest) 89 if err != nil { 90 return errors.Wrap(err, "failed to get validator participation") 91 } 92 93 partRate := participation.Participation.GlobalParticipationRate 94 expected := float32(expectedParticipation) 95 if partRate < expected { 96 return fmt.Errorf( 97 "validator participation was below for epoch %d, expected %f, received: %f", 98 participation.Epoch, 99 expected, 100 partRate, 101 ) 102 } 103 return nil 104 }