eth, miner: retrieve mining state from live database (#25139)
* miner: retrieve mining state from live database * eth/catalyst: ignore stale fcu events from cl
This commit is contained in:
parent
f49e298330
commit
7c7cd410d1
@ -140,16 +140,26 @@ func (api *ConsensusAPI) ForkchoiceUpdatedV1(update beacon.ForkchoiceStateV1, pa
|
|||||||
return beacon.ForkChoiceResponse{PayloadStatus: beacon.INVALID_TERMINAL_BLOCK, PayloadID: nil}, nil
|
return beacon.ForkChoiceResponse{PayloadStatus: beacon.INVALID_TERMINAL_BLOCK, PayloadID: nil}, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
valid := func(id *beacon.PayloadID) beacon.ForkChoiceResponse {
|
||||||
|
return beacon.ForkChoiceResponse{
|
||||||
|
PayloadStatus: beacon.PayloadStatusV1{Status: beacon.VALID, LatestValidHash: &update.HeadBlockHash},
|
||||||
|
PayloadID: id,
|
||||||
|
}
|
||||||
|
}
|
||||||
if rawdb.ReadCanonicalHash(api.eth.ChainDb(), block.NumberU64()) != update.HeadBlockHash {
|
if rawdb.ReadCanonicalHash(api.eth.ChainDb(), block.NumberU64()) != update.HeadBlockHash {
|
||||||
// Block is not canonical, set head.
|
// Block is not canonical, set head.
|
||||||
if latestValid, err := api.eth.BlockChain().SetCanonical(block); err != nil {
|
if latestValid, err := api.eth.BlockChain().SetCanonical(block); err != nil {
|
||||||
return beacon.ForkChoiceResponse{PayloadStatus: beacon.PayloadStatusV1{Status: beacon.INVALID, LatestValidHash: &latestValid}}, err
|
return beacon.ForkChoiceResponse{PayloadStatus: beacon.PayloadStatusV1{Status: beacon.INVALID, LatestValidHash: &latestValid}}, err
|
||||||
}
|
}
|
||||||
|
} else if api.eth.BlockChain().CurrentBlock().Hash() == update.HeadBlockHash {
|
||||||
|
// If the specified head matches with our local head, do nothing and keep
|
||||||
|
// generating the payload. It's a special corner case that a few slots are
|
||||||
|
// missing and we are requested to generate the payload in slot.
|
||||||
} else {
|
} else {
|
||||||
// If the head block is already in our canonical chain, the beacon client is
|
// If the head block is already in our canonical chain, the beacon client is
|
||||||
// probably resyncing. Ignore the update.
|
// probably resyncing. Ignore the update.
|
||||||
log.Info("Ignoring beacon update to old head", "number", block.NumberU64(), "hash", update.HeadBlockHash, "age", common.PrettyAge(time.Unix(int64(block.Time()), 0)), "have", api.eth.BlockChain().CurrentBlock().NumberU64())
|
log.Info("Ignoring beacon update to old head", "number", block.NumberU64(), "hash", update.HeadBlockHash, "age", common.PrettyAge(time.Unix(int64(block.Time()), 0)), "have", api.eth.BlockChain().CurrentBlock().NumberU64())
|
||||||
|
return valid(nil), nil
|
||||||
}
|
}
|
||||||
api.eth.SetSynced()
|
api.eth.SetSynced()
|
||||||
|
|
||||||
@ -183,12 +193,6 @@ func (api *ConsensusAPI) ForkchoiceUpdatedV1(update beacon.ForkchoiceStateV1, pa
|
|||||||
return beacon.STATUS_INVALID, beacon.InvalidForkChoiceState.With(errors.New("safe block not in canonical chain"))
|
return beacon.STATUS_INVALID, beacon.InvalidForkChoiceState.With(errors.New("safe block not in canonical chain"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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
|
// 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
|
// sealed by the beacon client. The payload will be requested later, and we
|
||||||
// might replace it arbitrarily many times in between.
|
// might replace it arbitrarily many times in between.
|
||||||
|
@ -40,7 +40,6 @@ import (
|
|||||||
type Backend interface {
|
type Backend interface {
|
||||||
BlockChain() *core.BlockChain
|
BlockChain() *core.BlockChain
|
||||||
TxPool() *core.TxPool
|
TxPool() *core.TxPool
|
||||||
StateAtBlock(block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (statedb *state.StateDB, err error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config is the configuration parameters of mining.
|
// Config is the configuration parameters of mining.
|
||||||
|
@ -756,16 +756,6 @@ func (w *worker) makeEnv(parent *types.Block, header *types.Header, coinbase com
|
|||||||
// Retrieve the parent state to execute on top and start a prefetcher for
|
// Retrieve the parent state to execute on top and start a prefetcher for
|
||||||
// the miner to speed block sealing up a bit.
|
// the miner to speed block sealing up a bit.
|
||||||
state, err := w.chain.StateAt(parent.Root())
|
state, err := w.chain.StateAt(parent.Root())
|
||||||
if err != nil {
|
|
||||||
// Note since the sealing block can be created upon the arbitrary parent
|
|
||||||
// block, but the state of parent block may already be pruned, so the necessary
|
|
||||||
// state recovery is needed here in the future.
|
|
||||||
//
|
|
||||||
// The maximum acceptable reorg depth can be limited by the finalised block
|
|
||||||
// somehow. TODO(rjl493456442) fix the hard-coded number here later.
|
|
||||||
state, err = w.eth.StateAtBlock(parent, 1024, nil, false, false)
|
|
||||||
log.Warn("Recovered mining state", "root", parent.Root(), "err", err)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user