From 31222dc15b64a07d20d97938d72070d12201046b Mon Sep 17 00:00:00 2001 From: Paul Lange Date: Fri, 15 Sep 2023 14:06:04 +0200 Subject: [PATCH] Add Cel2 hardfork This will be the hardfork used to enable all Celo related features in the op-geth. --- cmd/geth/config.go | 4 ++++ cmd/geth/main.go | 1 + cmd/utils/flags.go | 9 +++++++-- core/genesis.go | 4 ++++ eth/backend.go | 3 +++ eth/ethconfig/config.go | 1 + params/config.go | 12 ++++++++++++ params/config_test.go | 19 +++++++++++++++++++ 8 files changed, 51 insertions(+), 2 deletions(-) diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 4ac647d170..3ed63af382 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -178,6 +178,10 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { v := ctx.Uint64(utils.OverrideOptimismRegolith.Name) cfg.Eth.OverrideOptimismRegolith = &v } + if ctx.IsSet(utils.OverrideOptimismCel2.Name) { + v := ctx.Uint64(utils.OverrideOptimismCel2.Name) + cfg.Eth.OverrideOptimismCel2 = &v + } if ctx.IsSet(utils.OverrideOptimism.Name) { override := ctx.Bool(utils.OverrideOptimism.Name) cfg.Eth.OverrideOptimism = &override diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 6cf2fd57ff..ee7e56580e 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -68,6 +68,7 @@ var ( utils.EnablePersonal, utils.OverrideOptimismBedrock, utils.OverrideOptimismRegolith, + utils.OverrideOptimismCel2, utils.OverrideOptimism, utils.TxPoolLocalsFlag, utils.TxPoolNoLocalsFlag, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index b8988eb323..dad4624c69 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -281,12 +281,17 @@ var ( } OverrideOptimismBedrock = &flags.BigFlag{ Name: "override.bedrock", - Usage: "Manually specify OptimsimBedrock, overriding the bundled setting", + Usage: "Manually specify OptimismBedrock, overriding the bundled setting", Category: flags.EthCategory, } OverrideOptimismRegolith = &flags.BigFlag{ Name: "override.regolith", - Usage: "Manually specify the OptimsimRegolith fork timestamp, overriding the bundled setting", + Usage: "Manually specify the OptimismRegolith fork timestamp, overriding the bundled setting", + Category: flags.EthCategory, + } + OverrideOptimismCel2 = &flags.BigFlag{ + Name: "override.cel2", + Usage: "Manually specify the OptimismCel2 fork timestamp, overriding the bundled setting", Category: flags.EthCategory, } OverrideOptimism = &cli.BoolFlag{ diff --git a/core/genesis.go b/core/genesis.go index 0df7a63b65..87a0a5bd95 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -276,6 +276,7 @@ type ChainOverrides struct { // optimism OverrideOptimismBedrock *big.Int OverrideOptimismRegolith *uint64 + OverrideOptimismCel2 *uint64 OverrideOptimism *bool } @@ -319,6 +320,9 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *trie.Database, gen if overrides != nil && overrides.OverrideOptimismRegolith != nil { config.RegolithTime = overrides.OverrideOptimismRegolith } + if overrides != nil && overrides.OverrideOptimismCel2 != nil { + config.Cel2Time = overrides.OverrideOptimismCel2 + } if overrides != nil && overrides.OverrideOptimism != nil { if *overrides.OverrideOptimism { config.Optimism = ¶ms.OptimismConfig{ diff --git a/eth/backend.go b/eth/backend.go index f5c3995bd1..6b034b1cb5 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -207,6 +207,9 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { if config.OverrideOptimismRegolith != nil { overrides.OverrideOptimismRegolith = config.OverrideOptimismRegolith } + if config.OverrideOptimismCel2 != nil { + overrides.OverrideOptimismCel2 = config.OverrideOptimismCel2 + } if config.OverrideOptimism != nil { overrides.OverrideOptimism = config.OverrideOptimism } diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index fcf5eae4d5..52857eb3a9 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -166,6 +166,7 @@ type Config struct { OverrideOptimismBedrock *big.Int OverrideOptimismRegolith *uint64 `toml:",omitempty"` + OverrideOptimismCel2 *uint64 `toml:",omitempty"` OverrideOptimism *bool RollupSequencerHTTP string diff --git a/params/config.go b/params/config.go index c07e0d1543..34305274a2 100644 --- a/params/config.go +++ b/params/config.go @@ -316,6 +316,8 @@ type ChainConfig struct { BedrockBlock *big.Int `json:"bedrockBlock,omitempty"` // Bedrock switch block (nil = no fork, 0 = already on optimism bedrock) RegolithTime *uint64 `json:"regolithTime,omitempty"` // Regolith switch time (nil = no fork, 0 = already on optimism regolith) + Cel2Time *uint64 `json:"cel2Time,omitempty"` // Cel2 switch time (nil = no fork, 0 = already on optimism cel2) + // TerminalTotalDifficulty is the amount of total difficulty reached by // the network that triggers the consensus upgrade. TerminalTotalDifficulty *big.Int `json:"terminalTotalDifficulty,omitempty"` @@ -454,6 +456,9 @@ func (c *ChainConfig) Description() string { if c.RegolithTime != nil { banner += fmt.Sprintf(" - Regolith: @%-10v\n", *c.RegolithTime) } + if c.Cel2Time != nil { + banner += fmt.Sprintf(" - Cel2: @%-10v\n", *c.Cel2Time) + } return banner } @@ -561,6 +566,10 @@ func (c *ChainConfig) IsRegolith(time uint64) bool { return isTimestampForked(c.RegolithTime, time) } +func (c *ChainConfig) IsCel2(time uint64) bool { + return isTimestampForked(c.Cel2Time, time) +} + // IsOptimism returns whether the node is an optimism node or not. func (c *ChainConfig) IsOptimism() bool { return c.Optimism != nil @@ -889,6 +898,7 @@ type Rules struct { IsBerlin, IsLondon bool IsMerge, IsShanghai, IsCancun, IsPrague bool IsOptimismBedrock, IsOptimismRegolith bool + IsCel2 bool } // Rules ensures c's ChainID is not nil. @@ -916,5 +926,7 @@ func (c *ChainConfig) Rules(num *big.Int, isMerge bool, timestamp uint64) Rules // Optimism IsOptimismBedrock: c.IsOptimismBedrock(num), IsOptimismRegolith: c.IsOptimismRegolith(timestamp), + // Celo + IsCel2: c.IsCel2(timestamp), } } diff --git a/params/config_test.go b/params/config_test.go index 14d7f833bb..16bbbcec27 100644 --- a/params/config_test.go +++ b/params/config_test.go @@ -156,3 +156,22 @@ func TestConfigRulesRegolith(t *testing.T) { t.Errorf("expected %v to be regolith", stamp) } } + +func TestConfigRulesCel2(t *testing.T) { + c := &ChainConfig{ + Cel2Time: newUint64(500), + Optimism: &OptimismConfig{}, + } + var stamp uint64 + if r := c.Rules(big.NewInt(0), true, stamp); r.IsCel2 { + t.Errorf("expected %v to not be Cel2", stamp) + } + stamp = 500 + if r := c.Rules(big.NewInt(0), true, stamp); !r.IsCel2 { + t.Errorf("expected %v to be Cel2", stamp) + } + stamp = math.MaxInt64 + if r := c.Rules(big.NewInt(0), true, stamp); !r.IsCel2 { + t.Errorf("expected %v to be Cel2", stamp) + } +}