diff --git a/beacon-chain/core/blocks/deposit.go b/beacon-chain/core/blocks/deposit.go index cc0b91b5b..4576e5bda 100644 --- a/beacon-chain/core/blocks/deposit.go +++ b/beacon-chain/core/blocks/deposit.go @@ -28,6 +28,15 @@ func ProcessPreGenesisDeposits( if err != nil { return nil, errors.Wrap(err, "could not process deposit") } + beaconState, err = activateValidatorWithEffectiveBalance(beaconState, deposits) + if err != nil { + return nil, err + } + return beaconState, nil +} + +// This updates validator's effective balance, and if it's above MaxEffectiveBalance, validator becomes active in genesis. +func activateValidatorWithEffectiveBalance(beaconState iface.BeaconState, deposits []*ethpb.Deposit) (iface.BeaconState, error) { for _, deposit := range deposits { pubkey := deposit.Data.PublicKey index, ok := beaconState.ValidatorIndexByPubkey(bytesutil.ToBytes48(pubkey)) @@ -69,25 +78,18 @@ func ProcessDeposits( beaconState iface.BeaconState, deposits []*ethpb.Deposit, ) (iface.BeaconState, error) { - var err error - domain, err := helpers.ComputeDomain(params.BeaconConfig().DomainDeposit, nil, nil) - if err != nil { - return nil, err - } - // Attempt to verify all deposit signatures at once, if this fails then fall back to processing // individual deposits with signature verification enabled. - var verifySignature bool - if err := verifyDepositDataWithDomain(ctx, deposits, domain); err != nil { - log.WithError(err).Debug("Failed to verify deposit data, verifying signatures individually") - verifySignature = true + batchVerified, err := batchVerifyDepositsSignatures(ctx, deposits) + if err != nil { + return nil, err } for _, deposit := range deposits { if deposit == nil || deposit.Data == nil { return nil, errors.New("got a nil deposit in block") } - beaconState, err = ProcessDeposit(beaconState, deposit, verifySignature) + beaconState, err = ProcessDeposit(beaconState, deposit, batchVerified) if err != nil { return nil, errors.Wrapf(err, "could not process deposit from %#x", bytesutil.Trunc(deposit.Data.PublicKey)) } @@ -95,6 +97,21 @@ func ProcessDeposits( return beaconState, nil } +func batchVerifyDepositsSignatures(ctx context.Context, deposits []*ethpb.Deposit) (bool, error) { + var err error + domain, err := helpers.ComputeDomain(params.BeaconConfig().DomainDeposit, nil, nil) + if err != nil { + return false, err + } + + verified := false + if err := verifyDepositDataWithDomain(ctx, deposits, domain); err != nil { + log.WithError(err).Debug("Failed to batch verify deposits signatures, will try individual verify") + verified = true + } + return verified, nil +} + // ProcessDeposit takes in a deposit object and inserts it // into the registry as a new validator or balance change. //