diff --git a/beacon-chain/sync/validate_blob.go b/beacon-chain/sync/validate_blob.go index 5e50d8bda2a6..428f084e7e71 100644 --- a/beacon-chain/sync/validate_blob.go +++ b/beacon-chain/sync/validate_blob.go @@ -12,6 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/v4/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/v4/beacon-chain/core/transition" "github.com/prysmaticlabs/prysm/v4/beacon-chain/state" + fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams" "github.com/prysmaticlabs/prysm/v4/config/params" "github.com/prysmaticlabs/prysm/v4/crypto/bls" "github.com/prysmaticlabs/prysm/v4/crypto/rand" @@ -61,10 +62,16 @@ func (s *Service) validateBlob(ctx context.Context, pid peer.ID, msg *pubsub.Mes } blob := sBlob.Message + // [REJECT] The sidecar's index is consistent with `MAX_BLOBS_PER_BLOCK` -- i.e. `sidecar.index < MAX_BLOBS_PER_BLOCK` + if blob.Index >= fieldparams.MaxBlobsPerBlock { + log.WithFields(blobFields(blob)).Debug("Sidecar index > MAX_BLOBS_PER_BLOCK") + return pubsub.ValidationReject, errors.New("incorrect blob sidecar index") + } + // [REJECT] The sidecar is for the correct subnet -- i.e. compute_subnet_for_blob_sidecar(sidecar.index) == subnet_id. want := fmt.Sprintf("blob_sidecar_%d", computeSubnetForBlobSidecar(blob.Index)) if !strings.Contains(*msg.Topic, want) { - log.WithFields(blobFields(blob)).Debug("Sidecar blob does not match topic") + log.WithFields(blobFields(blob)).Debug("Sidecar index does not match topic") return pubsub.ValidationReject, fmt.Errorf("wrong topic name: %s", *msg.Topic) } diff --git a/beacon-chain/sync/validate_blob_test.go b/beacon-chain/sync/validate_blob_test.go index 0a306bb0693b..2ff82f711818 100644 --- a/beacon-chain/sync/validate_blob_test.go +++ b/beacon-chain/sync/validate_blob_test.go @@ -19,6 +19,7 @@ import ( "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stategen" mockSync "github.com/prysmaticlabs/prysm/v4/beacon-chain/sync/initial-sync/testing" lruwrpr "github.com/prysmaticlabs/prysm/v4/cache/lru" + fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams" "github.com/prysmaticlabs/prysm/v4/config/params" "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v4/crypto/bls" @@ -81,6 +82,31 @@ func TestValidateBlob_InvalidMessageType(t *testing.T) { require.Equal(t, result, pubsub.ValidationReject) } +func TestValidateBlob_InvalidIndex(t *testing.T) { + ctx := context.Background() + p := p2ptest.NewTestP2P(t) + chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0)} + s := &Service{cfg: &config{p2p: p, initialSync: &mockSync.Sync{}, clock: startup.NewClock(chainService.Genesis, chainService.ValidatorsRoot)}} + + msg := util.NewBlobsidecar() + msg.Message.Index = fieldparams.MaxBlobsPerBlock + buf := new(bytes.Buffer) + _, err := p.Encoding().EncodeGossip(buf, msg) + require.NoError(t, err) + + topic := p2p.GossipTypeMapping[reflect.TypeOf(msg)] + digest, err := s.currentForkDigest() + require.NoError(t, err) + topic = s.addDigestAndIndexToTopic(topic, digest, 1) + result, err := s.validateBlob(ctx, "", &pubsub.Message{ + Message: &pb.Message{ + Data: buf.Bytes(), + Topic: &topic, + }}) + require.ErrorContains(t, "incorrect blob sidecar index", err) + require.Equal(t, result, pubsub.ValidationReject) +} + func TestValidateBlob_InvalidTopicIndex(t *testing.T) { ctx := context.Background() p := p2ptest.NewTestP2P(t)