github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/core/blocks/attestation_regression_test.go (about) 1 package blocks_test 2 3 import ( 4 "context" 5 "io/ioutil" 6 "testing" 7 8 "github.com/prysmaticlabs/go-bitfield" 9 "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" 10 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" 11 pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" 12 ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 13 "github.com/prysmaticlabs/prysm/shared/params" 14 "github.com/prysmaticlabs/prysm/shared/testutil" 15 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 16 "github.com/prysmaticlabs/prysm/shared/testutil/require" 17 ) 18 19 // Beaconfuzz discovered an off by one issue where an attestation could be produced which would pass 20 // validation when att.Data.CommitteeIndex is 1 and the committee count per slot is also 1. The only 21 // valid att.Data.Committee index would be 0, so this is an off by one error. 22 // See: https://github.com/sigp/beacon-fuzz/issues/78 23 func TestProcessAttestationNoVerifySignature_BeaconFuzzIssue78(t *testing.T) { 24 attData, err := ioutil.ReadFile("testdata/beaconfuzz_78_attestation.ssz") 25 if err != nil { 26 t.Fatal(err) 27 } 28 att := ðpb.Attestation{} 29 if err := att.UnmarshalSSZ(attData); err != nil { 30 t.Fatal(err) 31 } 32 stateData, err := ioutil.ReadFile("testdata/beaconfuzz_78_beacon.ssz") 33 if err != nil { 34 t.Fatal(err) 35 } 36 spb := &pb.BeaconState{} 37 if err := spb.UnmarshalSSZ(stateData); err != nil { 38 t.Fatal(err) 39 } 40 st, err := v1.InitializeFromProtoUnsafe(spb) 41 if err != nil { 42 t.Fatal(err) 43 } 44 45 ctx := context.Background() 46 _, err = blocks.ProcessAttestationNoVerifySignature(ctx, st, att) 47 require.ErrorContains(t, "committee index 1 >= committee count 1", err) 48 } 49 50 // Regression introduced in https://github.com/prysmaticlabs/prysm/pull/8566. 51 func TestVerifyAttestationNoVerifySignature_IncorrectSourceEpoch(t *testing.T) { 52 // Attestation with an empty signature 53 54 beaconState, _ := testutil.DeterministicGenesisState(t, 100) 55 56 aggBits := bitfield.NewBitlist(3) 57 aggBits.SetBitAt(1, true) 58 var mockRoot [32]byte 59 copy(mockRoot[:], "hello-world") 60 att := ðpb.Attestation{ 61 Data: ðpb.AttestationData{ 62 Source: ðpb.Checkpoint{Epoch: 99, Root: mockRoot[:]}, 63 Target: ðpb.Checkpoint{Epoch: 0, Root: make([]byte, 32)}, 64 }, 65 AggregationBits: aggBits, 66 } 67 68 zeroSig := [96]byte{} 69 att.Signature = zeroSig[:] 70 71 err := beaconState.SetSlot(beaconState.Slot() + params.BeaconConfig().MinAttestationInclusionDelay) 72 require.NoError(t, err) 73 ckp := beaconState.CurrentJustifiedCheckpoint() 74 copy(ckp.Root, "hello-world") 75 require.NoError(t, beaconState.SetCurrentJustifiedCheckpoint(ckp)) 76 require.NoError(t, beaconState.AppendCurrentEpochAttestations(&pb.PendingAttestation{})) 77 78 err = blocks.VerifyAttestationNoVerifySignature(context.TODO(), beaconState, att) 79 assert.NotEqual(t, nil, err) 80 }