mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-22 03:30:35 +00:00
75 lines
2.0 KiB
Go
75 lines
2.0 KiB
Go
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")
|
|
}
|
|
}
|