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 := &eth.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 := &eth.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  }