mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
eth,params,forks: add forks package with forks enum and LatestActive method on config
This commit is contained in:
parent
78eafeb518
commit
82626f87d4
3 changed files with 64 additions and 27 deletions
|
|
@ -33,7 +33,7 @@ import (
|
|||
"github.com/ethereum/go-ethereum/log"
|
||||
"github.com/ethereum/go-ethereum/miner"
|
||||
"github.com/ethereum/go-ethereum/node"
|
||||
"github.com/ethereum/go-ethereum/params"
|
||||
"github.com/ethereum/go-ethereum/params/forks"
|
||||
"github.com/ethereum/go-ethereum/rpc"
|
||||
)
|
||||
|
||||
|
|
@ -192,7 +192,7 @@ func (api *ConsensusAPI) ForkchoiceUpdatedV2(update engine.ForkchoiceStateV1, pa
|
|||
if params.BeaconRoot != nil {
|
||||
return engine.STATUS_INVALID, engine.InvalidParams.With(errors.New("unexpected beacon root"))
|
||||
}
|
||||
if !latestActive(api.eth.BlockChain().Config(), "shanghai", params.Timestamp) {
|
||||
if api.eth.BlockChain().Config().LatestFork(params.Timestamp) != forks.Shanghai {
|
||||
return engine.STATUS_INVALID, engine.UnsupportedFork.With(errors.New("forkchoiceUpdatedV2 must only be called for shanghai payloads"))
|
||||
}
|
||||
}
|
||||
|
|
@ -208,8 +208,8 @@ func (api *ConsensusAPI) ForkchoiceUpdatedV3(update engine.ForkchoiceStateV1, pa
|
|||
if params.BeaconRoot == nil {
|
||||
return engine.STATUS_INVALID, engine.InvalidParams.With(errors.New("missing beacon root"))
|
||||
}
|
||||
if !latestActive(api.eth.BlockChain().Config(), "cancun", params.Timestamp) {
|
||||
return engine.STATUS_INVALID, engine.UnsupportedFork.With(errors.New("forkchoiceUpdatedV3 must only be called for shanghai payloads"))
|
||||
if api.eth.BlockChain().Config().LatestFork(params.Timestamp) != forks.Cancun {
|
||||
return engine.STATUS_INVALID, engine.UnsupportedFork.With(errors.New("forkchoiceUpdatedV3 must only be called for cancun payloads"))
|
||||
}
|
||||
}
|
||||
return api.forkchoiceUpdated(update, params)
|
||||
|
|
@ -445,7 +445,7 @@ func (api *ConsensusAPI) NewPayloadV1(params engine.ExecutableData) (engine.Payl
|
|||
|
||||
// NewPayloadV2 creates an Eth1 block, inserts it in the chain, and returns the status of the chain.
|
||||
func (api *ConsensusAPI) NewPayloadV2(params engine.ExecutableData) (engine.PayloadStatusV1, error) {
|
||||
if latestActive(api.eth.BlockChain().Config(), "shanghai", params.Timestamp) {
|
||||
if api.eth.BlockChain().Config().LatestFork(params.Timestamp) == forks.Shanghai {
|
||||
if params.Withdrawals == nil {
|
||||
return engine.PayloadStatusV1{Status: engine.INVALID}, engine.InvalidParams.With(errors.New("nil withdrawals post-shanghai"))
|
||||
}
|
||||
|
|
@ -482,33 +482,12 @@ func (api *ConsensusAPI) NewPayloadV3(params engine.ExecutableData, versionedHas
|
|||
return engine.PayloadStatusV1{Status: engine.INVALID}, engine.InvalidParams.With(errors.New("nil parentBeaconBlockRoot post-cancun"))
|
||||
}
|
||||
|
||||
if !latestActive(api.eth.BlockChain().Config(), "cancun", params.Timestamp) {
|
||||
if api.eth.BlockChain().Config().LatestFork(params.Timestamp) != forks.Cancun {
|
||||
return engine.PayloadStatusV1{Status: engine.INVALID}, engine.UnsupportedFork.With(errors.New("newPayloadV3 must only be called for cancun payloads"))
|
||||
}
|
||||
return api.newPayload(params, versionedHashes, beaconRoot)
|
||||
}
|
||||
|
||||
// latestActive returns true only if fork is the latest latestActive fork. It returns false otherwise.
|
||||
func latestActive(config *params.ChainConfig, fork string, time uint64) bool {
|
||||
switch fork {
|
||||
case "shanghai":
|
||||
if !config.IsShanghai(config.LondonBlock, time) {
|
||||
return false
|
||||
}
|
||||
if config.IsCancun(config.LondonBlock, time) {
|
||||
return false
|
||||
}
|
||||
case "cancun":
|
||||
if !config.IsCancun(config.LondonBlock, time) {
|
||||
return false
|
||||
}
|
||||
if config.IsPrague(config.LondonBlock, time) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (api *ConsensusAPI) newPayload(params engine.ExecutableData, versionedHashes []common.Hash, beaconRoot *common.Hash) (engine.PayloadStatusV1, error) {
|
||||
// The locking here is, strictly, not required. Without these locks, this can happen:
|
||||
//
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import (
|
|||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/params/forks"
|
||||
)
|
||||
|
||||
// Genesis hashes to enforce below configs on.
|
||||
|
|
@ -750,6 +751,21 @@ func (c *ChainConfig) ElasticityMultiplier() uint64 {
|
|||
return DefaultElasticityMultiplier
|
||||
}
|
||||
|
||||
// LatestFork returns the latest time-based fork that would be active for the given time.
|
||||
func (c *ChainConfig) LatestFork(time uint64) forks.Fork {
|
||||
// Assume last non-time-based fork has passed.
|
||||
london := c.LondonBlock
|
||||
|
||||
switch {
|
||||
case c.IsCancun(london, time):
|
||||
return forks.Cancun
|
||||
case c.IsShanghai(london, time):
|
||||
return forks.Shanghai
|
||||
default:
|
||||
return forks.Paris
|
||||
}
|
||||
}
|
||||
|
||||
// isForkBlockIncompatible returns true if a fork scheduled at block s1 cannot be
|
||||
// rescheduled to block s2 because head is already past the fork.
|
||||
func isForkBlockIncompatible(s1, s2, head *big.Int) bool {
|
||||
|
|
|
|||
42
params/forks/forks.go
Normal file
42
params/forks/forks.go
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
// Copyright 2023 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package forks
|
||||
|
||||
// Fork is a numerical identifier of specific network upgrades (forks).
|
||||
type Fork int
|
||||
|
||||
const (
|
||||
Frontier = iota
|
||||
FrontierThawing
|
||||
Homestead
|
||||
DAO
|
||||
TangerineWhistle
|
||||
SpuriousDragon
|
||||
Byzantium
|
||||
Constantinople
|
||||
Petersburg
|
||||
Istanbul
|
||||
MuirGlacier
|
||||
Berlin
|
||||
London
|
||||
ArrowGlacier
|
||||
GrayGlacier
|
||||
Paris
|
||||
Shanghai
|
||||
Cancun
|
||||
Prague
|
||||
)
|
||||
Loading…
Reference in a new issue