2016-03-01 16:32:43 -06:00
|
|
|
// Copyright 2016 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/>.
|
|
|
|
|
2016-10-20 06:36:29 -05:00
|
|
|
package params
|
2016-03-01 16:32:43 -06:00
|
|
|
|
|
|
|
import (
|
2016-11-23 06:32:25 -06:00
|
|
|
"fmt"
|
2024-10-23 01:26:18 -05:00
|
|
|
"math"
|
2016-03-01 16:32:43 -06:00
|
|
|
"math/big"
|
|
|
|
|
2016-10-24 03:40:58 -05:00
|
|
|
"github.com/ethereum/go-ethereum/common"
|
2024-01-23 09:02:08 -06:00
|
|
|
"github.com/ethereum/go-ethereum/params/forks"
|
2016-03-01 16:32:43 -06:00
|
|
|
)
|
|
|
|
|
2018-06-05 05:31:34 -05:00
|
|
|
// Genesis hashes to enforce below configs on.
|
2017-07-04 04:28:58 -05:00
|
|
|
var (
|
2021-08-17 11:43:25 -05:00
|
|
|
MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3")
|
2023-09-25 08:13:56 -05:00
|
|
|
HoleskyGenesisHash = common.HexToHash("0xb5f7f912443c940f21fd611f12828d75b534364ed9e95ca4e307729a4661bde4")
|
2021-11-08 05:06:01 -06:00
|
|
|
SepoliaGenesisHash = common.HexToHash("0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9")
|
2017-07-04 04:28:58 -05:00
|
|
|
)
|
|
|
|
|
2023-02-10 05:34:45 -06:00
|
|
|
func newUint64(val uint64) *uint64 { return &val }
|
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
var (
|
2022-08-16 01:38:23 -05:00
|
|
|
MainnetTerminalTotalDifficulty, _ = new(big.Int).SetString("58_750_000_000_000_000_000_000", 0)
|
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// MainnetChainConfig is the chain parameters to run a node on the main network.
|
|
|
|
MainnetChainConfig = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(1),
|
|
|
|
HomesteadBlock: big.NewInt(1_150_000),
|
|
|
|
DAOForkBlock: big.NewInt(1_920_000),
|
|
|
|
DAOForkSupport: true,
|
|
|
|
EIP150Block: big.NewInt(2_463_000),
|
|
|
|
EIP155Block: big.NewInt(2_675_000),
|
|
|
|
EIP158Block: big.NewInt(2_675_000),
|
|
|
|
ByzantiumBlock: big.NewInt(4_370_000),
|
|
|
|
ConstantinopleBlock: big.NewInt(7_280_000),
|
|
|
|
PetersburgBlock: big.NewInt(7_280_000),
|
|
|
|
IstanbulBlock: big.NewInt(9_069_000),
|
|
|
|
MuirGlacierBlock: big.NewInt(9_200_000),
|
|
|
|
BerlinBlock: big.NewInt(12_244_000),
|
|
|
|
LondonBlock: big.NewInt(12_965_000),
|
|
|
|
ArrowGlacierBlock: big.NewInt(13_773_000),
|
|
|
|
GrayGlacierBlock: big.NewInt(15_050_000),
|
|
|
|
TerminalTotalDifficulty: MainnetTerminalTotalDifficulty, // 58_750_000_000_000_000_000_000
|
|
|
|
ShanghaiTime: newUint64(1681338455),
|
|
|
|
CancunTime: newUint64(1710338135),
|
|
|
|
DepositContractAddress: common.HexToAddress("0x00000000219ab540356cbb839cbe05303d7705fa"),
|
|
|
|
Ethash: new(EthashConfig),
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2023-08-25 10:11:40 -05:00
|
|
|
// HoleskyChainConfig contains the chain parameters to run a node on the Holesky test network.
|
|
|
|
HoleskyChainConfig = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(17000),
|
|
|
|
HomesteadBlock: big.NewInt(0),
|
|
|
|
DAOForkBlock: nil,
|
|
|
|
DAOForkSupport: true,
|
|
|
|
EIP150Block: big.NewInt(0),
|
|
|
|
EIP155Block: big.NewInt(0),
|
|
|
|
EIP158Block: big.NewInt(0),
|
|
|
|
ByzantiumBlock: big.NewInt(0),
|
|
|
|
ConstantinopleBlock: big.NewInt(0),
|
|
|
|
PetersburgBlock: big.NewInt(0),
|
|
|
|
IstanbulBlock: big.NewInt(0),
|
|
|
|
MuirGlacierBlock: nil,
|
|
|
|
BerlinBlock: big.NewInt(0),
|
|
|
|
LondonBlock: big.NewInt(0),
|
|
|
|
ArrowGlacierBlock: nil,
|
|
|
|
GrayGlacierBlock: nil,
|
|
|
|
TerminalTotalDifficulty: big.NewInt(0),
|
|
|
|
MergeNetsplitBlock: nil,
|
|
|
|
ShanghaiTime: newUint64(1696000704),
|
|
|
|
CancunTime: newUint64(1707305664),
|
|
|
|
Ethash: new(EthashConfig),
|
2023-08-25 10:11:40 -05:00
|
|
|
}
|
2021-11-08 05:06:01 -06:00
|
|
|
// SepoliaChainConfig contains the chain parameters to run a node on the Sepolia test network.
|
|
|
|
SepoliaChainConfig = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(11155111),
|
|
|
|
HomesteadBlock: big.NewInt(0),
|
|
|
|
DAOForkBlock: nil,
|
|
|
|
DAOForkSupport: true,
|
|
|
|
EIP150Block: big.NewInt(0),
|
|
|
|
EIP155Block: big.NewInt(0),
|
|
|
|
EIP158Block: big.NewInt(0),
|
|
|
|
ByzantiumBlock: big.NewInt(0),
|
|
|
|
ConstantinopleBlock: big.NewInt(0),
|
|
|
|
PetersburgBlock: big.NewInt(0),
|
|
|
|
IstanbulBlock: big.NewInt(0),
|
|
|
|
MuirGlacierBlock: big.NewInt(0),
|
|
|
|
BerlinBlock: big.NewInt(0),
|
|
|
|
LondonBlock: big.NewInt(0),
|
|
|
|
ArrowGlacierBlock: nil,
|
|
|
|
GrayGlacierBlock: nil,
|
|
|
|
TerminalTotalDifficulty: big.NewInt(17_000_000_000_000_000),
|
|
|
|
MergeNetsplitBlock: big.NewInt(1735371),
|
|
|
|
ShanghaiTime: newUint64(1677557088),
|
|
|
|
CancunTime: newUint64(1706655072),
|
|
|
|
Ethash: new(EthashConfig),
|
2021-11-08 05:06:01 -06:00
|
|
|
}
|
2017-10-24 05:40:42 -05:00
|
|
|
// AllEthashProtocolChanges contains every protocol change (EIPs) introduced
|
|
|
|
// and accepted by the Ethereum core developers into the Ethash consensus.
|
2023-01-20 03:57:50 -06:00
|
|
|
AllEthashProtocolChanges = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(1337),
|
|
|
|
HomesteadBlock: big.NewInt(0),
|
|
|
|
DAOForkBlock: nil,
|
|
|
|
DAOForkSupport: false,
|
|
|
|
EIP150Block: big.NewInt(0),
|
|
|
|
EIP155Block: big.NewInt(0),
|
|
|
|
EIP158Block: big.NewInt(0),
|
|
|
|
ByzantiumBlock: big.NewInt(0),
|
|
|
|
ConstantinopleBlock: big.NewInt(0),
|
|
|
|
PetersburgBlock: big.NewInt(0),
|
|
|
|
IstanbulBlock: big.NewInt(0),
|
|
|
|
MuirGlacierBlock: big.NewInt(0),
|
|
|
|
BerlinBlock: big.NewInt(0),
|
|
|
|
LondonBlock: big.NewInt(0),
|
|
|
|
ArrowGlacierBlock: big.NewInt(0),
|
|
|
|
GrayGlacierBlock: big.NewInt(0),
|
|
|
|
TerminalTotalDifficulty: big.NewInt(math.MaxInt64),
|
|
|
|
MergeNetsplitBlock: nil,
|
|
|
|
ShanghaiTime: nil,
|
|
|
|
CancunTime: nil,
|
|
|
|
PragueTime: nil,
|
|
|
|
VerkleTime: nil,
|
|
|
|
Ethash: new(EthashConfig),
|
|
|
|
Clique: nil,
|
2023-01-20 03:57:50 -06:00
|
|
|
}
|
2017-10-24 05:40:42 -05:00
|
|
|
|
2023-07-06 03:42:34 -05:00
|
|
|
AllDevChainProtocolChanges = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(1337),
|
|
|
|
HomesteadBlock: big.NewInt(0),
|
|
|
|
EIP150Block: big.NewInt(0),
|
|
|
|
EIP155Block: big.NewInt(0),
|
|
|
|
EIP158Block: big.NewInt(0),
|
|
|
|
ByzantiumBlock: big.NewInt(0),
|
|
|
|
ConstantinopleBlock: big.NewInt(0),
|
|
|
|
PetersburgBlock: big.NewInt(0),
|
|
|
|
IstanbulBlock: big.NewInt(0),
|
|
|
|
MuirGlacierBlock: big.NewInt(0),
|
|
|
|
BerlinBlock: big.NewInt(0),
|
|
|
|
LondonBlock: big.NewInt(0),
|
|
|
|
ArrowGlacierBlock: big.NewInt(0),
|
|
|
|
GrayGlacierBlock: big.NewInt(0),
|
|
|
|
ShanghaiTime: newUint64(0),
|
|
|
|
CancunTime: newUint64(0),
|
|
|
|
TerminalTotalDifficulty: big.NewInt(0),
|
|
|
|
PragueTime: newUint64(0),
|
2023-07-06 03:42:34 -05:00
|
|
|
}
|
|
|
|
|
2017-10-24 05:40:42 -05:00
|
|
|
// AllCliqueProtocolChanges contains every protocol change (EIPs) introduced
|
|
|
|
// and accepted by the Ethereum core developers into the Clique consensus.
|
2023-01-20 03:57:50 -06:00
|
|
|
AllCliqueProtocolChanges = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(1337),
|
|
|
|
HomesteadBlock: big.NewInt(0),
|
|
|
|
DAOForkBlock: nil,
|
|
|
|
DAOForkSupport: false,
|
|
|
|
EIP150Block: big.NewInt(0),
|
|
|
|
EIP155Block: big.NewInt(0),
|
|
|
|
EIP158Block: big.NewInt(0),
|
|
|
|
ByzantiumBlock: big.NewInt(0),
|
|
|
|
ConstantinopleBlock: big.NewInt(0),
|
|
|
|
PetersburgBlock: big.NewInt(0),
|
|
|
|
IstanbulBlock: big.NewInt(0),
|
|
|
|
MuirGlacierBlock: big.NewInt(0),
|
|
|
|
BerlinBlock: big.NewInt(0),
|
|
|
|
LondonBlock: big.NewInt(0),
|
|
|
|
ArrowGlacierBlock: nil,
|
|
|
|
GrayGlacierBlock: nil,
|
|
|
|
MergeNetsplitBlock: nil,
|
|
|
|
ShanghaiTime: nil,
|
|
|
|
CancunTime: nil,
|
|
|
|
PragueTime: nil,
|
|
|
|
VerkleTime: nil,
|
|
|
|
TerminalTotalDifficulty: big.NewInt(math.MaxInt64),
|
|
|
|
Ethash: nil,
|
|
|
|
Clique: &CliqueConfig{Period: 0, Epoch: 30000},
|
2023-01-20 03:57:50 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// TestChainConfig contains every protocol change (EIPs) introduced
|
2023-10-10 03:22:45 -05:00
|
|
|
// and accepted by the Ethereum core developers for testing purposes.
|
2023-01-20 03:57:50 -06:00
|
|
|
TestChainConfig = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(1),
|
|
|
|
HomesteadBlock: big.NewInt(0),
|
|
|
|
DAOForkBlock: nil,
|
|
|
|
DAOForkSupport: false,
|
|
|
|
EIP150Block: big.NewInt(0),
|
|
|
|
EIP155Block: big.NewInt(0),
|
|
|
|
EIP158Block: big.NewInt(0),
|
|
|
|
ByzantiumBlock: big.NewInt(0),
|
|
|
|
ConstantinopleBlock: big.NewInt(0),
|
|
|
|
PetersburgBlock: big.NewInt(0),
|
|
|
|
IstanbulBlock: big.NewInt(0),
|
|
|
|
MuirGlacierBlock: big.NewInt(0),
|
|
|
|
BerlinBlock: big.NewInt(0),
|
|
|
|
LondonBlock: big.NewInt(0),
|
|
|
|
ArrowGlacierBlock: big.NewInt(0),
|
|
|
|
GrayGlacierBlock: big.NewInt(0),
|
|
|
|
MergeNetsplitBlock: nil,
|
|
|
|
ShanghaiTime: nil,
|
|
|
|
CancunTime: nil,
|
|
|
|
PragueTime: nil,
|
|
|
|
VerkleTime: nil,
|
|
|
|
TerminalTotalDifficulty: big.NewInt(math.MaxInt64),
|
|
|
|
Ethash: new(EthashConfig),
|
|
|
|
Clique: nil,
|
2023-01-20 03:57:50 -06:00
|
|
|
}
|
|
|
|
|
2024-01-17 08:06:14 -06:00
|
|
|
// MergedTestChainConfig contains every protocol change (EIPs) introduced
|
|
|
|
// and accepted by the Ethereum core developers for testing purposes.
|
|
|
|
MergedTestChainConfig = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(1),
|
|
|
|
HomesteadBlock: big.NewInt(0),
|
|
|
|
DAOForkBlock: nil,
|
|
|
|
DAOForkSupport: false,
|
|
|
|
EIP150Block: big.NewInt(0),
|
|
|
|
EIP155Block: big.NewInt(0),
|
|
|
|
EIP158Block: big.NewInt(0),
|
|
|
|
ByzantiumBlock: big.NewInt(0),
|
|
|
|
ConstantinopleBlock: big.NewInt(0),
|
|
|
|
PetersburgBlock: big.NewInt(0),
|
|
|
|
IstanbulBlock: big.NewInt(0),
|
|
|
|
MuirGlacierBlock: big.NewInt(0),
|
|
|
|
BerlinBlock: big.NewInt(0),
|
|
|
|
LondonBlock: big.NewInt(0),
|
|
|
|
ArrowGlacierBlock: big.NewInt(0),
|
|
|
|
GrayGlacierBlock: big.NewInt(0),
|
|
|
|
MergeNetsplitBlock: big.NewInt(0),
|
|
|
|
ShanghaiTime: newUint64(0),
|
|
|
|
CancunTime: newUint64(0),
|
|
|
|
PragueTime: newUint64(0),
|
|
|
|
VerkleTime: nil,
|
|
|
|
TerminalTotalDifficulty: big.NewInt(0),
|
|
|
|
Ethash: new(EthashConfig),
|
|
|
|
Clique: nil,
|
2024-01-17 08:06:14 -06:00
|
|
|
}
|
|
|
|
|
2023-01-20 03:57:50 -06:00
|
|
|
// NonActivatedConfig defines the chain configuration without activating
|
|
|
|
// any protocol change (EIPs).
|
|
|
|
NonActivatedConfig = &ChainConfig{
|
2024-10-23 01:26:18 -05:00
|
|
|
ChainID: big.NewInt(1),
|
|
|
|
HomesteadBlock: nil,
|
|
|
|
DAOForkBlock: nil,
|
|
|
|
DAOForkSupport: false,
|
|
|
|
EIP150Block: nil,
|
|
|
|
EIP155Block: nil,
|
|
|
|
EIP158Block: nil,
|
|
|
|
ByzantiumBlock: nil,
|
|
|
|
ConstantinopleBlock: nil,
|
|
|
|
PetersburgBlock: nil,
|
|
|
|
IstanbulBlock: nil,
|
|
|
|
MuirGlacierBlock: nil,
|
|
|
|
BerlinBlock: nil,
|
|
|
|
LondonBlock: nil,
|
|
|
|
ArrowGlacierBlock: nil,
|
|
|
|
GrayGlacierBlock: nil,
|
|
|
|
MergeNetsplitBlock: nil,
|
|
|
|
ShanghaiTime: nil,
|
|
|
|
CancunTime: nil,
|
|
|
|
PragueTime: nil,
|
|
|
|
VerkleTime: nil,
|
|
|
|
TerminalTotalDifficulty: big.NewInt(math.MaxInt64),
|
|
|
|
Ethash: new(EthashConfig),
|
|
|
|
Clique: nil,
|
2023-01-20 03:57:50 -06:00
|
|
|
}
|
2023-01-25 05:12:28 -06:00
|
|
|
TestRules = TestChainConfig.Rules(new(big.Int), false, 0)
|
2017-03-02 07:03:33 -06:00
|
|
|
)
|
2017-02-28 16:18:13 -06:00
|
|
|
|
2022-06-07 05:49:07 -05:00
|
|
|
// NetworkNames are user friendly names to use in the chain spec banner.
|
|
|
|
var NetworkNames = map[string]string{
|
|
|
|
MainnetChainConfig.ChainID.String(): "mainnet",
|
|
|
|
SepoliaChainConfig.ChainID.String(): "sepolia",
|
2023-08-25 10:11:40 -05:00
|
|
|
HoleskyChainConfig.ChainID.String(): "holesky",
|
2022-06-07 05:49:07 -05:00
|
|
|
}
|
|
|
|
|
2016-03-01 16:32:43 -06:00
|
|
|
// ChainConfig is the core config which determines the blockchain settings.
|
|
|
|
//
|
|
|
|
// ChainConfig is stored in the database on a per block basis. This means
|
|
|
|
// that any network, identified by its genesis block, can have its own
|
|
|
|
// set of configuration options.
|
|
|
|
type ChainConfig struct {
|
2018-06-05 05:31:34 -05:00
|
|
|
ChainID *big.Int `json:"chainId"` // chainId identifies the current chain and is used for replay protection
|
2016-11-02 07:44:13 -05:00
|
|
|
|
2017-04-10 05:24:12 -05:00
|
|
|
HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Homestead switch block (nil = no fork, 0 = already homestead)
|
2017-10-10 03:56:33 -05:00
|
|
|
|
2017-04-10 05:24:12 -05:00
|
|
|
DAOForkBlock *big.Int `json:"daoForkBlock,omitempty"` // TheDAO hard-fork switch block (nil = no fork)
|
|
|
|
DAOForkSupport bool `json:"daoForkSupport,omitempty"` // Whether the nodes supports or opposes the DAO hard-fork
|
2016-03-01 16:32:43 -06:00
|
|
|
|
2016-10-20 06:36:29 -05:00
|
|
|
// EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150)
|
2023-04-18 02:49:09 -05:00
|
|
|
EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork)
|
2017-05-12 14:35:45 -05:00
|
|
|
EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF block
|
|
|
|
EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block
|
2017-02-01 15:36:51 -06:00
|
|
|
|
2018-02-23 04:32:57 -06:00
|
|
|
ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = already on byzantium)
|
|
|
|
ConstantinopleBlock *big.Int `json:"constantinopleBlock,omitempty"` // Constantinople switch block (nil = no fork, 0 = already activated)
|
2019-01-24 04:36:30 -06:00
|
|
|
PetersburgBlock *big.Int `json:"petersburgBlock,omitempty"` // Petersburg switch block (nil = same as Constantinople)
|
2019-08-06 09:12:54 -05:00
|
|
|
IstanbulBlock *big.Int `json:"istanbulBlock,omitempty"` // Istanbul switch block (nil = no fork, 0 = already on istanbul)
|
2019-12-06 03:36:40 -06:00
|
|
|
MuirGlacierBlock *big.Int `json:"muirGlacierBlock,omitempty"` // Eip-2384 (bomb delay) switch block (nil = no fork, 0 = already activated)
|
2021-02-25 01:10:30 -06:00
|
|
|
BerlinBlock *big.Int `json:"berlinBlock,omitempty"` // Berlin switch block (nil = no fork, 0 = already on berlin)
|
2021-05-06 04:07:42 -05:00
|
|
|
LondonBlock *big.Int `json:"londonBlock,omitempty"` // London switch block (nil = no fork, 0 = already on london)
|
2021-10-28 15:18:14 -05:00
|
|
|
ArrowGlacierBlock *big.Int `json:"arrowGlacierBlock,omitempty"` // Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)
|
2022-06-15 06:10:38 -05:00
|
|
|
GrayGlacierBlock *big.Int `json:"grayGlacierBlock,omitempty"` // Eip-5133 (bomb delay) switch block (nil = no fork, 0 = already activated)
|
2022-06-07 05:49:07 -05:00
|
|
|
MergeNetsplitBlock *big.Int `json:"mergeNetsplitBlock,omitempty"` // Virtual fork after The Merge to use as a network splitter
|
2020-06-03 04:05:15 -05:00
|
|
|
|
2022-12-15 01:40:33 -06:00
|
|
|
// Fork scheduling was switched from blocks to timestamps here
|
|
|
|
|
2023-01-25 05:12:28 -06:00
|
|
|
ShanghaiTime *uint64 `json:"shanghaiTime,omitempty"` // Shanghai switch time (nil = no fork, 0 = already on shanghai)
|
|
|
|
CancunTime *uint64 `json:"cancunTime,omitempty"` // Cancun switch time (nil = no fork, 0 = already on cancun)
|
|
|
|
PragueTime *uint64 `json:"pragueTime,omitempty"` // Prague switch time (nil = no fork, 0 = already on prague)
|
2023-06-28 04:08:48 -05:00
|
|
|
VerkleTime *uint64 `json:"verkleTime,omitempty"` // Verkle switch time (nil = no fork, 0 = already on verkle)
|
2022-12-15 01:40:33 -06:00
|
|
|
|
2021-10-11 10:58:11 -05:00
|
|
|
// TerminalTotalDifficulty is the amount of total difficulty reached by
|
|
|
|
// the network that triggers the consensus upgrade.
|
|
|
|
TerminalTotalDifficulty *big.Int `json:"terminalTotalDifficulty,omitempty"`
|
2017-04-10 05:24:12 -05:00
|
|
|
|
2024-09-04 07:33:51 -05:00
|
|
|
DepositContractAddress common.Address `json:"depositContractAddress,omitempty"`
|
|
|
|
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
// EnableVerkleAtGenesis is a flag that specifies whether the network uses
|
|
|
|
// the Verkle tree starting from the genesis block. If set to true, the
|
|
|
|
// genesis state will be committed using the Verkle tree, eliminating the
|
|
|
|
// need for any Verkle transition later.
|
|
|
|
//
|
|
|
|
// This is a temporary flag only for verkle devnet testing, where verkle is
|
|
|
|
// activated at genesis, and the configured activation date has already passed.
|
|
|
|
//
|
|
|
|
// In production networks (mainnet and public testnets), verkle activation
|
|
|
|
// always occurs after the genesis block, making this flag irrelevant in
|
|
|
|
// those cases.
|
|
|
|
EnableVerkleAtGenesis bool `json:"enableVerkleAtGenesis,omitempty"`
|
|
|
|
|
2017-04-10 05:24:12 -05:00
|
|
|
// Various consensus engines
|
2023-11-22 05:01:38 -06:00
|
|
|
Ethash *EthashConfig `json:"ethash,omitempty"`
|
|
|
|
Clique *CliqueConfig `json:"clique,omitempty"`
|
2017-04-10 05:24:12 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// EthashConfig is the consensus engine configs for proof-of-work based sealing.
|
|
|
|
type EthashConfig struct{}
|
|
|
|
|
|
|
|
// String implements the stringer interface, returning the consensus engine details.
|
2024-04-28 06:03:03 -05:00
|
|
|
func (c EthashConfig) String() string {
|
2017-04-10 05:24:12 -05:00
|
|
|
return "ethash"
|
|
|
|
}
|
|
|
|
|
|
|
|
// CliqueConfig is the consensus engine configs for proof-of-authority based sealing.
|
|
|
|
type CliqueConfig struct {
|
|
|
|
Period uint64 `json:"period"` // Number of seconds between blocks to enforce
|
|
|
|
Epoch uint64 `json:"epoch"` // Epoch length to reset votes and checkpoint
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements the stringer interface, returning the consensus engine details.
|
2024-04-28 06:03:03 -05:00
|
|
|
func (c CliqueConfig) String() string {
|
|
|
|
return fmt.Sprintf("clique(period: %d, epoch: %d)", c.Period, c.Epoch)
|
2016-03-01 16:32:43 -06:00
|
|
|
}
|
|
|
|
|
2022-09-17 14:27:10 -05:00
|
|
|
// Description returns a human-readable description of ChainConfig.
|
|
|
|
func (c *ChainConfig) Description() string {
|
2022-06-07 05:49:07 -05:00
|
|
|
var banner string
|
|
|
|
|
2023-09-17 09:02:48 -05:00
|
|
|
// Create some basic network config output
|
2022-06-07 05:49:07 -05:00
|
|
|
network := NetworkNames[c.ChainID.String()]
|
|
|
|
if network == "" {
|
|
|
|
network = "unknown"
|
|
|
|
}
|
|
|
|
banner += fmt.Sprintf("Chain ID: %v (%s)\n", c.ChainID, network)
|
2017-04-10 05:24:12 -05:00
|
|
|
switch {
|
|
|
|
case c.Ethash != nil:
|
2024-10-23 01:26:18 -05:00
|
|
|
banner += "Consensus: Beacon (proof-of-stake), merged from Ethash (proof-of-work)\n"
|
2017-04-10 05:24:12 -05:00
|
|
|
case c.Clique != nil:
|
2024-10-23 01:26:18 -05:00
|
|
|
banner += "Consensus: Beacon (proof-of-stake), merged from Clique (proof-of-authority)\n"
|
2017-04-10 05:24:12 -05:00
|
|
|
default:
|
2022-06-07 05:49:07 -05:00
|
|
|
banner += "Consensus: unknown\n"
|
|
|
|
}
|
|
|
|
banner += "\n"
|
|
|
|
|
|
|
|
// Create a list of forks with a short description of them. Forks that only
|
|
|
|
// makes sense for mainnet should be optional at printing to avoid bloating
|
|
|
|
// the output for testnets and private networks.
|
2023-01-06 07:07:38 -06:00
|
|
|
banner += "Pre-Merge hard forks (block based):\n"
|
|
|
|
banner += fmt.Sprintf(" - Homestead: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/homestead.md)\n", c.HomesteadBlock)
|
2022-06-07 05:49:07 -05:00
|
|
|
if c.DAOForkBlock != nil {
|
2023-01-06 07:07:38 -06:00
|
|
|
banner += fmt.Sprintf(" - DAO Fork: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/dao-fork.md)\n", c.DAOForkBlock)
|
2022-06-07 05:49:07 -05:00
|
|
|
}
|
2023-01-06 07:07:38 -06:00
|
|
|
banner += fmt.Sprintf(" - Tangerine Whistle (EIP 150): #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/tangerine-whistle.md)\n", c.EIP150Block)
|
|
|
|
banner += fmt.Sprintf(" - Spurious Dragon/1 (EIP 155): #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md)\n", c.EIP155Block)
|
|
|
|
banner += fmt.Sprintf(" - Spurious Dragon/2 (EIP 158): #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md)\n", c.EIP155Block)
|
|
|
|
banner += fmt.Sprintf(" - Byzantium: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/byzantium.md)\n", c.ByzantiumBlock)
|
|
|
|
banner += fmt.Sprintf(" - Constantinople: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/constantinople.md)\n", c.ConstantinopleBlock)
|
|
|
|
banner += fmt.Sprintf(" - Petersburg: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/petersburg.md)\n", c.PetersburgBlock)
|
|
|
|
banner += fmt.Sprintf(" - Istanbul: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/istanbul.md)\n", c.IstanbulBlock)
|
2022-06-07 05:49:07 -05:00
|
|
|
if c.MuirGlacierBlock != nil {
|
2023-01-06 07:07:38 -06:00
|
|
|
banner += fmt.Sprintf(" - Muir Glacier: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/muir-glacier.md)\n", c.MuirGlacierBlock)
|
2022-06-07 05:49:07 -05:00
|
|
|
}
|
2023-01-06 07:07:38 -06:00
|
|
|
banner += fmt.Sprintf(" - Berlin: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/berlin.md)\n", c.BerlinBlock)
|
|
|
|
banner += fmt.Sprintf(" - London: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md)\n", c.LondonBlock)
|
2022-06-07 05:49:07 -05:00
|
|
|
if c.ArrowGlacierBlock != nil {
|
2023-01-06 07:07:38 -06:00
|
|
|
banner += fmt.Sprintf(" - Arrow Glacier: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/arrow-glacier.md)\n", c.ArrowGlacierBlock)
|
2022-06-07 05:49:07 -05:00
|
|
|
}
|
2022-06-15 06:10:38 -05:00
|
|
|
if c.GrayGlacierBlock != nil {
|
2023-01-06 07:07:38 -06:00
|
|
|
banner += fmt.Sprintf(" - Gray Glacier: #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/gray-glacier.md)\n", c.GrayGlacierBlock)
|
2022-07-19 07:50:17 -05:00
|
|
|
}
|
2022-06-07 05:49:07 -05:00
|
|
|
banner += "\n"
|
|
|
|
|
|
|
|
// Add a special section for the merge as it's non-obvious
|
2024-10-23 01:26:18 -05:00
|
|
|
banner += "Merge configured:\n"
|
|
|
|
banner += " - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md\n"
|
|
|
|
banner += " - Network known to be merged\n"
|
|
|
|
banner += fmt.Sprintf(" - Total terminal difficulty: %v\n", c.TerminalTotalDifficulty)
|
|
|
|
if c.MergeNetsplitBlock != nil {
|
|
|
|
banner += fmt.Sprintf(" - Merge netsplit block: #%-8v\n", c.MergeNetsplitBlock)
|
2023-01-06 07:07:38 -06:00
|
|
|
}
|
|
|
|
banner += "\n"
|
|
|
|
|
|
|
|
// Create a list of forks post-merge
|
|
|
|
banner += "Post-Merge hard forks (timestamp based):\n"
|
|
|
|
if c.ShanghaiTime != nil {
|
2023-01-27 05:03:34 -06:00
|
|
|
banner += fmt.Sprintf(" - Shanghai: @%-10v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md)\n", *c.ShanghaiTime)
|
2023-01-06 07:07:38 -06:00
|
|
|
}
|
2023-01-20 03:57:50 -06:00
|
|
|
if c.CancunTime != nil {
|
2024-02-21 01:59:21 -06:00
|
|
|
banner += fmt.Sprintf(" - Cancun: @%-10v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/cancun.md)\n", *c.CancunTime)
|
2023-01-20 03:57:50 -06:00
|
|
|
}
|
|
|
|
if c.PragueTime != nil {
|
2023-01-27 05:03:34 -06:00
|
|
|
banner += fmt.Sprintf(" - Prague: @%-10v\n", *c.PragueTime)
|
2022-06-07 05:49:07 -05:00
|
|
|
}
|
2023-06-28 04:08:48 -05:00
|
|
|
if c.VerkleTime != nil {
|
|
|
|
banner += fmt.Sprintf(" - Verkle: @%-10v\n", *c.VerkleTime)
|
|
|
|
}
|
2022-06-07 05:49:07 -05:00
|
|
|
return banner
|
2016-11-23 06:32:25 -06:00
|
|
|
}
|
|
|
|
|
2016-03-01 16:32:43 -06:00
|
|
|
// IsHomestead returns whether num is either equal to the homestead block or greater.
|
|
|
|
func (c *ChainConfig) IsHomestead(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.HomesteadBlock, num)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
|
2018-06-05 05:31:34 -05:00
|
|
|
// IsDAOFork returns whether num is either equal to the DAO fork block or greater.
|
2017-03-02 07:03:33 -06:00
|
|
|
func (c *ChainConfig) IsDAOFork(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.DAOForkBlock, num)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
|
2018-06-05 05:31:34 -05:00
|
|
|
// IsEIP150 returns whether num is either equal to the EIP150 fork block or greater.
|
2017-03-02 07:03:33 -06:00
|
|
|
func (c *ChainConfig) IsEIP150(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.EIP150Block, num)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
|
2018-06-05 05:31:34 -05:00
|
|
|
// IsEIP155 returns whether num is either equal to the EIP155 fork block or greater.
|
2017-03-02 07:03:33 -06:00
|
|
|
func (c *ChainConfig) IsEIP155(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.EIP155Block, num)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
|
2018-06-05 05:31:34 -05:00
|
|
|
// IsEIP158 returns whether num is either equal to the EIP158 fork block or greater.
|
2017-03-02 07:03:33 -06:00
|
|
|
func (c *ChainConfig) IsEIP158(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.EIP158Block, num)
|
2016-03-01 16:32:43 -06:00
|
|
|
}
|
2016-10-07 17:23:45 -05:00
|
|
|
|
2018-06-05 05:31:34 -05:00
|
|
|
// IsByzantium returns whether num is either equal to the Byzantium fork block or greater.
|
2017-09-14 02:07:31 -05:00
|
|
|
func (c *ChainConfig) IsByzantium(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.ByzantiumBlock, num)
|
2017-05-12 14:35:45 -05:00
|
|
|
}
|
|
|
|
|
2018-06-05 05:31:34 -05:00
|
|
|
// IsConstantinople returns whether num is either equal to the Constantinople fork block or greater.
|
2018-02-23 04:32:57 -06:00
|
|
|
func (c *ChainConfig) IsConstantinople(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.ConstantinopleBlock, num)
|
2018-02-23 04:32:57 -06:00
|
|
|
}
|
|
|
|
|
2019-12-06 03:36:40 -06:00
|
|
|
// IsMuirGlacier returns whether num is either equal to the Muir Glacier (EIP-2384) fork block or greater.
|
|
|
|
func (c *ChainConfig) IsMuirGlacier(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.MuirGlacierBlock, num)
|
2019-12-06 03:36:40 -06:00
|
|
|
}
|
|
|
|
|
2019-01-24 04:36:30 -06:00
|
|
|
// IsPetersburg returns whether num is either
|
|
|
|
// - equal to or greater than the PetersburgBlock fork block,
|
|
|
|
// - OR is nil, and Constantinople is active
|
|
|
|
func (c *ChainConfig) IsPetersburg(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.PetersburgBlock, num) || c.PetersburgBlock == nil && isBlockForked(c.ConstantinopleBlock, num)
|
2019-01-24 04:36:30 -06:00
|
|
|
}
|
|
|
|
|
2019-08-06 09:12:54 -05:00
|
|
|
// IsIstanbul returns whether num is either equal to the Istanbul fork block or greater.
|
|
|
|
func (c *ChainConfig) IsIstanbul(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.IstanbulBlock, num)
|
2019-08-06 09:12:54 -05:00
|
|
|
}
|
|
|
|
|
2021-02-25 01:10:30 -06:00
|
|
|
// IsBerlin returns whether num is either equal to the Berlin fork block or greater.
|
|
|
|
func (c *ChainConfig) IsBerlin(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.BerlinBlock, num)
|
2021-05-06 04:07:42 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// IsLondon returns whether num is either equal to the London fork block or greater.
|
|
|
|
func (c *ChainConfig) IsLondon(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.LondonBlock, num)
|
2020-06-03 04:05:15 -05:00
|
|
|
}
|
|
|
|
|
2021-10-28 15:18:14 -05:00
|
|
|
// IsArrowGlacier returns whether num is either equal to the Arrow Glacier (EIP-4345) fork block or greater.
|
|
|
|
func (c *ChainConfig) IsArrowGlacier(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.ArrowGlacierBlock, num)
|
2021-10-28 15:18:14 -05:00
|
|
|
}
|
|
|
|
|
2022-06-15 06:10:38 -05:00
|
|
|
// IsGrayGlacier returns whether num is either equal to the Gray Glacier (EIP-5133) fork block or greater.
|
|
|
|
func (c *ChainConfig) IsGrayGlacier(num *big.Int) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return isBlockForked(c.GrayGlacierBlock, num)
|
2022-06-15 06:10:38 -05:00
|
|
|
}
|
|
|
|
|
2021-10-11 10:58:11 -05:00
|
|
|
// IsTerminalPoWBlock returns whether the given block is the last block of PoW stage.
|
|
|
|
func (c *ChainConfig) IsTerminalPoWBlock(parentTotalDiff *big.Int, totalDiff *big.Int) bool {
|
|
|
|
if c.TerminalTotalDifficulty == nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return parentTotalDiff.Cmp(c.TerminalTotalDifficulty) < 0 && totalDiff.Cmp(c.TerminalTotalDifficulty) >= 0
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
|
|
|
|
2022-12-15 01:40:33 -06:00
|
|
|
// IsShanghai returns whether time is either equal to the Shanghai fork time or greater.
|
2023-05-19 03:27:19 -05:00
|
|
|
func (c *ChainConfig) IsShanghai(num *big.Int, time uint64) bool {
|
|
|
|
return c.IsLondon(num) && isTimestampForked(c.ShanghaiTime, time)
|
2022-07-19 07:50:17 -05:00
|
|
|
}
|
|
|
|
|
2024-05-02 03:21:11 -05:00
|
|
|
// IsCancun returns whether time is either equal to the Cancun fork time or greater.
|
2023-05-19 03:27:19 -05:00
|
|
|
func (c *ChainConfig) IsCancun(num *big.Int, time uint64) bool {
|
|
|
|
return c.IsLondon(num) && isTimestampForked(c.CancunTime, time)
|
2023-01-20 03:57:50 -06:00
|
|
|
}
|
|
|
|
|
2024-05-02 03:21:11 -05:00
|
|
|
// IsPrague returns whether time is either equal to the Prague fork time or greater.
|
2023-05-19 03:27:19 -05:00
|
|
|
func (c *ChainConfig) IsPrague(num *big.Int, time uint64) bool {
|
|
|
|
return c.IsLondon(num) && isTimestampForked(c.PragueTime, time)
|
2023-01-20 03:57:50 -06:00
|
|
|
}
|
|
|
|
|
2024-05-02 03:21:11 -05:00
|
|
|
// IsVerkle returns whether time is either equal to the Verkle fork time or greater.
|
2023-06-28 04:08:48 -05:00
|
|
|
func (c *ChainConfig) IsVerkle(num *big.Int, time uint64) bool {
|
|
|
|
return c.IsLondon(num) && isTimestampForked(c.VerkleTime, time)
|
|
|
|
}
|
|
|
|
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
// IsVerkleGenesis checks whether the verkle fork is activated at the genesis block.
|
|
|
|
//
|
|
|
|
// Verkle mode is considered enabled if the verkle fork time is configured,
|
|
|
|
// regardless of whether the local time has surpassed the fork activation time.
|
|
|
|
// This is a temporary workaround for verkle devnet testing, where verkle is
|
|
|
|
// activated at genesis, and the configured activation date has already passed.
|
|
|
|
//
|
|
|
|
// In production networks (mainnet and public testnets), verkle activation
|
|
|
|
// always occurs after the genesis block, making this function irrelevant in
|
|
|
|
// those cases.
|
|
|
|
func (c *ChainConfig) IsVerkleGenesis() bool {
|
|
|
|
return c.EnableVerkleAtGenesis
|
|
|
|
}
|
|
|
|
|
2024-05-10 13:13:11 -05:00
|
|
|
// IsEIP4762 returns whether eip 4762 has been activated at given block.
|
|
|
|
func (c *ChainConfig) IsEIP4762(num *big.Int, time uint64) bool {
|
|
|
|
return c.IsVerkle(num, time)
|
|
|
|
}
|
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// CheckCompatible checks whether scheduled fork transitions have been imported
|
|
|
|
// with a mismatching chain configuration.
|
2022-12-15 01:40:33 -06:00
|
|
|
func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64, time uint64) *ConfigCompatError {
|
|
|
|
var (
|
|
|
|
bhead = new(big.Int).SetUint64(height)
|
2023-01-25 05:12:28 -06:00
|
|
|
btime = time
|
2022-12-15 01:40:33 -06:00
|
|
|
)
|
2017-03-02 07:03:33 -06:00
|
|
|
// Iterate checkCompatible to find the lowest conflict.
|
|
|
|
var lasterr *ConfigCompatError
|
|
|
|
for {
|
2022-12-15 01:40:33 -06:00
|
|
|
err := c.checkCompatible(newcfg, bhead, btime)
|
|
|
|
if err == nil || (lasterr != nil && err.RewindToBlock == lasterr.RewindToBlock && err.RewindToTime == lasterr.RewindToTime) {
|
2017-03-02 07:03:33 -06:00
|
|
|
break
|
|
|
|
}
|
|
|
|
lasterr = err
|
2022-12-15 01:40:33 -06:00
|
|
|
|
|
|
|
if err.RewindToTime > 0 {
|
2023-01-25 05:12:28 -06:00
|
|
|
btime = err.RewindToTime
|
2022-12-15 01:40:33 -06:00
|
|
|
} else {
|
|
|
|
bhead.SetUint64(err.RewindToBlock)
|
|
|
|
}
|
2016-10-20 06:36:29 -05:00
|
|
|
}
|
2017-03-02 07:03:33 -06:00
|
|
|
return lasterr
|
2016-10-20 06:36:29 -05:00
|
|
|
}
|
|
|
|
|
2019-10-16 06:23:14 -05:00
|
|
|
// CheckConfigForkOrder checks that we don't "skip" any forks, geth isn't pluggable enough
|
2019-11-14 15:05:32 -06:00
|
|
|
// to guarantee that forks can be implemented in a different order than on official networks
|
2019-10-16 06:23:14 -05:00
|
|
|
func (c *ChainConfig) CheckConfigForkOrder() error {
|
|
|
|
type fork struct {
|
2022-12-15 01:40:33 -06:00
|
|
|
name string
|
|
|
|
block *big.Int // forks up to - and including the merge - were defined with block numbers
|
2023-01-25 05:12:28 -06:00
|
|
|
timestamp *uint64 // forks after the merge are scheduled using timestamps
|
2022-12-15 01:40:33 -06:00
|
|
|
optional bool // if true, the fork may be nil and next fork is still allowed
|
2019-10-16 06:23:14 -05:00
|
|
|
}
|
|
|
|
var lastFork fork
|
|
|
|
for _, cur := range []fork{
|
2020-06-03 04:05:15 -05:00
|
|
|
{name: "homesteadBlock", block: c.HomesteadBlock},
|
|
|
|
{name: "daoForkBlock", block: c.DAOForkBlock, optional: true},
|
|
|
|
{name: "eip150Block", block: c.EIP150Block},
|
|
|
|
{name: "eip155Block", block: c.EIP155Block},
|
|
|
|
{name: "eip158Block", block: c.EIP158Block},
|
|
|
|
{name: "byzantiumBlock", block: c.ByzantiumBlock},
|
|
|
|
{name: "constantinopleBlock", block: c.ConstantinopleBlock},
|
|
|
|
{name: "petersburgBlock", block: c.PetersburgBlock},
|
|
|
|
{name: "istanbulBlock", block: c.IstanbulBlock},
|
|
|
|
{name: "muirGlacierBlock", block: c.MuirGlacierBlock, optional: true},
|
2021-02-25 01:10:30 -06:00
|
|
|
{name: "berlinBlock", block: c.BerlinBlock},
|
2021-05-06 04:07:42 -05:00
|
|
|
{name: "londonBlock", block: c.LondonBlock},
|
2021-10-28 15:18:14 -05:00
|
|
|
{name: "arrowGlacierBlock", block: c.ArrowGlacierBlock, optional: true},
|
2022-06-15 06:10:38 -05:00
|
|
|
{name: "grayGlacierBlock", block: c.GrayGlacierBlock, optional: true},
|
2022-06-07 05:49:07 -05:00
|
|
|
{name: "mergeNetsplitBlock", block: c.MergeNetsplitBlock, optional: true},
|
2022-12-15 01:40:33 -06:00
|
|
|
{name: "shanghaiTime", timestamp: c.ShanghaiTime},
|
2023-01-20 03:57:50 -06:00
|
|
|
{name: "cancunTime", timestamp: c.CancunTime, optional: true},
|
|
|
|
{name: "pragueTime", timestamp: c.PragueTime, optional: true},
|
2023-06-28 04:08:48 -05:00
|
|
|
{name: "verkleTime", timestamp: c.VerkleTime, optional: true},
|
2019-10-16 06:23:14 -05:00
|
|
|
} {
|
|
|
|
if lastFork.name != "" {
|
2022-12-15 01:40:33 -06:00
|
|
|
switch {
|
|
|
|
// Non-optional forks must all be present in the chain config up to the last defined fork
|
|
|
|
case lastFork.block == nil && lastFork.timestamp == nil && (cur.block != nil || cur.timestamp != nil):
|
|
|
|
if cur.block != nil {
|
|
|
|
return fmt.Errorf("unsupported fork ordering: %v not enabled, but %v enabled at block %v",
|
|
|
|
lastFork.name, cur.name, cur.block)
|
|
|
|
} else {
|
|
|
|
return fmt.Errorf("unsupported fork ordering: %v not enabled, but %v enabled at timestamp %v",
|
2024-02-07 10:19:14 -06:00
|
|
|
lastFork.name, cur.name, *cur.timestamp)
|
2022-12-15 01:40:33 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Fork (whether defined by block or timestamp) must follow the fork definition sequence
|
|
|
|
case (lastFork.block != nil && cur.block != nil) || (lastFork.timestamp != nil && cur.timestamp != nil):
|
|
|
|
if lastFork.block != nil && lastFork.block.Cmp(cur.block) > 0 {
|
|
|
|
return fmt.Errorf("unsupported fork ordering: %v enabled at block %v, but %v enabled at block %v",
|
2019-10-16 06:23:14 -05:00
|
|
|
lastFork.name, lastFork.block, cur.name, cur.block)
|
2023-01-25 05:12:28 -06:00
|
|
|
} else if lastFork.timestamp != nil && *lastFork.timestamp > *cur.timestamp {
|
2022-12-15 01:40:33 -06:00
|
|
|
return fmt.Errorf("unsupported fork ordering: %v enabled at timestamp %v, but %v enabled at timestamp %v",
|
2024-02-07 10:19:14 -06:00
|
|
|
lastFork.name, *lastFork.timestamp, cur.name, *cur.timestamp)
|
2022-12-15 01:40:33 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Timestamp based forks can follow block based ones, but not the other way around
|
|
|
|
if lastFork.timestamp != nil && cur.block != nil {
|
|
|
|
return fmt.Errorf("unsupported fork ordering: %v used timestamp ordering, but %v reverted to block ordering",
|
|
|
|
lastFork.name, cur.name)
|
2019-10-16 06:23:14 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-06-03 04:05:15 -05:00
|
|
|
// If it was optional and not set, then ignore it
|
2022-12-15 01:40:33 -06:00
|
|
|
if !cur.optional || (cur.block != nil || cur.timestamp != nil) {
|
2020-06-03 04:05:15 -05:00
|
|
|
lastFork = cur
|
|
|
|
}
|
2019-10-16 06:23:14 -05:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-01-25 05:12:28 -06:00
|
|
|
func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, headNumber *big.Int, headTimestamp uint64) *ConfigCompatError {
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.HomesteadBlock, newcfg.HomesteadBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Homestead fork block", c.HomesteadBlock, newcfg.HomesteadBlock)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.DAOForkBlock, newcfg.DAOForkBlock, headNumber) {
|
|
|
|
return newBlockCompatError("DAO fork block", c.DAOForkBlock, newcfg.DAOForkBlock)
|
2016-11-02 07:44:13 -05:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if c.IsDAOFork(headNumber) && c.DAOForkSupport != newcfg.DAOForkSupport {
|
|
|
|
return newBlockCompatError("DAO fork support flag", c.DAOForkBlock, newcfg.DAOForkBlock)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.EIP150Block, newcfg.EIP150Block, headNumber) {
|
|
|
|
return newBlockCompatError("EIP150 fork block", c.EIP150Block, newcfg.EIP150Block)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.EIP155Block, newcfg.EIP155Block, headNumber) {
|
|
|
|
return newBlockCompatError("EIP155 fork block", c.EIP155Block, newcfg.EIP155Block)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.EIP158Block, newcfg.EIP158Block, headNumber) {
|
|
|
|
return newBlockCompatError("EIP158 fork block", c.EIP158Block, newcfg.EIP158Block)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if c.IsEIP158(headNumber) && !configBlockEqual(c.ChainID, newcfg.ChainID) {
|
|
|
|
return newBlockCompatError("EIP158 chain ID", c.EIP158Block, newcfg.EIP158Block)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.ByzantiumBlock, newcfg.ByzantiumBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Byzantium fork block", c.ByzantiumBlock, newcfg.ByzantiumBlock)
|
2017-05-12 14:35:45 -05:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.ConstantinopleBlock, newcfg.ConstantinopleBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Constantinople fork block", c.ConstantinopleBlock, newcfg.ConstantinopleBlock)
|
2018-02-23 04:32:57 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.PetersburgBlock, newcfg.PetersburgBlock, headNumber) {
|
2020-09-16 01:39:35 -05:00
|
|
|
// the only case where we allow Petersburg to be set in the past is if it is equal to Constantinople
|
|
|
|
// mainly to satisfy fork ordering requirements which state that Petersburg fork be set if Constantinople fork is set
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.ConstantinopleBlock, newcfg.PetersburgBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Petersburg fork block", c.PetersburgBlock, newcfg.PetersburgBlock)
|
2020-09-16 01:39:35 -05:00
|
|
|
}
|
2019-01-24 04:36:30 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.IstanbulBlock, newcfg.IstanbulBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Istanbul fork block", c.IstanbulBlock, newcfg.IstanbulBlock)
|
2019-08-06 09:12:54 -05:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.MuirGlacierBlock, newcfg.MuirGlacierBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Muir Glacier fork block", c.MuirGlacierBlock, newcfg.MuirGlacierBlock)
|
2019-12-06 03:36:40 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.BerlinBlock, newcfg.BerlinBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Berlin fork block", c.BerlinBlock, newcfg.BerlinBlock)
|
2021-02-25 01:10:30 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.LondonBlock, newcfg.LondonBlock, headNumber) {
|
|
|
|
return newBlockCompatError("London fork block", c.LondonBlock, newcfg.LondonBlock)
|
2020-06-03 04:05:15 -05:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.ArrowGlacierBlock, newcfg.ArrowGlacierBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Arrow Glacier fork block", c.ArrowGlacierBlock, newcfg.ArrowGlacierBlock)
|
2021-10-28 15:18:14 -05:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.GrayGlacierBlock, newcfg.GrayGlacierBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Gray Glacier fork block", c.GrayGlacierBlock, newcfg.GrayGlacierBlock)
|
2022-06-15 06:10:38 -05:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkBlockIncompatible(c.MergeNetsplitBlock, newcfg.MergeNetsplitBlock, headNumber) {
|
|
|
|
return newBlockCompatError("Merge netsplit fork block", c.MergeNetsplitBlock, newcfg.MergeNetsplitBlock)
|
2021-12-17 08:38:58 -06:00
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
if isForkTimestampIncompatible(c.ShanghaiTime, newcfg.ShanghaiTime, headTimestamp) {
|
|
|
|
return newTimestampCompatError("Shanghai fork timestamp", c.ShanghaiTime, newcfg.ShanghaiTime)
|
2022-07-19 07:50:17 -05:00
|
|
|
}
|
2023-01-20 03:57:50 -06:00
|
|
|
if isForkTimestampIncompatible(c.CancunTime, newcfg.CancunTime, headTimestamp) {
|
|
|
|
return newTimestampCompatError("Cancun fork timestamp", c.CancunTime, newcfg.CancunTime)
|
|
|
|
}
|
|
|
|
if isForkTimestampIncompatible(c.PragueTime, newcfg.PragueTime, headTimestamp) {
|
|
|
|
return newTimestampCompatError("Prague fork timestamp", c.PragueTime, newcfg.PragueTime)
|
|
|
|
}
|
2023-06-28 04:08:48 -05:00
|
|
|
if isForkTimestampIncompatible(c.VerkleTime, newcfg.VerkleTime, headTimestamp) {
|
|
|
|
return newTimestampCompatError("Verkle fork timestamp", c.VerkleTime, newcfg.VerkleTime)
|
|
|
|
}
|
2017-03-02 07:03:33 -06:00
|
|
|
return nil
|
|
|
|
}
|
2016-11-02 07:44:13 -05:00
|
|
|
|
2022-11-04 10:27:15 -05:00
|
|
|
// BaseFeeChangeDenominator bounds the amount the base fee can change between blocks.
|
|
|
|
func (c *ChainConfig) BaseFeeChangeDenominator() uint64 {
|
|
|
|
return DefaultBaseFeeChangeDenominator
|
|
|
|
}
|
|
|
|
|
|
|
|
// ElasticityMultiplier bounds the maximum gas limit an EIP-1559 block may have.
|
|
|
|
func (c *ChainConfig) ElasticityMultiplier() uint64 {
|
|
|
|
return DefaultElasticityMultiplier
|
|
|
|
}
|
|
|
|
|
2024-01-23 09:02:08 -06:00
|
|
|
// 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.IsPrague(london, time):
|
|
|
|
return forks.Prague
|
|
|
|
case c.IsCancun(london, time):
|
|
|
|
return forks.Cancun
|
|
|
|
case c.IsShanghai(london, time):
|
|
|
|
return forks.Shanghai
|
|
|
|
default:
|
|
|
|
return forks.Paris
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-15 01:40:33 -06:00
|
|
|
// 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 {
|
|
|
|
return (isBlockForked(s1, head) || isBlockForked(s2, head)) && !configBlockEqual(s1, s2)
|
2016-11-02 07:44:13 -05:00
|
|
|
}
|
|
|
|
|
2022-12-15 01:40:33 -06:00
|
|
|
// isBlockForked returns whether a fork scheduled at block s is active at the
|
|
|
|
// given head block. Whilst this method is the same as isTimestampForked, they
|
|
|
|
// are explicitly separate for clearer reading.
|
|
|
|
func isBlockForked(s, head *big.Int) bool {
|
2017-03-02 07:03:33 -06:00
|
|
|
if s == nil || head == nil {
|
2016-10-20 06:36:29 -05:00
|
|
|
return false
|
2016-10-07 17:23:45 -05:00
|
|
|
}
|
2017-03-02 07:03:33 -06:00
|
|
|
return s.Cmp(head) <= 0
|
|
|
|
}
|
2016-10-07 17:23:45 -05:00
|
|
|
|
2022-12-15 01:40:33 -06:00
|
|
|
func configBlockEqual(x, y *big.Int) bool {
|
|
|
|
if x == nil {
|
|
|
|
return y == nil
|
|
|
|
}
|
|
|
|
if y == nil {
|
|
|
|
return x == nil
|
|
|
|
}
|
|
|
|
return x.Cmp(y) == 0
|
|
|
|
}
|
|
|
|
|
|
|
|
// isForkTimestampIncompatible returns true if a fork scheduled at timestamp s1
|
|
|
|
// cannot be rescheduled to timestamp s2 because head is already past the fork.
|
2023-01-25 05:12:28 -06:00
|
|
|
func isForkTimestampIncompatible(s1, s2 *uint64, head uint64) bool {
|
2022-12-15 01:40:33 -06:00
|
|
|
return (isTimestampForked(s1, head) || isTimestampForked(s2, head)) && !configTimestampEqual(s1, s2)
|
|
|
|
}
|
|
|
|
|
|
|
|
// isTimestampForked returns whether a fork scheduled at timestamp s is active
|
|
|
|
// at the given head timestamp. Whilst this method is the same as isBlockForked,
|
|
|
|
// they are explicitly separate for clearer reading.
|
2023-01-25 05:12:28 -06:00
|
|
|
func isTimestampForked(s *uint64, head uint64) bool {
|
|
|
|
if s == nil {
|
2022-12-15 01:40:33 -06:00
|
|
|
return false
|
|
|
|
}
|
2023-01-25 05:12:28 -06:00
|
|
|
return *s <= head
|
2022-12-15 01:40:33 -06:00
|
|
|
}
|
|
|
|
|
2023-01-25 05:12:28 -06:00
|
|
|
func configTimestampEqual(x, y *uint64) bool {
|
2017-03-02 07:03:33 -06:00
|
|
|
if x == nil {
|
|
|
|
return y == nil
|
|
|
|
}
|
|
|
|
if y == nil {
|
|
|
|
return x == nil
|
|
|
|
}
|
2023-01-25 05:12:28 -06:00
|
|
|
return *x == *y
|
2016-10-07 17:23:45 -05:00
|
|
|
}
|
2016-11-02 07:44:13 -05:00
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// ConfigCompatError is raised if the locally-stored blockchain is initialised with a
|
|
|
|
// ChainConfig that would alter the past.
|
|
|
|
type ConfigCompatError struct {
|
|
|
|
What string
|
2022-12-15 01:40:33 -06:00
|
|
|
|
|
|
|
// block numbers of the stored and new configurations if block based forking
|
|
|
|
StoredBlock, NewBlock *big.Int
|
|
|
|
|
|
|
|
// timestamps of the stored and new configurations if time based forking
|
2023-01-25 05:12:28 -06:00
|
|
|
StoredTime, NewTime *uint64
|
2022-12-15 01:40:33 -06:00
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// the block number to which the local chain must be rewound to correct the error
|
2022-12-15 01:40:33 -06:00
|
|
|
RewindToBlock uint64
|
|
|
|
|
|
|
|
// the timestamp to which the local chain must be rewound to correct the error
|
|
|
|
RewindToTime uint64
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
|
2022-12-15 01:40:33 -06:00
|
|
|
func newBlockCompatError(what string, storedblock, newblock *big.Int) *ConfigCompatError {
|
2017-03-02 07:03:33 -06:00
|
|
|
var rew *big.Int
|
|
|
|
switch {
|
|
|
|
case storedblock == nil:
|
|
|
|
rew = newblock
|
|
|
|
case newblock == nil || storedblock.Cmp(newblock) < 0:
|
|
|
|
rew = storedblock
|
|
|
|
default:
|
|
|
|
rew = newblock
|
|
|
|
}
|
2022-12-15 01:40:33 -06:00
|
|
|
err := &ConfigCompatError{
|
|
|
|
What: what,
|
|
|
|
StoredBlock: storedblock,
|
|
|
|
NewBlock: newblock,
|
|
|
|
RewindToBlock: 0,
|
|
|
|
}
|
2017-03-02 07:03:33 -06:00
|
|
|
if rew != nil && rew.Sign() > 0 {
|
2022-12-15 01:40:33 -06:00
|
|
|
err.RewindToBlock = rew.Uint64() - 1
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2023-01-25 05:12:28 -06:00
|
|
|
func newTimestampCompatError(what string, storedtime, newtime *uint64) *ConfigCompatError {
|
|
|
|
var rew *uint64
|
2022-12-15 01:40:33 -06:00
|
|
|
switch {
|
|
|
|
case storedtime == nil:
|
|
|
|
rew = newtime
|
2023-01-25 05:12:28 -06:00
|
|
|
case newtime == nil || *storedtime < *newtime:
|
2022-12-15 01:40:33 -06:00
|
|
|
rew = storedtime
|
|
|
|
default:
|
|
|
|
rew = newtime
|
|
|
|
}
|
|
|
|
err := &ConfigCompatError{
|
|
|
|
What: what,
|
|
|
|
StoredTime: storedtime,
|
|
|
|
NewTime: newtime,
|
|
|
|
RewindToTime: 0,
|
|
|
|
}
|
2024-04-30 04:22:02 -05:00
|
|
|
if rew != nil && *rew != 0 {
|
2023-01-25 05:12:28 -06:00
|
|
|
err.RewindToTime = *rew - 1
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
return err
|
2016-11-02 07:44:13 -05:00
|
|
|
}
|
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
func (err *ConfigCompatError) Error() string {
|
2022-12-15 01:40:33 -06:00
|
|
|
if err.StoredBlock != nil {
|
|
|
|
return fmt.Sprintf("mismatching %s in database (have block %d, want block %d, rewindto block %d)", err.What, err.StoredBlock, err.NewBlock, err.RewindToBlock)
|
|
|
|
}
|
2024-04-30 04:22:02 -05:00
|
|
|
|
|
|
|
if err.StoredTime == nil && err.NewTime == nil {
|
|
|
|
return ""
|
|
|
|
} else if err.StoredTime == nil && err.NewTime != nil {
|
|
|
|
return fmt.Sprintf("mismatching %s in database (have timestamp nil, want timestamp %d, rewindto timestamp %d)", err.What, *err.NewTime, err.RewindToTime)
|
|
|
|
} else if err.StoredTime != nil && err.NewTime == nil {
|
|
|
|
return fmt.Sprintf("mismatching %s in database (have timestamp %d, want timestamp nil, rewindto timestamp %d)", err.What, *err.StoredTime, err.RewindToTime)
|
|
|
|
}
|
|
|
|
return fmt.Sprintf("mismatching %s in database (have timestamp %d, want timestamp %d, rewindto timestamp %d)", err.What, *err.StoredTime, *err.NewTime, err.RewindToTime)
|
2016-11-02 07:44:13 -05:00
|
|
|
}
|
2017-02-01 15:36:51 -06:00
|
|
|
|
2018-09-03 09:52:32 -05:00
|
|
|
// Rules wraps ChainConfig and is merely syntactic sugar or can be used for functions
|
2017-02-01 15:36:51 -06:00
|
|
|
// that do not have or require information about the block.
|
|
|
|
//
|
|
|
|
// Rules is a one time interface meaning that it shouldn't be used in between transition
|
|
|
|
// phases.
|
|
|
|
type Rules struct {
|
2019-08-06 09:12:54 -05:00
|
|
|
ChainID *big.Int
|
|
|
|
IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool
|
2024-05-10 13:13:11 -05:00
|
|
|
IsEIP2929, IsEIP4762 bool
|
2019-08-06 09:12:54 -05:00
|
|
|
IsByzantium, IsConstantinople, IsPetersburg, IsIstanbul bool
|
2021-10-11 10:58:11 -05:00
|
|
|
IsBerlin, IsLondon bool
|
2023-03-21 06:14:47 -05:00
|
|
|
IsMerge, IsShanghai, IsCancun, IsPrague bool
|
2023-06-28 04:08:48 -05:00
|
|
|
IsVerkle bool
|
2017-02-01 15:36:51 -06:00
|
|
|
}
|
|
|
|
|
2018-06-05 05:31:34 -05:00
|
|
|
// Rules ensures c's ChainID is not nil.
|
2023-01-25 05:12:28 -06:00
|
|
|
func (c *ChainConfig) Rules(num *big.Int, isMerge bool, timestamp uint64) Rules {
|
2018-06-05 05:31:34 -05:00
|
|
|
chainID := c.ChainID
|
|
|
|
if chainID == nil {
|
|
|
|
chainID = new(big.Int)
|
2017-02-01 15:36:51 -06:00
|
|
|
}
|
2024-02-19 09:29:59 -06:00
|
|
|
// disallow setting Merge out of order
|
|
|
|
isMerge = isMerge && c.IsLondon(num)
|
2024-05-10 13:13:11 -05:00
|
|
|
isVerkle := isMerge && c.IsVerkle(num, timestamp)
|
2018-09-18 08:24:35 -05:00
|
|
|
return Rules{
|
|
|
|
ChainID: new(big.Int).Set(chainID),
|
|
|
|
IsHomestead: c.IsHomestead(num),
|
|
|
|
IsEIP150: c.IsEIP150(num),
|
|
|
|
IsEIP155: c.IsEIP155(num),
|
|
|
|
IsEIP158: c.IsEIP158(num),
|
|
|
|
IsByzantium: c.IsByzantium(num),
|
|
|
|
IsConstantinople: c.IsConstantinople(num),
|
2019-01-24 04:36:30 -06:00
|
|
|
IsPetersburg: c.IsPetersburg(num),
|
2019-08-06 09:12:54 -05:00
|
|
|
IsIstanbul: c.IsIstanbul(num),
|
2021-02-25 01:10:30 -06:00
|
|
|
IsBerlin: c.IsBerlin(num),
|
2024-05-10 13:13:11 -05:00
|
|
|
IsEIP2929: c.IsBerlin(num) && !isVerkle,
|
2021-05-06 04:07:42 -05:00
|
|
|
IsLondon: c.IsLondon(num),
|
2022-01-10 01:44:21 -06:00
|
|
|
IsMerge: isMerge,
|
2024-02-19 09:29:59 -06:00
|
|
|
IsShanghai: isMerge && c.IsShanghai(num, timestamp),
|
|
|
|
IsCancun: isMerge && c.IsCancun(num, timestamp),
|
|
|
|
IsPrague: isMerge && c.IsPrague(num, timestamp),
|
2024-05-10 13:13:11 -05:00
|
|
|
IsVerkle: isVerkle,
|
|
|
|
IsEIP4762: isVerkle,
|
2018-09-18 08:24:35 -05:00
|
|
|
}
|
2017-02-01 15:36:51 -06:00
|
|
|
}
|