github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/blockchain/receive_attestation_test.go (about)

     1  package blockchain
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	types "github.com/prysmaticlabs/eth2-types"
     9  	"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
    10  	"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
    11  	testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing"
    12  	"github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray"
    13  	"github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations"
    14  	"github.com/prysmaticlabs/prysm/beacon-chain/state/stategen"
    15  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
    16  	"github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper"
    17  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
    18  	"github.com/prysmaticlabs/prysm/shared/params"
    19  	"github.com/prysmaticlabs/prysm/shared/testutil"
    20  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    21  	"github.com/prysmaticlabs/prysm/shared/timeutils"
    22  	logTest "github.com/sirupsen/logrus/hooks/test"
    23  )
    24  
    25  func TestAttestationCheckPtState_FarFutureSlot(t *testing.T) {
    26  	helpers.ClearCache()
    27  	beaconDB := testDB.SetupDB(t)
    28  
    29  	chainService := setupBeaconChain(t, beaconDB)
    30  	chainService.genesisTime = time.Now()
    31  
    32  	e := types.Epoch(helpers.MaxSlotBuffer/uint64(params.BeaconConfig().SlotsPerEpoch) + 1)
    33  	_, err := chainService.AttestationPreState(context.Background(), &ethpb.Attestation{Data: &ethpb.AttestationData{Target: &ethpb.Checkpoint{Epoch: e}}})
    34  	require.ErrorContains(t, "exceeds max allowed value relative to the local clock", err)
    35  }
    36  
    37  func TestVerifyLMDFFGConsistent_NotOK(t *testing.T) {
    38  	ctx := context.Background()
    39  	beaconDB := testDB.SetupDB(t)
    40  
    41  	cfg := &Config{BeaconDB: beaconDB, ForkChoiceStore: protoarray.New(0, 0, [32]byte{})}
    42  	service, err := NewService(ctx, cfg)
    43  	require.NoError(t, err)
    44  
    45  	b32 := testutil.NewBeaconBlock()
    46  	b32.Block.Slot = 32
    47  	require.NoError(t, service.cfg.BeaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b32)))
    48  	r32, err := b32.Block.HashTreeRoot()
    49  	require.NoError(t, err)
    50  	b33 := testutil.NewBeaconBlock()
    51  	b33.Block.Slot = 33
    52  	b33.Block.ParentRoot = r32[:]
    53  	require.NoError(t, service.cfg.BeaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b33)))
    54  	r33, err := b33.Block.HashTreeRoot()
    55  	require.NoError(t, err)
    56  
    57  	wanted := "FFG and LMD votes are not consistent"
    58  	a := testutil.NewAttestation()
    59  	a.Data.Target.Epoch = 1
    60  	a.Data.Target.Root = []byte{'a'}
    61  	a.Data.BeaconBlockRoot = r33[:]
    62  	require.ErrorContains(t, wanted, service.VerifyLmdFfgConsistency(context.Background(), a))
    63  }
    64  
    65  func TestVerifyLMDFFGConsistent_OK(t *testing.T) {
    66  	ctx := context.Background()
    67  	beaconDB := testDB.SetupDB(t)
    68  
    69  	cfg := &Config{BeaconDB: beaconDB, ForkChoiceStore: protoarray.New(0, 0, [32]byte{})}
    70  	service, err := NewService(ctx, cfg)
    71  	require.NoError(t, err)
    72  
    73  	b32 := testutil.NewBeaconBlock()
    74  	b32.Block.Slot = 32
    75  	require.NoError(t, service.cfg.BeaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b32)))
    76  	r32, err := b32.Block.HashTreeRoot()
    77  	require.NoError(t, err)
    78  	b33 := testutil.NewBeaconBlock()
    79  	b33.Block.Slot = 33
    80  	b33.Block.ParentRoot = r32[:]
    81  	require.NoError(t, service.cfg.BeaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b33)))
    82  	r33, err := b33.Block.HashTreeRoot()
    83  	require.NoError(t, err)
    84  
    85  	a := testutil.NewAttestation()
    86  	a.Data.Target.Epoch = 1
    87  	a.Data.Target.Root = r32[:]
    88  	a.Data.BeaconBlockRoot = r33[:]
    89  	err = service.VerifyLmdFfgConsistency(context.Background(), a)
    90  	require.NoError(t, err, "Could not verify LMD and FFG votes to be consistent")
    91  }
    92  
    93  func TestProcessAttestations_Ok(t *testing.T) {
    94  	hook := logTest.NewGlobal()
    95  	ctx := context.Background()
    96  	beaconDB := testDB.SetupDB(t)
    97  
    98  	cfg := &Config{
    99  		BeaconDB:        beaconDB,
   100  		ForkChoiceStore: protoarray.New(0, 0, [32]byte{}),
   101  		StateGen:        stategen.New(beaconDB),
   102  		AttPool:         attestations.NewPool(),
   103  	}
   104  	service, err := NewService(ctx, cfg)
   105  	service.genesisTime = timeutils.Now().Add(-1 * time.Duration(params.BeaconConfig().SecondsPerSlot) * time.Second)
   106  	require.NoError(t, err)
   107  	genesisState, pks := testutil.DeterministicGenesisState(t, 64)
   108  	require.NoError(t, genesisState.SetGenesisTime(uint64(timeutils.Now().Unix())-params.BeaconConfig().SecondsPerSlot))
   109  	require.NoError(t, service.saveGenesisData(ctx, genesisState))
   110  	atts, err := testutil.GenerateAttestations(genesisState, pks, 1, 0, false)
   111  	require.NoError(t, err)
   112  	tRoot := bytesutil.ToBytes32(atts[0].Data.Target.Root)
   113  	copied := genesisState.Copy()
   114  	copied, err = state.ProcessSlots(ctx, copied, 1)
   115  	require.NoError(t, err)
   116  	require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, copied, tRoot))
   117  	require.NoError(t, service.cfg.ForkChoiceStore.ProcessBlock(ctx, 0, tRoot, tRoot, tRoot, 1, 1))
   118  	require.NoError(t, service.cfg.AttPool.SaveForkchoiceAttestations(atts))
   119  	service.processAttestations(ctx)
   120  	require.Equal(t, 0, len(service.cfg.AttPool.ForkchoiceAttestations()))
   121  	require.LogsDoNotContain(t, hook, "Could not process attestation for fork choice")
   122  }