mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-05 09:14:28 +00:00
79bb7efbf8
* Check init sync before getting payload attributes This PR adds a helper to forkchoice to return the delay of the latest imported block. It also adds a helper with an heuristic to check if the node is during init sync. If the highest imported node was imported with a delay of less than an epoch then the node is considered in regular sync. If on the other hand, in addition the highest imported node is more than two epochs old, then the node is considered in init Sync. The helper to check this only uses forkchoice and therefore requires a read lock. There are four paths to call this 1) During regular block processing, we defer a function to send the second FCU call with attributes. This function may not be called at all if we are not regularly syncing 2) During regular block processing, we check in the path `postBlockProces->getFCUArgs->computePayloadAttributes` the payload attributes if we are syncing a late block. In this case forkchoice is already locked and we add a call in `getFCUArgs` to return early if not regularly syncing 3) During handling of late blocks on `lateBlockTasks` we simply return early if not in regular sync (This is the biggest change as it takes a longer FC lock for lateBlockTasks) 4) On Attestation processing, in UpdateHead, we are already locked so we just add a check to not update head on this path if not regularly syncing. * fix build * Fix mocks
97 lines
3.7 KiB
Go
97 lines
3.7 KiB
Go
package forkchoice
|
|
|
|
import (
|
|
"context"
|
|
|
|
forkchoicetypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/forkchoice/types"
|
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state"
|
|
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
|
|
forkchoice2 "github.com/prysmaticlabs/prysm/v4/consensus-types/forkchoice"
|
|
"github.com/prysmaticlabs/prysm/v4/consensus-types/primitives"
|
|
)
|
|
|
|
// BalancesByRooter is a handler to obtain the effective balances of the state
|
|
// with the given block root
|
|
type BalancesByRooter func(context.Context, [32]byte) ([]uint64, error)
|
|
|
|
// ForkChoicer represents the full fork choice interface composed of all the sub-interfaces.
|
|
type ForkChoicer interface {
|
|
RLocker // separate interface isolates read locking for ROForkChoice.
|
|
Lock()
|
|
Unlock()
|
|
HeadRetriever // to compute head.
|
|
BlockProcessor // to track new block for fork choice.
|
|
AttestationProcessor // to track new attestation for fork choice.
|
|
Getter // to retrieve fork choice information.
|
|
Setter // to set fork choice information.
|
|
}
|
|
|
|
// RLocker represents forkchoice's internal RWMutex read-only lock/unlock methods.
|
|
type RLocker interface {
|
|
RLock()
|
|
RUnlock()
|
|
}
|
|
|
|
// HeadRetriever retrieves head root and optimistic info of the current chain.
|
|
type HeadRetriever interface {
|
|
Head(context.Context) ([32]byte, error)
|
|
GetProposerHead() [32]byte
|
|
CachedHeadRoot() [32]byte
|
|
}
|
|
|
|
// BlockProcessor processes the block that's used for accounting fork choice.
|
|
type BlockProcessor interface {
|
|
InsertNode(context.Context, state.BeaconState, [32]byte) error
|
|
InsertChain(context.Context, []*forkchoicetypes.BlockAndCheckpoints) error
|
|
}
|
|
|
|
// AttestationProcessor processes the attestation that's used for accounting fork choice.
|
|
type AttestationProcessor interface {
|
|
ProcessAttestation(context.Context, []uint64, [32]byte, primitives.Epoch)
|
|
}
|
|
|
|
// Getter returns fork choice related information.
|
|
type Getter interface {
|
|
FastGetter
|
|
AncestorRoot(ctx context.Context, root [32]byte, slot primitives.Slot) ([32]byte, error)
|
|
CommonAncestor(ctx context.Context, root1 [32]byte, root2 [32]byte) ([32]byte, primitives.Slot, error)
|
|
ForkChoiceDump(context.Context) (*forkchoice2.Dump, error)
|
|
Tips() ([][32]byte, []primitives.Slot)
|
|
}
|
|
|
|
type FastGetter interface {
|
|
FinalizedCheckpoint() *forkchoicetypes.Checkpoint
|
|
FinalizedPayloadBlockHash() [32]byte
|
|
HasNode([32]byte) bool
|
|
HighestReceivedBlockSlot() primitives.Slot
|
|
HighestReceivedBlockDelay() primitives.Slot
|
|
IsCanonical(root [32]byte) bool
|
|
IsOptimistic(root [32]byte) (bool, error)
|
|
IsViableForCheckpoint(*forkchoicetypes.Checkpoint) (bool, error)
|
|
JustifiedCheckpoint() *forkchoicetypes.Checkpoint
|
|
JustifiedPayloadBlockHash() [32]byte
|
|
LastRoot(primitives.Epoch) [32]byte
|
|
NodeCount() int
|
|
PreviousJustifiedCheckpoint() *forkchoicetypes.Checkpoint
|
|
ProposerBoost() [fieldparams.RootLength]byte
|
|
ReceivedBlocksLastEpoch() (uint64, error)
|
|
ShouldOverrideFCU() bool
|
|
Slot([32]byte) (primitives.Slot, error)
|
|
TargetRootForEpoch([32]byte, primitives.Epoch) ([32]byte, error)
|
|
UnrealizedJustifiedPayloadBlockHash() [32]byte
|
|
Weight(root [32]byte) (uint64, error)
|
|
}
|
|
|
|
// Setter allows to set forkchoice information
|
|
type Setter interface {
|
|
SetOptimisticToValid(context.Context, [fieldparams.RootLength]byte) error
|
|
SetOptimisticToInvalid(context.Context, [fieldparams.RootLength]byte, [fieldparams.RootLength]byte, [fieldparams.RootLength]byte) ([][32]byte, error)
|
|
UpdateJustifiedCheckpoint(context.Context, *forkchoicetypes.Checkpoint) error
|
|
UpdateFinalizedCheckpoint(*forkchoicetypes.Checkpoint) error
|
|
SetGenesisTime(uint64)
|
|
SetOriginRoot([32]byte)
|
|
NewSlot(context.Context, primitives.Slot) error
|
|
SetBalancesByRooter(BalancesByRooter)
|
|
InsertSlashedIndex(context.Context, primitives.ValidatorIndex)
|
|
}
|