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/log"
|
||||||
"github.com/ethereum/go-ethereum/miner"
|
"github.com/ethereum/go-ethereum/miner"
|
||||||
"github.com/ethereum/go-ethereum/node"
|
"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"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -192,7 +192,7 @@ func (api *ConsensusAPI) ForkchoiceUpdatedV2(update engine.ForkchoiceStateV1, pa
|
||||||
if params.BeaconRoot != nil {
|
if params.BeaconRoot != nil {
|
||||||
return engine.STATUS_INVALID, engine.InvalidParams.With(errors.New("unexpected beacon root"))
|
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"))
|
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 {
|
if params.BeaconRoot == nil {
|
||||||
return engine.STATUS_INVALID, engine.InvalidParams.With(errors.New("missing beacon root"))
|
return engine.STATUS_INVALID, engine.InvalidParams.With(errors.New("missing beacon root"))
|
||||||
}
|
}
|
||||||
if !latestActive(api.eth.BlockChain().Config(), "cancun", params.Timestamp) {
|
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 shanghai payloads"))
|
return engine.STATUS_INVALID, engine.UnsupportedFork.With(errors.New("forkchoiceUpdatedV3 must only be called for cancun payloads"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return api.forkchoiceUpdated(update, params)
|
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.
|
// 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) {
|
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 {
|
if params.Withdrawals == nil {
|
||||||
return engine.PayloadStatusV1{Status: engine.INVALID}, engine.InvalidParams.With(errors.New("nil withdrawals post-shanghai"))
|
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"))
|
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 engine.PayloadStatusV1{Status: engine.INVALID}, engine.UnsupportedFork.With(errors.New("newPayloadV3 must only be called for cancun payloads"))
|
||||||
}
|
}
|
||||||
return api.newPayload(params, versionedHashes, beaconRoot)
|
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) {
|
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:
|
// The locking here is, strictly, not required. Without these locks, this can happen:
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/params/forks"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Genesis hashes to enforce below configs on.
|
// Genesis hashes to enforce below configs on.
|
||||||
|
|
@ -750,6 +751,21 @@ func (c *ChainConfig) ElasticityMultiplier() uint64 {
|
||||||
return DefaultElasticityMultiplier
|
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
|
// isForkBlockIncompatible returns true if a fork scheduled at block s1 cannot be
|
||||||
// rescheduled to block s2 because head is already past the fork.
|
// rescheduled to block s2 because head is already past the fork.
|
||||||
func isForkBlockIncompatible(s1, s2, head *big.Int) bool {
|
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