Skip to content

Commit

Permalink
Fix OverrideTerminalTotalDifficulty when datadir is not empty (#4280)
Browse files Browse the repository at this point in the history
  • Loading branch information
yperbasis authored May 26, 2022
1 parent bd633f3 commit 16950eb
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 8 deletions.
4 changes: 2 additions & 2 deletions cmd/utils/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -1486,10 +1486,10 @@ func SetEthConfig(ctx *cli.Context, nodeConfig *nodecfg.Config, cfg *ethconfig.C
}

if ctx.GlobalIsSet(OverrideTerminalTotalDifficulty.Name) {
cfg.Genesis.Config.TerminalTotalDifficulty = GlobalBig(ctx, OverrideTerminalTotalDifficulty.Name)
cfg.OverrideTerminalTotalDifficulty = GlobalBig(ctx, OverrideTerminalTotalDifficulty.Name)
}
if ctx.GlobalIsSet(OverrideMergeForkBlock.Name) {
cfg.Genesis.Config.MergeForkBlock = GlobalBig(ctx, OverrideMergeForkBlock.Name)
cfg.OverrideMergeForkBlock = GlobalBig(ctx, OverrideMergeForkBlock.Name)
}
}

Expand Down
26 changes: 24 additions & 2 deletions core/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,12 +173,16 @@ func (e *GenesisMismatchError) Error() string {
//
// The returned chain configuration is never nil.
func CommitGenesisBlock(db kv.RwDB, genesis *Genesis) (*params.ChainConfig, *types.Block, error) {
return CommitGenesisBlockWithOverride(db, genesis, nil, nil)
}

func CommitGenesisBlockWithOverride(db kv.RwDB, genesis *Genesis, overrideMergeForkBlock, overrideTerminalTotalDifficulty *big.Int) (*params.ChainConfig, *types.Block, error) {
tx, err := db.BeginRw(context.Background())
if err != nil {
return nil, nil, err
}
defer tx.Rollback()
c, b, err := WriteGenesisBlock(tx, genesis)
c, b, err := WriteGenesisBlock(tx, genesis, overrideMergeForkBlock, overrideTerminalTotalDifficulty)
if err != nil {
return c, b, err
}
Expand All @@ -197,7 +201,7 @@ func MustCommitGenesisBlock(db kv.RwDB, genesis *Genesis) (*params.ChainConfig,
return c, b
}

func WriteGenesisBlock(db kv.RwTx, genesis *Genesis) (*params.ChainConfig, *types.Block, error) {
func WriteGenesisBlock(db kv.RwTx, genesis *Genesis, overrideMergeForkBlock, overrideTerminalTotalDifficulty *big.Int) (*params.ChainConfig, *types.Block, error) {
if genesis != nil && genesis.Config == nil {
return params.AllEthashProtocolChanges, nil, ErrGenesisNoConfig
}
Expand All @@ -213,6 +217,12 @@ func WriteGenesisBlock(db kv.RwTx, genesis *Genesis) (*params.ChainConfig, *type
genesis = DefaultGenesisBlock()
custom = false
}
if overrideMergeForkBlock != nil {
genesis.Config.MergeForkBlock = overrideMergeForkBlock
}
if overrideTerminalTotalDifficulty != nil {
genesis.Config.TerminalTotalDifficulty = overrideTerminalTotalDifficulty
}
block, _, err1 := genesis.Write(db)
if err1 != nil {
return genesis.Config, nil, err1
Expand Down Expand Up @@ -240,6 +250,12 @@ func WriteGenesisBlock(db kv.RwTx, genesis *Genesis) (*params.ChainConfig, *type
}
// Get the existing chain configuration.
newcfg := genesis.configOrDefault(stored)
if overrideMergeForkBlock != nil {
newcfg.MergeForkBlock = overrideMergeForkBlock
}
if overrideTerminalTotalDifficulty != nil {
newcfg.TerminalTotalDifficulty = overrideTerminalTotalDifficulty
}
if err := newcfg.CheckConfigForkOrder(); err != nil {
return newcfg, nil, err
}
Expand All @@ -259,6 +275,12 @@ func WriteGenesisBlock(db kv.RwTx, genesis *Genesis) (*params.ChainConfig, *type
// config is supplied. These chains would get AllProtocolChanges (and a compat error)
// if we just continued here.
if genesis == nil && stored != params.MainnetGenesisHash {
if overrideMergeForkBlock != nil {
storedcfg.MergeForkBlock = overrideMergeForkBlock
}
if overrideTerminalTotalDifficulty != nil {
storedcfg.TerminalTotalDifficulty = overrideTerminalTotalDifficulty
}
return storedcfg, storedBlock, nil
}
// Check config compatibility and write the config. Compatibility errors
Expand Down
6 changes: 3 additions & 3 deletions core/genesis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func TestDefaultBSCGenesisBlock(t *testing.T) {
t.Fatal(err)
}
defer tx.Rollback()
_, block, err := WriteGenesisBlock(tx, genesis)
_, block, err := WriteGenesisBlock(tx, genesis, nil, nil)
require.NoError(t, err)
expect := params.GenesisHashByChainName(network)
require.NotNil(t, expect, network)
Expand All @@ -34,13 +34,13 @@ func TestDefaultBSCGenesisBlock(t *testing.T) {
func TestCommitGenesisIdempotency(t *testing.T) {
_, tx := memdb.NewTestTx(t)
genesis := DefaultGenesisBlockByChainName(networkname.MainnetChainName)
_, _, err := WriteGenesisBlock(tx, genesis)
_, _, err := WriteGenesisBlock(tx, genesis, nil, nil)
require.NoError(t, err)
seq, err := tx.ReadSequence(kv.EthTx)
require.NoError(t, err)
require.Equal(t, uint64(2), seq)

_, _, err = WriteGenesisBlock(tx, genesis)
_, _, err = WriteGenesisBlock(tx, genesis, nil, nil)
require.NoError(t, err)
seq, err = tx.ReadSequence(kv.EthTx)
require.NoError(t, err)
Expand Down
2 changes: 1 addition & 1 deletion eth/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere
panic(err)
}

chainConfig, genesis, genesisErr := core.CommitGenesisBlock(chainKv, config.Genesis)
chainConfig, genesis, genesisErr := core.CommitGenesisBlockWithOverride(chainKv, config.Genesis, config.OverrideMergeForkBlock, config.OverrideTerminalTotalDifficulty)
if _, ok := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !ok {
return nil, genesisErr
}
Expand Down
5 changes: 5 additions & 0 deletions eth/ethconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,11 @@ type Config struct {
WithoutHeimdall bool
// Ethstats service
Ethstats string

// FORK_NEXT_VALUE (see EIP-3675) block override
OverrideMergeForkBlock *big.Int `toml:",omitempty"`

OverrideTerminalTotalDifficulty *big.Int `toml:",omitempty"`
}

type SyncMode string
Expand Down

0 comments on commit 16950eb

Please sign in to comment.