forked from cerc-io/plugeth
eth/catalyst: set the correct LatestValidHash (#24855)
* eth/catalyst: set the correct LatestValidHash * eth/catalyst: core: return LVH during reorg, rework invalid teminal block * eth/catalyst: nitpicks
This commit is contained in:
+15
-17
@@ -132,14 +132,14 @@ func (api *ConsensusAPI) ForkchoiceUpdatedV1(update beacon.ForkchoiceStateV1, pa
|
||||
}
|
||||
if td.Cmp(ttd) < 0 || (block.NumberU64() > 0 && ptd.Cmp(ttd) > 0) {
|
||||
log.Error("Refusing beacon update to pre-merge", "number", block.NumberU64(), "hash", update.HeadBlockHash, "diff", block.Difficulty(), "age", common.PrettyAge(time.Unix(int64(block.Time()), 0)))
|
||||
return beacon.ForkChoiceResponse{PayloadStatus: beacon.PayloadStatusV1{Status: beacon.INVALIDTERMINALBLOCK}, PayloadID: nil}, nil
|
||||
return beacon.ForkChoiceResponse{PayloadStatus: beacon.INVALID_TERMINAL_BLOCK, PayloadID: nil}, nil
|
||||
}
|
||||
}
|
||||
|
||||
if rawdb.ReadCanonicalHash(api.eth.ChainDb(), block.NumberU64()) != update.HeadBlockHash {
|
||||
// Block is not canonical, set head.
|
||||
if err := api.eth.BlockChain().SetCanonical(block); err != nil {
|
||||
return beacon.STATUS_INVALID, err
|
||||
if latestValid, err := api.eth.BlockChain().SetCanonical(block); err != nil {
|
||||
return beacon.ForkChoiceResponse{PayloadStatus: beacon.PayloadStatusV1{Status: beacon.INVALID, LatestValidHash: &latestValid}}, err
|
||||
}
|
||||
} else {
|
||||
// If the head block is already in our canonical chain, the beacon client is
|
||||
@@ -176,6 +176,14 @@ func (api *ConsensusAPI) ForkchoiceUpdatedV1(update beacon.ForkchoiceStateV1, pa
|
||||
return beacon.STATUS_INVALID, errors.New("safe head not canonical")
|
||||
}
|
||||
}
|
||||
|
||||
valid := func(id *beacon.PayloadID) beacon.ForkChoiceResponse {
|
||||
return beacon.ForkChoiceResponse{
|
||||
PayloadStatus: beacon.PayloadStatusV1{Status: beacon.VALID, LatestValidHash: &update.HeadBlockHash},
|
||||
PayloadID: id,
|
||||
}
|
||||
}
|
||||
|
||||
// If payload generation was requested, create a new block to be potentially
|
||||
// sealed by the beacon client. The payload will be requested later, and we
|
||||
// might replace it arbitrarily many times in between.
|
||||
@@ -186,25 +194,15 @@ func (api *ConsensusAPI) ForkchoiceUpdatedV1(update beacon.ForkchoiceStateV1, pa
|
||||
data, err := api.assembleBlock(update.HeadBlockHash, payloadAttributes)
|
||||
if err != nil {
|
||||
log.Error("Failed to create sealing payload", "err", err)
|
||||
return api.validForkChoiceResponse(nil), err // valid setHead, invalid payload
|
||||
return valid(nil), err // valid setHead, invalid payload
|
||||
}
|
||||
id := computePayloadId(update.HeadBlockHash, payloadAttributes)
|
||||
api.localBlocks.put(id, data)
|
||||
|
||||
log.Info("Created payload for sealing", "id", id, "elapsed", time.Since(start))
|
||||
return api.validForkChoiceResponse(&id), nil
|
||||
}
|
||||
return api.validForkChoiceResponse(nil), nil
|
||||
}
|
||||
|
||||
// validForkChoiceResponse returns the ForkChoiceResponse{VALID}
|
||||
// with the latest valid hash and an optional payloadID.
|
||||
func (api *ConsensusAPI) validForkChoiceResponse(id *beacon.PayloadID) beacon.ForkChoiceResponse {
|
||||
currentHash := api.eth.BlockChain().CurrentBlock().Hash()
|
||||
return beacon.ForkChoiceResponse{
|
||||
PayloadStatus: beacon.PayloadStatusV1{Status: beacon.VALID, LatestValidHash: ¤tHash},
|
||||
PayloadID: id,
|
||||
return valid(&id), nil
|
||||
}
|
||||
return valid(nil), nil
|
||||
}
|
||||
|
||||
// ExchangeTransitionConfigurationV1 checks the given configuration against
|
||||
@@ -291,7 +289,7 @@ func (api *ConsensusAPI) NewPayloadV1(params beacon.ExecutableDataV1) (beacon.Pa
|
||||
)
|
||||
if td.Cmp(ttd) < 0 {
|
||||
log.Warn("Ignoring pre-merge payload", "number", params.Number, "hash", params.BlockHash, "td", td, "ttd", ttd)
|
||||
return beacon.PayloadStatusV1{Status: beacon.INVALIDTERMINALBLOCK}, nil
|
||||
return beacon.INVALID_TERMINAL_BLOCK, nil
|
||||
}
|
||||
if block.Time() <= parent.Time() {
|
||||
log.Warn("Invalid timestamp", "parent", block.Time(), "block", block.Time())
|
||||
|
||||
@@ -136,7 +136,7 @@ func TestSetHeadBeforeTotalDifficulty(t *testing.T) {
|
||||
}
|
||||
if resp, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil {
|
||||
t.Errorf("fork choice updated should not error: %v", err)
|
||||
} else if resp.PayloadStatus.Status != beacon.INVALIDTERMINALBLOCK {
|
||||
} else if resp.PayloadStatus.Status != beacon.INVALID_TERMINAL_BLOCK.Status {
|
||||
t.Errorf("fork choice updated before total terminal difficulty should be INVALID")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user