mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-25 12:57:18 +00:00
d17996f8b0
* Update V3 from V4 * Fix build v3 -> v4 * Update ssz * Update beacon_chain.pb.go * Fix formatter import * Update update-mockgen.sh comment to v4 * Fix conflicts. Pass build and tests * Fix test
73 lines
2.3 KiB
Go
73 lines
2.3 KiB
Go
package evaluators
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/prysmaticlabs/prysm/v4/consensus-types/primitives"
|
|
mathutil "github.com/prysmaticlabs/prysm/v4/math"
|
|
"github.com/prysmaticlabs/prysm/v4/proto/eth/service"
|
|
v1 "github.com/prysmaticlabs/prysm/v4/proto/eth/v1"
|
|
v2 "github.com/prysmaticlabs/prysm/v4/proto/eth/v2"
|
|
"github.com/prysmaticlabs/prysm/v4/testing/endtoend/policies"
|
|
"github.com/prysmaticlabs/prysm/v4/testing/endtoend/types"
|
|
"github.com/prysmaticlabs/prysm/v4/time/slots"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
// OptimisticSyncEnabled checks that the node is in an optimistic state.
|
|
var OptimisticSyncEnabled = types.Evaluator{
|
|
Name: "optimistic_sync_at_epoch_%d",
|
|
Policy: policies.AllEpochs,
|
|
Evaluation: optimisticSyncEnabled,
|
|
}
|
|
|
|
func optimisticSyncEnabled(_ *types.EvaluationContext, conns ...*grpc.ClientConn) error {
|
|
for _, conn := range conns {
|
|
client := service.NewBeaconChainClient(conn)
|
|
head, err := client.GetBlindedBlock(context.Background(), &v1.BlockRequest{BlockId: []byte("head")})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
headSlot := uint64(0)
|
|
switch hb := head.Data.Message.(type) {
|
|
case *v2.SignedBlindedBeaconBlockContainer_Phase0Block:
|
|
headSlot = uint64(hb.Phase0Block.Slot)
|
|
case *v2.SignedBlindedBeaconBlockContainer_AltairBlock:
|
|
headSlot = uint64(hb.AltairBlock.Slot)
|
|
case *v2.SignedBlindedBeaconBlockContainer_BellatrixBlock:
|
|
headSlot = uint64(hb.BellatrixBlock.Slot)
|
|
case *v2.SignedBlindedBeaconBlockContainer_CapellaBlock:
|
|
headSlot = uint64(hb.CapellaBlock.Slot)
|
|
default:
|
|
return errors.New("no valid block type retrieved")
|
|
}
|
|
currEpoch := slots.ToEpoch(primitives.Slot(headSlot))
|
|
startSlot, err := slots.EpochStart(currEpoch)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
isOptimistic := false
|
|
for i := startSlot; i <= primitives.Slot(headSlot); i++ {
|
|
castI, err := mathutil.Int(uint64(i))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
block, err := client.GetBlindedBlock(context.Background(), &v1.BlockRequest{BlockId: []byte(strconv.Itoa(castI))})
|
|
if err != nil {
|
|
// Continue in the event of non-existent blocks.
|
|
continue
|
|
}
|
|
if !block.ExecutionOptimistic {
|
|
return errors.New("expected block to be optimistic, but it is not")
|
|
}
|
|
isOptimistic = true
|
|
}
|
|
if !isOptimistic {
|
|
return errors.New("expected block to be optimistic, but it is not")
|
|
}
|
|
}
|
|
return nil
|
|
}
|