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(), ðpb.Attestation{Data: ðpb.AttestationData{Target: ðpb.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 }