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