package blockchain import ( "context" "testing" "time" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" "github.com/prysmaticlabs/prysm/shared/params" "github.com/prysmaticlabs/prysm/shared/testutil" "github.com/prysmaticlabs/prysm/shared/testutil/require" ) func TestAttestationCheckPtState_FarFutureSlot(t *testing.T) { helpers.ClearCache() beaconDB := testDB.SetupDB(t) chainService := setupBeaconChain(t, beaconDB) chainService.genesisTime = time.Now() e := helpers.MaxSlotBuffer/params.BeaconConfig().SlotsPerEpoch + 1 _, err := chainService.AttestationPreState(context.Background(), ðpb.Attestation{Data: ðpb.AttestationData{Target: ðpb.Checkpoint{Epoch: e}}}) require.ErrorContains(t, "exceeds max allowed value relative to the local clock", err) } func TestVerifyLMDFFGConsistent_NotOK(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) cfg := &Config{BeaconDB: beaconDB, ForkChoiceStore: protoarray.New(0, 0, [32]byte{})} service, err := NewService(ctx, cfg) require.NoError(t, err) b32 := testutil.NewBeaconBlock() b32.Block.Slot = 32 require.NoError(t, service.beaconDB.SaveBlock(ctx, b32)) r32, err := b32.Block.HashTreeRoot() require.NoError(t, err) b33 := testutil.NewBeaconBlock() b33.Block.Slot = 33 b33.Block.ParentRoot = r32[:] require.NoError(t, service.beaconDB.SaveBlock(ctx, b33)) r33, err := b33.Block.HashTreeRoot() require.NoError(t, err) wanted := "FFG and LMD votes are not consistent" a := testutil.NewAttestation() a.Data.Target.Epoch = 1 a.Data.Target.Root = []byte{'a'} a.Data.BeaconBlockRoot = r33[:] require.ErrorContains(t, wanted, service.VerifyLmdFfgConsistency(context.Background(), a)) } func TestVerifyLMDFFGConsistent_OK(t *testing.T) { ctx := context.Background() beaconDB := testDB.SetupDB(t) cfg := &Config{BeaconDB: beaconDB, ForkChoiceStore: protoarray.New(0, 0, [32]byte{})} service, err := NewService(ctx, cfg) require.NoError(t, err) b32 := testutil.NewBeaconBlock() b32.Block.Slot = 32 require.NoError(t, service.beaconDB.SaveBlock(ctx, b32)) r32, err := b32.Block.HashTreeRoot() require.NoError(t, err) b33 := testutil.NewBeaconBlock() b33.Block.Slot = 33 b33.Block.ParentRoot = r32[:] require.NoError(t, service.beaconDB.SaveBlock(ctx, b33)) r33, err := b33.Block.HashTreeRoot() require.NoError(t, err) a := testutil.NewAttestation() a.Data.Target.Epoch = 1 a.Data.Target.Root = r32[:] a.Data.BeaconBlockRoot = r33[:] err = service.VerifyLmdFfgConsistency(context.Background(), a) require.NoError(t, err, "Could not verify LMD and FFG votes to be consistent") }