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 := &ethpb.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 := &ethpb.Attestation{
    61  		Data: &ethpb.AttestationData{
    62  			Source: &ethpb.Checkpoint{Epoch: 99, Root: mockRoot[:]},
    63  			Target: &ethpb.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  }