package sync import ( "context" "fmt" "os" "path" "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/transition/interop" "github.com/prysmaticlabs/prysm/v5/config/features" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" "github.com/prysmaticlabs/prysm/v5/io/file" "google.golang.org/protobuf/proto" ) func (s *Service) beaconBlockSubscriber(ctx context.Context, msg proto.Message) error { signed, err := blocks.NewSignedBeaconBlock(msg) if err != nil { return err } if err := blocks.BeaconBlockIsNil(signed); err != nil { return err } s.setSeenBlockIndexSlot(signed.Block().Slot(), signed.Block().ProposerIndex()) block := signed.Block() root, err := block.HashTreeRoot() if err != nil { return err } if err := s.cfg.chain.ReceiveBlock(ctx, signed, root, nil); err != nil { if blockchain.IsInvalidBlock(err) { r := blockchain.InvalidBlockRoot(err) if r != [32]byte{} { s.setBadBlock(ctx, r) // Setting head block as bad. } else { // TODO(13721): Remove this once we can deprecate the flag. interop.WriteBlockToDisk(signed, true /*failed*/) saveInvalidBlockToTemp(signed) s.setBadBlock(ctx, root) } } // Set the returned invalid ancestors as bad. for _, root := range blockchain.InvalidAncestorRoots(err) { s.setBadBlock(ctx, root) } return err } return err } // WriteInvalidBlockToDisk as a block ssz. Writes to temp directory. func saveInvalidBlockToTemp(block interfaces.ReadOnlySignedBeaconBlock) { if !features.Get().SaveInvalidBlock { return } filename := fmt.Sprintf("beacon_block_%d.ssz", block.Block().Slot()) fp := path.Join(os.TempDir(), filename) log.Warnf("Writing invalid block to disk at %s", fp) enc, err := block.MarshalSSZ() if err != nil { log.WithError(err).Error("Failed to ssz encode block") return } if err := file.WriteFile(fp, enc); err != nil { log.WithError(err).Error("Failed to write to disk") } }