|
@@ -42,7 +42,8 @@ var (
|
|
|
EIP155Block: big.NewInt(2675000),
|
|
EIP155Block: big.NewInt(2675000),
|
|
|
EIP158Block: big.NewInt(2675000),
|
|
EIP158Block: big.NewInt(2675000),
|
|
|
ByzantiumBlock: big.NewInt(4370000),
|
|
ByzantiumBlock: big.NewInt(4370000),
|
|
|
- ConstantinopleBlock: nil,
|
|
|
|
|
|
|
+ ConstantinopleBlock: big.NewInt(7280000),
|
|
|
|
|
+ PetersburgBlock: big.NewInt(7280000),
|
|
|
Ethash: new(EthashConfig),
|
|
Ethash: new(EthashConfig),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -67,6 +68,7 @@ var (
|
|
|
EIP158Block: big.NewInt(10),
|
|
EIP158Block: big.NewInt(10),
|
|
|
ByzantiumBlock: big.NewInt(1700000),
|
|
ByzantiumBlock: big.NewInt(1700000),
|
|
|
ConstantinopleBlock: big.NewInt(4230000),
|
|
ConstantinopleBlock: big.NewInt(4230000),
|
|
|
|
|
+ PetersburgBlock: big.NewInt(4939394),
|
|
|
Ethash: new(EthashConfig),
|
|
Ethash: new(EthashConfig),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -91,6 +93,7 @@ var (
|
|
|
EIP158Block: big.NewInt(3),
|
|
EIP158Block: big.NewInt(3),
|
|
|
ByzantiumBlock: big.NewInt(1035301),
|
|
ByzantiumBlock: big.NewInt(1035301),
|
|
|
ConstantinopleBlock: big.NewInt(3660663),
|
|
ConstantinopleBlock: big.NewInt(3660663),
|
|
|
|
|
+ PetersburgBlock: big.NewInt(9999999), //TODO! Insert Rinkeby block number
|
|
|
Clique: &CliqueConfig{
|
|
Clique: &CliqueConfig{
|
|
|
Period: 15,
|
|
Period: 15,
|
|
|
Epoch: 30000,
|
|
Epoch: 30000,
|
|
@@ -111,16 +114,16 @@ var (
|
|
|
//
|
|
//
|
|
|
// This configuration is intentionally not using keyed fields to force anyone
|
|
// This configuration is intentionally not using keyed fields to force anyone
|
|
|
// adding flags to the config to also have to set these fields.
|
|
// 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), 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), nil, new(EthashConfig), nil}
|
|
|
|
|
|
|
|
// AllCliqueProtocolChanges contains every protocol change (EIPs) introduced
|
|
// AllCliqueProtocolChanges contains every protocol change (EIPs) introduced
|
|
|
// and accepted by the Ethereum core developers into the Clique consensus.
|
|
// and accepted by the Ethereum core developers into the Clique consensus.
|
|
|
//
|
|
//
|
|
|
// This configuration is intentionally not using keyed fields to force anyone
|
|
// This configuration is intentionally not using keyed fields to force anyone
|
|
|
// adding flags to the config to also have to set these fields.
|
|
// 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), 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), 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), 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), nil, new(EthashConfig), nil}
|
|
|
TestRules = TestChainConfig.Rules(new(big.Int))
|
|
TestRules = TestChainConfig.Rules(new(big.Int))
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -158,6 +161,7 @@ type ChainConfig struct {
|
|
|
|
|
|
|
|
ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = already on byzantium)
|
|
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)
|
|
ConstantinopleBlock *big.Int `json:"constantinopleBlock,omitempty"` // Constantinople switch block (nil = no fork, 0 = already activated)
|
|
|
|
|
+ PetersburgBlock *big.Int `json:"petersburgBlock,omitempty"` // Petersburg switch block (nil = same as Constantinople)
|
|
|
EWASMBlock *big.Int `json:"ewasmBlock,omitempty"` // EWASM switch block (nil = no fork, 0 = already activated)
|
|
EWASMBlock *big.Int `json:"ewasmBlock,omitempty"` // EWASM switch block (nil = no fork, 0 = already activated)
|
|
|
|
|
|
|
|
// Various consensus engines
|
|
// Various consensus engines
|
|
@@ -195,7 +199,7 @@ func (c *ChainConfig) String() string {
|
|
|
default:
|
|
default:
|
|
|
engine = "unknown"
|
|
engine = "unknown"
|
|
|
}
|
|
}
|
|
|
- return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Engine: %v}",
|
|
|
|
|
|
|
+ return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v ConstantinopleFix: %v Engine: %v}",
|
|
|
c.ChainID,
|
|
c.ChainID,
|
|
|
c.HomesteadBlock,
|
|
c.HomesteadBlock,
|
|
|
c.DAOForkBlock,
|
|
c.DAOForkBlock,
|
|
@@ -205,6 +209,7 @@ func (c *ChainConfig) String() string {
|
|
|
c.EIP158Block,
|
|
c.EIP158Block,
|
|
|
c.ByzantiumBlock,
|
|
c.ByzantiumBlock,
|
|
|
c.ConstantinopleBlock,
|
|
c.ConstantinopleBlock,
|
|
|
|
|
+ c.PetersburgBlock,
|
|
|
engine,
|
|
engine,
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
@@ -244,6 +249,13 @@ func (c *ChainConfig) IsConstantinople(num *big.Int) bool {
|
|
|
return isForked(c.ConstantinopleBlock, num)
|
|
return isForked(c.ConstantinopleBlock, num)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 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 {
|
|
|
|
|
+ return isForked(c.PetersburgBlock, num) || c.PetersburgBlock == nil && isForked(c.ConstantinopleBlock, num)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// IsEWASM returns whether num represents a block number after the EWASM fork
|
|
// IsEWASM returns whether num represents a block number after the EWASM fork
|
|
|
func (c *ChainConfig) IsEWASM(num *big.Int) bool {
|
|
func (c *ChainConfig) IsEWASM(num *big.Int) bool {
|
|
|
return isForked(c.EWASMBlock, num)
|
|
return isForked(c.EWASMBlock, num)
|
|
@@ -314,6 +326,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi
|
|
|
if isForkIncompatible(c.ConstantinopleBlock, newcfg.ConstantinopleBlock, head) {
|
|
if isForkIncompatible(c.ConstantinopleBlock, newcfg.ConstantinopleBlock, head) {
|
|
|
return newCompatError("Constantinople fork block", c.ConstantinopleBlock, newcfg.ConstantinopleBlock)
|
|
return newCompatError("Constantinople fork block", c.ConstantinopleBlock, newcfg.ConstantinopleBlock)
|
|
|
}
|
|
}
|
|
|
|
|
+ if isForkIncompatible(c.PetersburgBlock, newcfg.PetersburgBlock, head) {
|
|
|
|
|
+ return newCompatError("ConstantinopleFix fork block", c.PetersburgBlock, newcfg.PetersburgBlock)
|
|
|
|
|
+ }
|
|
|
if isForkIncompatible(c.EWASMBlock, newcfg.EWASMBlock, head) {
|
|
if isForkIncompatible(c.EWASMBlock, newcfg.EWASMBlock, head) {
|
|
|
return newCompatError("ewasm fork block", c.EWASMBlock, newcfg.EWASMBlock)
|
|
return newCompatError("ewasm fork block", c.EWASMBlock, newcfg.EWASMBlock)
|
|
|
}
|
|
}
|
|
@@ -381,9 +396,9 @@ func (err *ConfigCompatError) Error() string {
|
|
|
// Rules is a one time interface meaning that it shouldn't be used in between transition
|
|
// Rules is a one time interface meaning that it shouldn't be used in between transition
|
|
|
// phases.
|
|
// phases.
|
|
|
type Rules struct {
|
|
type Rules struct {
|
|
|
- ChainID *big.Int
|
|
|
|
|
- IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool
|
|
|
|
|
- IsByzantium, IsConstantinople bool
|
|
|
|
|
|
|
+ ChainID *big.Int
|
|
|
|
|
+ IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool
|
|
|
|
|
+ IsByzantium, IsConstantinople, IsPetersburg bool
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Rules ensures c's ChainID is not nil.
|
|
// Rules ensures c's ChainID is not nil.
|
|
@@ -400,5 +415,6 @@ func (c *ChainConfig) Rules(num *big.Int) Rules {
|
|
|
IsEIP158: c.IsEIP158(num),
|
|
IsEIP158: c.IsEIP158(num),
|
|
|
IsByzantium: c.IsByzantium(num),
|
|
IsByzantium: c.IsByzantium(num),
|
|
|
IsConstantinople: c.IsConstantinople(num),
|
|
IsConstantinople: c.IsConstantinople(num),
|
|
|
|
|
+ IsPetersburg: c.IsPetersburg(num),
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|