|
|
|
@ -31,6 +31,7 @@ var ( |
|
|
|
|
RopstenGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d") |
|
|
|
|
RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177") |
|
|
|
|
GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") |
|
|
|
|
YoloV1GenesisHash = common.HexToHash("0xc3fd235071f24f93865b0850bd2a2119b30f7224d18a0e34c7bbf549ad7e3d36") |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// TrustedCheckpoints associates each known checkpoint with the genesis hash of
|
|
|
|
@ -144,6 +145,7 @@ var ( |
|
|
|
|
ConstantinopleBlock: big.NewInt(3660663), |
|
|
|
|
PetersburgBlock: big.NewInt(4321234), |
|
|
|
|
IstanbulBlock: big.NewInt(5435345), |
|
|
|
|
MuirGlacierBlock: nil, |
|
|
|
|
Clique: &CliqueConfig{ |
|
|
|
|
Period: 15, |
|
|
|
|
Epoch: 30000, |
|
|
|
@ -183,6 +185,7 @@ var ( |
|
|
|
|
ConstantinopleBlock: big.NewInt(0), |
|
|
|
|
PetersburgBlock: big.NewInt(0), |
|
|
|
|
IstanbulBlock: big.NewInt(1561651), |
|
|
|
|
MuirGlacierBlock: nil, |
|
|
|
|
Clique: &CliqueConfig{ |
|
|
|
|
Period: 15, |
|
|
|
|
Epoch: 30000, |
|
|
|
@ -210,21 +213,42 @@ var ( |
|
|
|
|
Threshold: 2, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// YoloV1ChainConfig contains the chain parameters to run a node on the YOLOv1 test network.
|
|
|
|
|
YoloV1ChainConfig = &ChainConfig{ |
|
|
|
|
ChainID: big.NewInt(133519467574833), |
|
|
|
|
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, |
|
|
|
|
YoloV1Block: big.NewInt(0), |
|
|
|
|
Clique: &CliqueConfig{ |
|
|
|
|
Period: 15, |
|
|
|
|
Epoch: 30000, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// AllEthashProtocolChanges contains every protocol change (EIPs) introduced
|
|
|
|
|
// and accepted by the Ethereum core developers into the Ethash consensus.
|
|
|
|
|
//
|
|
|
|
|
// This configuration is intentionally not using keyed fields to force anyone
|
|
|
|
|
// adding flags to the config to also have to set these fields.
|
|
|
|
|
AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil} |
|
|
|
|
AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, nil, new(EthashConfig), nil} |
|
|
|
|
|
|
|
|
|
// AllCliqueProtocolChanges contains every protocol change (EIPs) introduced
|
|
|
|
|
// and accepted by the Ethereum core developers into the Clique consensus.
|
|
|
|
|
//
|
|
|
|
|
// This configuration is intentionally not using keyed fields to force anyone
|
|
|
|
|
// adding flags to the config to also have to set these fields.
|
|
|
|
|
AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, nil, &CliqueConfig{Period: 0, Epoch: 30000}} |
|
|
|
|
AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, nil, nil, &CliqueConfig{Period: 0, Epoch: 30000}} |
|
|
|
|
|
|
|
|
|
TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil} |
|
|
|
|
TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, nil, new(EthashConfig), nil} |
|
|
|
|
TestRules = TestChainConfig.Rules(new(big.Int)) |
|
|
|
|
) |
|
|
|
|
|
|
|
|
@ -295,7 +319,9 @@ type ChainConfig struct { |
|
|
|
|
PetersburgBlock *big.Int `json:"petersburgBlock,omitempty"` // Petersburg switch block (nil = same as Constantinople)
|
|
|
|
|
IstanbulBlock *big.Int `json:"istanbulBlock,omitempty"` // Istanbul switch block (nil = no fork, 0 = already on istanbul)
|
|
|
|
|
MuirGlacierBlock *big.Int `json:"muirGlacierBlock,omitempty"` // Eip-2384 (bomb delay) switch block (nil = no fork, 0 = already activated)
|
|
|
|
|
EWASMBlock *big.Int `json:"ewasmBlock,omitempty"` // EWASM switch block (nil = no fork, 0 = already activated)
|
|
|
|
|
|
|
|
|
|
YoloV1Block *big.Int `json:"yoloV1Block,omitempty"` // YOLO v1: https://github.com/ethereum/EIPs/pull/2657 (Ephemeral testnet)
|
|
|
|
|
EWASMBlock *big.Int `json:"ewasmBlock,omitempty"` // EWASM switch block (nil = no fork, 0 = already activated)
|
|
|
|
|
|
|
|
|
|
// Various consensus engines
|
|
|
|
|
Ethash *EthashConfig `json:"ethash,omitempty"` |
|
|
|
@ -332,7 +358,7 @@ func (c *ChainConfig) String() string { |
|
|
|
|
default: |
|
|
|
|
engine = "unknown" |
|
|
|
|
} |
|
|
|
|
return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Engine: %v}", |
|
|
|
|
return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, YOLO v1: %v, Engine: %v}", |
|
|
|
|
c.ChainID, |
|
|
|
|
c.HomesteadBlock, |
|
|
|
|
c.DAOForkBlock, |
|
|
|
@ -345,6 +371,7 @@ func (c *ChainConfig) String() string { |
|
|
|
|
c.PetersburgBlock, |
|
|
|
|
c.IstanbulBlock, |
|
|
|
|
c.MuirGlacierBlock, |
|
|
|
|
c.YoloV1Block, |
|
|
|
|
engine, |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
@ -401,6 +428,11 @@ func (c *ChainConfig) IsIstanbul(num *big.Int) bool { |
|
|
|
|
return isForked(c.IstanbulBlock, num) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// IsYoloV1 returns whether num is either equal to the YoloV1 fork block or greater.
|
|
|
|
|
func (c *ChainConfig) IsYoloV1(num *big.Int) bool { |
|
|
|
|
return isForked(c.YoloV1Block, num) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// IsEWASM returns whether num represents a block number after the EWASM fork
|
|
|
|
|
func (c *ChainConfig) IsEWASM(num *big.Int) bool { |
|
|
|
|
return isForked(c.EWASMBlock, num) |
|
|
|
@ -428,20 +460,23 @@ func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *Confi |
|
|
|
|
// to guarantee that forks can be implemented in a different order than on official networks
|
|
|
|
|
func (c *ChainConfig) CheckConfigForkOrder() error { |
|
|
|
|
type fork struct { |
|
|
|
|
name string |
|
|
|
|
block *big.Int |
|
|
|
|
name string |
|
|
|
|
block *big.Int |
|
|
|
|
optional bool // if true, the fork may be nil and next fork is still allowed
|
|
|
|
|
} |
|
|
|
|
var lastFork fork |
|
|
|
|
for _, cur := range []fork{ |
|
|
|
|
{"homesteadBlock", c.HomesteadBlock}, |
|
|
|
|
{"eip150Block", c.EIP150Block}, |
|
|
|
|
{"eip155Block", c.EIP155Block}, |
|
|
|
|
{"eip158Block", c.EIP158Block}, |
|
|
|
|
{"byzantiumBlock", c.ByzantiumBlock}, |
|
|
|
|
{"constantinopleBlock", c.ConstantinopleBlock}, |
|
|
|
|
{"petersburgBlock", c.PetersburgBlock}, |
|
|
|
|
{"istanbulBlock", c.IstanbulBlock}, |
|
|
|
|
{"muirGlacierBlock", c.MuirGlacierBlock}, |
|
|
|
|
{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}, |
|
|
|
|
{name: "yoloV1Block", block: c.YoloV1Block}, |
|
|
|
|
} { |
|
|
|
|
if lastFork.name != "" { |
|
|
|
|
// Next one must be higher number
|
|
|
|
@ -456,7 +491,10 @@ func (c *ChainConfig) CheckConfigForkOrder() error { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
lastFork = cur |
|
|
|
|
// If it was optional and not set, then ignore it
|
|
|
|
|
if !cur.optional || cur.block != nil { |
|
|
|
|
lastFork = cur |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
@ -498,6 +536,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi |
|
|
|
|
if isForkIncompatible(c.MuirGlacierBlock, newcfg.MuirGlacierBlock, head) { |
|
|
|
|
return newCompatError("Muir Glacier fork block", c.MuirGlacierBlock, newcfg.MuirGlacierBlock) |
|
|
|
|
} |
|
|
|
|
if isForkIncompatible(c.YoloV1Block, newcfg.YoloV1Block, head) { |
|
|
|
|
return newCompatError("YOLOv1 fork block", c.YoloV1Block, newcfg.YoloV1Block) |
|
|
|
|
} |
|
|
|
|
if isForkIncompatible(c.EWASMBlock, newcfg.EWASMBlock, head) { |
|
|
|
|
return newCompatError("ewasm fork block", c.EWASMBlock, newcfg.EWASMBlock) |
|
|
|
|
} |
|
|
|
@ -568,6 +609,7 @@ type Rules struct { |
|
|
|
|
ChainID *big.Int |
|
|
|
|
IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool |
|
|
|
|
IsByzantium, IsConstantinople, IsPetersburg, IsIstanbul bool |
|
|
|
|
IsYoloV1 bool |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Rules ensures c's ChainID is not nil.
|
|
|
|
@ -586,5 +628,6 @@ func (c *ChainConfig) Rules(num *big.Int) Rules { |
|
|
|
|
IsConstantinople: c.IsConstantinople(num), |
|
|
|
|
IsPetersburg: c.IsPetersburg(num), |
|
|
|
|
IsIstanbul: c.IsIstanbul(num), |
|
|
|
|
IsYoloV1: c.IsYoloV1(num), |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|