|
|
|
@ -415,6 +415,42 @@ func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *Confi |
|
|
|
|
return lasterr |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// CheckConfigForkOrder checks that we don't "skip" any forks, geth isn't pluggable enough
|
|
|
|
|
// to guarantee that forks
|
|
|
|
|
func (c *ChainConfig) CheckConfigForkOrder() error { |
|
|
|
|
type fork struct { |
|
|
|
|
name string |
|
|
|
|
block *big.Int |
|
|
|
|
} |
|
|
|
|
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}, |
|
|
|
|
} { |
|
|
|
|
if lastFork.name != "" { |
|
|
|
|
// Next one must be higher number
|
|
|
|
|
if lastFork.block == nil && cur.block != nil { |
|
|
|
|
return fmt.Errorf("unsupported fork ordering: %v not enabled, but %v enabled at %v", |
|
|
|
|
lastFork.name, cur.name, cur.block) |
|
|
|
|
} |
|
|
|
|
if lastFork.block != nil && cur.block != nil { |
|
|
|
|
if lastFork.block.Cmp(cur.block) > 0 { |
|
|
|
|
return fmt.Errorf("unsupported fork ordering: %v enabled at %v, but %v enabled at %v", |
|
|
|
|
lastFork.name, lastFork.block, cur.name, cur.block) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
lastFork = cur |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *ConfigCompatError { |
|
|
|
|
if isForkIncompatible(c.HomesteadBlock, newcfg.HomesteadBlock, head) { |
|
|
|
|
return newCompatError("Homestead fork block", c.HomesteadBlock, newcfg.HomesteadBlock) |
|
|
|
|