cmd, core, eth, els, params: disallow setheads below genesis, tweaks
This commit is contained in:
		
							parent
							
								
									fcf3d00488
								
							
						
					
					
						commit
						b56c796220
					
				| @ -158,14 +158,9 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { | ||||
| // makeFullNode loads geth configuration and creates the Ethereum backend.
 | ||||
| func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { | ||||
| 	stack, cfg := makeConfigNode(ctx) | ||||
| 	if ctx.IsSet(utils.OverrideTerminalTotalDifficulty.Name) { | ||||
| 		cfg.Eth.OverrideTerminalTotalDifficulty = flags.GlobalBig(ctx, utils.OverrideTerminalTotalDifficulty.Name) | ||||
| 	if ctx.IsSet(utils.OverrideShanghai.Name) { | ||||
| 		cfg.Eth.OverrideShanghai = flags.GlobalBig(ctx, utils.OverrideShanghai.Name) | ||||
| 	} | ||||
| 	if ctx.IsSet(utils.OverrideTerminalTotalDifficultyPassed.Name) { | ||||
| 		override := ctx.Bool(utils.OverrideTerminalTotalDifficultyPassed.Name) | ||||
| 		cfg.Eth.OverrideTerminalTotalDifficultyPassed = &override | ||||
| 	} | ||||
| 
 | ||||
| 	backend, eth := utils.RegisterEthService(stack, &cfg.Eth) | ||||
| 
 | ||||
| 	// Configure log filter RPC API.
 | ||||
|  | ||||
| @ -64,8 +64,7 @@ var ( | ||||
| 		utils.NoUSBFlag, | ||||
| 		utils.USBFlag, | ||||
| 		utils.SmartCardDaemonPathFlag, | ||||
| 		utils.OverrideTerminalTotalDifficulty, | ||||
| 		utils.OverrideTerminalTotalDifficultyPassed, | ||||
| 		utils.OverrideShanghai, | ||||
| 		utils.EthashCacheDirFlag, | ||||
| 		utils.EthashCachesInMemoryFlag, | ||||
| 		utils.EthashCachesOnDiskFlag, | ||||
|  | ||||
| @ -271,14 +271,9 @@ var ( | ||||
| 		Value:    2048, | ||||
| 		Category: flags.EthCategory, | ||||
| 	} | ||||
| 	OverrideTerminalTotalDifficulty = &flags.BigFlag{ | ||||
| 		Name:     "override.terminaltotaldifficulty", | ||||
| 		Usage:    "Manually specify TerminalTotalDifficulty, overriding the bundled setting", | ||||
| 		Category: flags.EthCategory, | ||||
| 	} | ||||
| 	OverrideTerminalTotalDifficultyPassed = &cli.BoolFlag{ | ||||
| 		Name:     "override.terminaltotaldifficultypassed", | ||||
| 		Usage:    "Manually specify TerminalTotalDifficultyPassed, overriding the bundled setting", | ||||
| 	OverrideShanghai = &flags.BigFlag{ | ||||
| 		Name:     "override.shanghai", | ||||
| 		Usage:    "Manually specify the Shanghai fork timestamp, overriding the bundled setting", | ||||
| 		Category: flags.EthCategory, | ||||
| 	} | ||||
| 	// Light server and client settings
 | ||||
|  | ||||
| @ -269,8 +269,7 @@ func (e *GenesisMismatchError) Error() string { | ||||
| 
 | ||||
| // ChainOverrides contains the changes to chain config.
 | ||||
| type ChainOverrides struct { | ||||
| 	OverrideTerminalTotalDifficulty       *big.Int | ||||
| 	OverrideTerminalTotalDifficultyPassed *bool | ||||
| 	OverrideShanghai *big.Int | ||||
| } | ||||
| 
 | ||||
| // SetupGenesisBlock writes or updates the genesis block in db.
 | ||||
| @ -296,15 +295,11 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *trie.Database, gen | ||||
| 	} | ||||
| 	applyOverrides := func(config *params.ChainConfig) { | ||||
| 		if config != nil { | ||||
| 			if overrides != nil && overrides.OverrideTerminalTotalDifficulty != nil { | ||||
| 				config.TerminalTotalDifficulty = overrides.OverrideTerminalTotalDifficulty | ||||
| 			} | ||||
| 			if overrides != nil && overrides.OverrideTerminalTotalDifficultyPassed != nil { | ||||
| 				config.TerminalTotalDifficultyPassed = *overrides.OverrideTerminalTotalDifficultyPassed | ||||
| 			if overrides != nil && overrides.OverrideShanghai != nil { | ||||
| 				config.ShanghaiTime = overrides.OverrideShanghai | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Just commit the new block if there is no stored genesis block.
 | ||||
| 	stored := rawdb.ReadCanonicalHash(db, 0) | ||||
| 	if (stored == common.Hash{}) { | ||||
|  | ||||
| @ -578,6 +578,19 @@ func (hc *HeaderChain) SetHeadWithTimestamp(time uint64, updateFn UpdateHeadBloc | ||||
| // setHead rewinds the local chain to a new head block or a head timestamp.
 | ||||
| // Everything above the new head will be deleted and the new one set.
 | ||||
| func (hc *HeaderChain) setHead(headBlock uint64, headTime uint64, updateFn UpdateHeadBlocksCallback, delFn DeleteBlockContentCallback) { | ||||
| 	// Sanity check that there's no attempt to undo the genesis block. This is
 | ||||
| 	// a fairly synthetic case where someone enables a timestamp based fork
 | ||||
| 	// below the genesis timestamp. It's nice to not allow that instead of the
 | ||||
| 	// entire chain getting deleted.
 | ||||
| 	if headTime > 0 && hc.genesisHeader.Time > headTime { | ||||
| 		// Note, a critical error is quite brutal, but we should really not reach
 | ||||
| 		// this point. Since pre-timestamp based forks it was impossible to have
 | ||||
| 		// a fork before block 0, the setHead would always work. With timestamp
 | ||||
| 		// forks it becomes possible to specify below the genesis. That said, the
 | ||||
| 		// only time we setHead via timestamp is with chain config changes on the
 | ||||
| 		// startup, so failing hard there is ok.
 | ||||
| 		log.Crit("Rejecting genesis rewind via timestamp", "target", headTime, "genesis", hc.genesisHeader.Time) | ||||
| 	} | ||||
| 	var ( | ||||
| 		parentHash common.Hash | ||||
| 		batch      = hc.chainDb.NewBatch() | ||||
|  | ||||
| @ -195,11 +195,8 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { | ||||
| 	) | ||||
| 	// Override the chain config with provided settings.
 | ||||
| 	var overrides core.ChainOverrides | ||||
| 	if config.OverrideTerminalTotalDifficulty != nil { | ||||
| 		overrides.OverrideTerminalTotalDifficulty = config.OverrideTerminalTotalDifficulty | ||||
| 	} | ||||
| 	if config.OverrideTerminalTotalDifficultyPassed != nil { | ||||
| 		overrides.OverrideTerminalTotalDifficultyPassed = config.OverrideTerminalTotalDifficultyPassed | ||||
| 	if config.OverrideShanghai != nil { | ||||
| 		overrides.OverrideShanghai = config.OverrideShanghai | ||||
| 	} | ||||
| 	eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, config.Genesis, &overrides, eth.engine, vmConfig, eth.shouldPreserve, &config.TxLookupLimit) | ||||
| 	if err != nil { | ||||
|  | ||||
| @ -206,11 +206,8 @@ type Config struct { | ||||
| 	// CheckpointOracle is the configuration for checkpoint oracle.
 | ||||
| 	CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` | ||||
| 
 | ||||
| 	// OverrideTerminalTotalDifficulty (TODO: remove after the fork)
 | ||||
| 	OverrideTerminalTotalDifficulty *big.Int `toml:",omitempty"` | ||||
| 
 | ||||
| 	// OverrideTerminalTotalDifficultyPassed (TODO: remove after the fork)
 | ||||
| 	OverrideTerminalTotalDifficultyPassed *bool `toml:",omitempty"` | ||||
| 	// OverrideShanghai (TODO: remove after the fork)
 | ||||
| 	OverrideShanghai *big.Int `toml:",omitempty"` | ||||
| } | ||||
| 
 | ||||
| // CreateConsensusEngine creates a consensus engine for the given chain configuration.
 | ||||
|  | ||||
| @ -19,50 +19,49 @@ import ( | ||||
| // MarshalTOML marshals as TOML.
 | ||||
| func (c Config) MarshalTOML() (interface{}, error) { | ||||
| 	type Config struct { | ||||
| 		Genesis                               *core.Genesis `toml:",omitempty"` | ||||
| 		NetworkId                             uint64 | ||||
| 		SyncMode                              downloader.SyncMode | ||||
| 		EthDiscoveryURLs                      []string | ||||
| 		SnapDiscoveryURLs                     []string | ||||
| 		NoPruning                             bool | ||||
| 		NoPrefetch                            bool | ||||
| 		TxLookupLimit                         uint64                 `toml:",omitempty"` | ||||
| 		RequiredBlocks                        map[uint64]common.Hash `toml:"-"` | ||||
| 		LightServ                             int                    `toml:",omitempty"` | ||||
| 		LightIngress                          int                    `toml:",omitempty"` | ||||
| 		LightEgress                           int                    `toml:",omitempty"` | ||||
| 		LightPeers                            int                    `toml:",omitempty"` | ||||
| 		LightNoPrune                          bool                   `toml:",omitempty"` | ||||
| 		LightNoSyncServe                      bool                   `toml:",omitempty"` | ||||
| 		SyncFromCheckpoint                    bool                   `toml:",omitempty"` | ||||
| 		UltraLightServers                     []string               `toml:",omitempty"` | ||||
| 		UltraLightFraction                    int                    `toml:",omitempty"` | ||||
| 		UltraLightOnlyAnnounce                bool                   `toml:",omitempty"` | ||||
| 		SkipBcVersionCheck                    bool                   `toml:"-"` | ||||
| 		DatabaseHandles                       int                    `toml:"-"` | ||||
| 		DatabaseCache                         int | ||||
| 		DatabaseFreezer                       string | ||||
| 		TrieCleanCache                        int | ||||
| 		TrieCleanCacheJournal                 string        `toml:",omitempty"` | ||||
| 		TrieCleanCacheRejournal               time.Duration `toml:",omitempty"` | ||||
| 		TrieDirtyCache                        int | ||||
| 		TrieTimeout                           time.Duration | ||||
| 		SnapshotCache                         int | ||||
| 		Preimages                             bool | ||||
| 		FilterLogCacheSize                    int | ||||
| 		Miner                                 miner.Config | ||||
| 		Ethash                                ethash.Config | ||||
| 		TxPool                                txpool.Config | ||||
| 		GPO                                   gasprice.Config | ||||
| 		EnablePreimageRecording               bool | ||||
| 		DocRoot                               string `toml:"-"` | ||||
| 		RPCGasCap                             uint64 | ||||
| 		RPCEVMTimeout                         time.Duration | ||||
| 		RPCTxFeeCap                           float64 | ||||
| 		Checkpoint                            *params.TrustedCheckpoint      `toml:",omitempty"` | ||||
| 		CheckpointOracle                      *params.CheckpointOracleConfig `toml:",omitempty"` | ||||
| 		OverrideTerminalTotalDifficulty       *big.Int                       `toml:",omitempty"` | ||||
| 		OverrideTerminalTotalDifficultyPassed *bool                          `toml:",omitempty"` | ||||
| 		Genesis                 *core.Genesis `toml:",omitempty"` | ||||
| 		NetworkId               uint64 | ||||
| 		SyncMode                downloader.SyncMode | ||||
| 		EthDiscoveryURLs        []string | ||||
| 		SnapDiscoveryURLs       []string | ||||
| 		NoPruning               bool | ||||
| 		NoPrefetch              bool | ||||
| 		TxLookupLimit           uint64                 `toml:",omitempty"` | ||||
| 		RequiredBlocks          map[uint64]common.Hash `toml:"-"` | ||||
| 		LightServ               int                    `toml:",omitempty"` | ||||
| 		LightIngress            int                    `toml:",omitempty"` | ||||
| 		LightEgress             int                    `toml:",omitempty"` | ||||
| 		LightPeers              int                    `toml:",omitempty"` | ||||
| 		LightNoPrune            bool                   `toml:",omitempty"` | ||||
| 		LightNoSyncServe        bool                   `toml:",omitempty"` | ||||
| 		SyncFromCheckpoint      bool                   `toml:",omitempty"` | ||||
| 		UltraLightServers       []string               `toml:",omitempty"` | ||||
| 		UltraLightFraction      int                    `toml:",omitempty"` | ||||
| 		UltraLightOnlyAnnounce  bool                   `toml:",omitempty"` | ||||
| 		SkipBcVersionCheck      bool                   `toml:"-"` | ||||
| 		DatabaseHandles         int                    `toml:"-"` | ||||
| 		DatabaseCache           int | ||||
| 		DatabaseFreezer         string | ||||
| 		TrieCleanCache          int | ||||
| 		TrieCleanCacheJournal   string        `toml:",omitempty"` | ||||
| 		TrieCleanCacheRejournal time.Duration `toml:",omitempty"` | ||||
| 		TrieDirtyCache          int | ||||
| 		TrieTimeout             time.Duration | ||||
| 		SnapshotCache           int | ||||
| 		Preimages               bool | ||||
| 		FilterLogCacheSize      int | ||||
| 		Miner                   miner.Config | ||||
| 		Ethash                  ethash.Config | ||||
| 		TxPool                  txpool.Config | ||||
| 		GPO                     gasprice.Config | ||||
| 		EnablePreimageRecording bool | ||||
| 		DocRoot                 string `toml:"-"` | ||||
| 		RPCGasCap               uint64 | ||||
| 		RPCEVMTimeout           time.Duration | ||||
| 		RPCTxFeeCap             float64 | ||||
| 		Checkpoint              *params.TrustedCheckpoint      `toml:",omitempty"` | ||||
| 		CheckpointOracle        *params.CheckpointOracleConfig `toml:",omitempty"` | ||||
| 		OverrideShanghai        *big.Int                       `toml:",omitempty"` | ||||
| 	} | ||||
| 	var enc Config | ||||
| 	enc.Genesis = c.Genesis | ||||
| @ -107,58 +106,56 @@ func (c Config) MarshalTOML() (interface{}, error) { | ||||
| 	enc.RPCTxFeeCap = c.RPCTxFeeCap | ||||
| 	enc.Checkpoint = c.Checkpoint | ||||
| 	enc.CheckpointOracle = c.CheckpointOracle | ||||
| 	enc.OverrideTerminalTotalDifficulty = c.OverrideTerminalTotalDifficulty | ||||
| 	enc.OverrideTerminalTotalDifficultyPassed = c.OverrideTerminalTotalDifficultyPassed | ||||
| 	enc.OverrideShanghai = c.OverrideShanghai | ||||
| 	return &enc, nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalTOML unmarshals from TOML.
 | ||||
| func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { | ||||
| 	type Config struct { | ||||
| 		Genesis                               *core.Genesis `toml:",omitempty"` | ||||
| 		NetworkId                             *uint64 | ||||
| 		SyncMode                              *downloader.SyncMode | ||||
| 		EthDiscoveryURLs                      []string | ||||
| 		SnapDiscoveryURLs                     []string | ||||
| 		NoPruning                             *bool | ||||
| 		NoPrefetch                            *bool | ||||
| 		TxLookupLimit                         *uint64                `toml:",omitempty"` | ||||
| 		RequiredBlocks                        map[uint64]common.Hash `toml:"-"` | ||||
| 		LightServ                             *int                   `toml:",omitempty"` | ||||
| 		LightIngress                          *int                   `toml:",omitempty"` | ||||
| 		LightEgress                           *int                   `toml:",omitempty"` | ||||
| 		LightPeers                            *int                   `toml:",omitempty"` | ||||
| 		LightNoPrune                          *bool                  `toml:",omitempty"` | ||||
| 		LightNoSyncServe                      *bool                  `toml:",omitempty"` | ||||
| 		SyncFromCheckpoint                    *bool                  `toml:",omitempty"` | ||||
| 		UltraLightServers                     []string               `toml:",omitempty"` | ||||
| 		UltraLightFraction                    *int                   `toml:",omitempty"` | ||||
| 		UltraLightOnlyAnnounce                *bool                  `toml:",omitempty"` | ||||
| 		SkipBcVersionCheck                    *bool                  `toml:"-"` | ||||
| 		DatabaseHandles                       *int                   `toml:"-"` | ||||
| 		DatabaseCache                         *int | ||||
| 		DatabaseFreezer                       *string | ||||
| 		TrieCleanCache                        *int | ||||
| 		TrieCleanCacheJournal                 *string        `toml:",omitempty"` | ||||
| 		TrieCleanCacheRejournal               *time.Duration `toml:",omitempty"` | ||||
| 		TrieDirtyCache                        *int | ||||
| 		TrieTimeout                           *time.Duration | ||||
| 		SnapshotCache                         *int | ||||
| 		Preimages                             *bool | ||||
| 		FilterLogCacheSize                    *int | ||||
| 		Miner                                 *miner.Config | ||||
| 		Ethash                                *ethash.Config | ||||
| 		TxPool                                *txpool.Config | ||||
| 		GPO                                   *gasprice.Config | ||||
| 		EnablePreimageRecording               *bool | ||||
| 		DocRoot                               *string `toml:"-"` | ||||
| 		RPCGasCap                             *uint64 | ||||
| 		RPCEVMTimeout                         *time.Duration | ||||
| 		RPCTxFeeCap                           *float64 | ||||
| 		Checkpoint                            *params.TrustedCheckpoint      `toml:",omitempty"` | ||||
| 		CheckpointOracle                      *params.CheckpointOracleConfig `toml:",omitempty"` | ||||
| 		OverrideTerminalTotalDifficulty       *big.Int                       `toml:",omitempty"` | ||||
| 		OverrideTerminalTotalDifficultyPassed *bool                          `toml:",omitempty"` | ||||
| 		Genesis                 *core.Genesis `toml:",omitempty"` | ||||
| 		NetworkId               *uint64 | ||||
| 		SyncMode                *downloader.SyncMode | ||||
| 		EthDiscoveryURLs        []string | ||||
| 		SnapDiscoveryURLs       []string | ||||
| 		NoPruning               *bool | ||||
| 		NoPrefetch              *bool | ||||
| 		TxLookupLimit           *uint64                `toml:",omitempty"` | ||||
| 		RequiredBlocks          map[uint64]common.Hash `toml:"-"` | ||||
| 		LightServ               *int                   `toml:",omitempty"` | ||||
| 		LightIngress            *int                   `toml:",omitempty"` | ||||
| 		LightEgress             *int                   `toml:",omitempty"` | ||||
| 		LightPeers              *int                   `toml:",omitempty"` | ||||
| 		LightNoPrune            *bool                  `toml:",omitempty"` | ||||
| 		LightNoSyncServe        *bool                  `toml:",omitempty"` | ||||
| 		SyncFromCheckpoint      *bool                  `toml:",omitempty"` | ||||
| 		UltraLightServers       []string               `toml:",omitempty"` | ||||
| 		UltraLightFraction      *int                   `toml:",omitempty"` | ||||
| 		UltraLightOnlyAnnounce  *bool                  `toml:",omitempty"` | ||||
| 		SkipBcVersionCheck      *bool                  `toml:"-"` | ||||
| 		DatabaseHandles         *int                   `toml:"-"` | ||||
| 		DatabaseCache           *int | ||||
| 		DatabaseFreezer         *string | ||||
| 		TrieCleanCache          *int | ||||
| 		TrieCleanCacheJournal   *string        `toml:",omitempty"` | ||||
| 		TrieCleanCacheRejournal *time.Duration `toml:",omitempty"` | ||||
| 		TrieDirtyCache          *int | ||||
| 		TrieTimeout             *time.Duration | ||||
| 		SnapshotCache           *int | ||||
| 		Preimages               *bool | ||||
| 		FilterLogCacheSize      *int | ||||
| 		Miner                   *miner.Config | ||||
| 		Ethash                  *ethash.Config | ||||
| 		TxPool                  *txpool.Config | ||||
| 		GPO                     *gasprice.Config | ||||
| 		EnablePreimageRecording *bool | ||||
| 		DocRoot                 *string `toml:"-"` | ||||
| 		RPCGasCap               *uint64 | ||||
| 		RPCEVMTimeout           *time.Duration | ||||
| 		RPCTxFeeCap             *float64 | ||||
| 		Checkpoint              *params.TrustedCheckpoint      `toml:",omitempty"` | ||||
| 		CheckpointOracle        *params.CheckpointOracleConfig `toml:",omitempty"` | ||||
| 		OverrideShanghai        *big.Int                       `toml:",omitempty"` | ||||
| 	} | ||||
| 	var dec Config | ||||
| 	if err := unmarshal(&dec); err != nil { | ||||
| @ -290,11 +287,8 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { | ||||
| 	if dec.CheckpointOracle != nil { | ||||
| 		c.CheckpointOracle = dec.CheckpointOracle | ||||
| 	} | ||||
| 	if dec.OverrideTerminalTotalDifficulty != nil { | ||||
| 		c.OverrideTerminalTotalDifficulty = dec.OverrideTerminalTotalDifficulty | ||||
| 	} | ||||
| 	if dec.OverrideTerminalTotalDifficultyPassed != nil { | ||||
| 		c.OverrideTerminalTotalDifficultyPassed = dec.OverrideTerminalTotalDifficultyPassed | ||||
| 	if dec.OverrideShanghai != nil { | ||||
| 		c.OverrideShanghai = dec.OverrideShanghai | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @ -94,11 +94,8 @@ func New(stack *node.Node, config *ethconfig.Config) (*LightEthereum, error) { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	var overrides core.ChainOverrides | ||||
| 	if config.OverrideTerminalTotalDifficulty != nil { | ||||
| 		overrides.OverrideTerminalTotalDifficulty = config.OverrideTerminalTotalDifficulty | ||||
| 	} | ||||
| 	if config.OverrideTerminalTotalDifficultyPassed != nil { | ||||
| 		overrides.OverrideTerminalTotalDifficultyPassed = config.OverrideTerminalTotalDifficultyPassed | ||||
| 	if config.OverrideShanghai != nil { | ||||
| 		overrides.OverrideShanghai = config.OverrideShanghai | ||||
| 	} | ||||
| 	chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, trie.NewDatabase(chainDb), config.Genesis, &overrides) | ||||
| 	if _, isCompat := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !isCompat { | ||||
|  | ||||
| @ -445,45 +445,53 @@ func (c *ChainConfig) Description() string { | ||||
| 	// Create a list of forks with a short description of them. Forks that only
 | ||||
| 	// makes sense for mainnet should be optional at printing to avoid bloating
 | ||||
| 	// the output for testnets and private networks.
 | ||||
| 	banner += "Pre-Merge hard forks:\n" | ||||
| 	banner += fmt.Sprintf(" - Homestead:                   %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/homestead.md)\n", c.HomesteadBlock) | ||||
| 	banner += "Pre-Merge hard forks (block based):\n" | ||||
| 	banner += fmt.Sprintf(" - Homestead:                   #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/homestead.md)\n", c.HomesteadBlock) | ||||
| 	if c.DAOForkBlock != nil { | ||||
| 		banner += fmt.Sprintf(" - DAO Fork:                    %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/dao-fork.md)\n", c.DAOForkBlock) | ||||
| 		banner += fmt.Sprintf(" - DAO Fork:                    #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/dao-fork.md)\n", c.DAOForkBlock) | ||||
| 	} | ||||
| 	banner += fmt.Sprintf(" - Tangerine Whistle (EIP 150): %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/tangerine-whistle.md)\n", c.EIP150Block) | ||||
| 	banner += fmt.Sprintf(" - Spurious Dragon/1 (EIP 155): %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md)\n", c.EIP155Block) | ||||
| 	banner += fmt.Sprintf(" - Spurious Dragon/2 (EIP 158): %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md)\n", c.EIP155Block) | ||||
| 	banner += fmt.Sprintf(" - Byzantium:                   %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/byzantium.md)\n", c.ByzantiumBlock) | ||||
| 	banner += fmt.Sprintf(" - Constantinople:              %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/constantinople.md)\n", c.ConstantinopleBlock) | ||||
| 	banner += fmt.Sprintf(" - Petersburg:                  %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/petersburg.md)\n", c.PetersburgBlock) | ||||
| 	banner += fmt.Sprintf(" - Istanbul:                    %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/istanbul.md)\n", c.IstanbulBlock) | ||||
| 	banner += fmt.Sprintf(" - Tangerine Whistle (EIP 150): #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/tangerine-whistle.md)\n", c.EIP150Block) | ||||
| 	banner += fmt.Sprintf(" - Spurious Dragon/1 (EIP 155): #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md)\n", c.EIP155Block) | ||||
| 	banner += fmt.Sprintf(" - Spurious Dragon/2 (EIP 158): #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/spurious-dragon.md)\n", c.EIP155Block) | ||||
| 	banner += fmt.Sprintf(" - Byzantium:                   #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/byzantium.md)\n", c.ByzantiumBlock) | ||||
| 	banner += fmt.Sprintf(" - Constantinople:              #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/constantinople.md)\n", c.ConstantinopleBlock) | ||||
| 	banner += fmt.Sprintf(" - Petersburg:                  #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/petersburg.md)\n", c.PetersburgBlock) | ||||
| 	banner += fmt.Sprintf(" - Istanbul:                    #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/istanbul.md)\n", c.IstanbulBlock) | ||||
| 	if c.MuirGlacierBlock != nil { | ||||
| 		banner += fmt.Sprintf(" - Muir Glacier:                %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/muir-glacier.md)\n", c.MuirGlacierBlock) | ||||
| 		banner += fmt.Sprintf(" - Muir Glacier:                #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/muir-glacier.md)\n", c.MuirGlacierBlock) | ||||
| 	} | ||||
| 	banner += fmt.Sprintf(" - Berlin:                      %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/berlin.md)\n", c.BerlinBlock) | ||||
| 	banner += fmt.Sprintf(" - London:                      %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md)\n", c.LondonBlock) | ||||
| 	banner += fmt.Sprintf(" - Berlin:                      #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/berlin.md)\n", c.BerlinBlock) | ||||
| 	banner += fmt.Sprintf(" - London:                      #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md)\n", c.LondonBlock) | ||||
| 	if c.ArrowGlacierBlock != nil { | ||||
| 		banner += fmt.Sprintf(" - Arrow Glacier:               %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/arrow-glacier.md)\n", c.ArrowGlacierBlock) | ||||
| 		banner += fmt.Sprintf(" - Arrow Glacier:               #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/arrow-glacier.md)\n", c.ArrowGlacierBlock) | ||||
| 	} | ||||
| 	if c.GrayGlacierBlock != nil { | ||||
| 		banner += fmt.Sprintf(" - Gray Glacier:                %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/gray-glacier.md)\n", c.GrayGlacierBlock) | ||||
| 	} | ||||
| 	banner += fmt.Sprintf(" - Shanghai:                    %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md)\n", c.ShanghaiTime) | ||||
| 	if c.CancunBlock != nil { | ||||
| 		banner += fmt.Sprintf(" - Cancun:                      %-8v\n", c.CancunBlock) | ||||
| 		banner += fmt.Sprintf(" - Gray Glacier:                #%-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/gray-glacier.md)\n", c.GrayGlacierBlock) | ||||
| 	} | ||||
| 	banner += "\n" | ||||
| 
 | ||||
| 	// Add a special section for the merge as it's non-obvious
 | ||||
| 	if c.TerminalTotalDifficulty == nil { | ||||
| 		banner += "The Merge is not yet available for this network!\n" | ||||
| 		banner += " - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md" | ||||
| 		banner += " - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md\n" | ||||
| 	} else { | ||||
| 		banner += "Merge configured:\n" | ||||
| 		banner += " - Hard-fork specification:    https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md\n" | ||||
| 		banner += fmt.Sprintf(" - Network known to be merged: %v\n", c.TerminalTotalDifficultyPassed) | ||||
| 		banner += fmt.Sprintf(" - Total terminal difficulty:  %v\n", c.TerminalTotalDifficulty) | ||||
| 		banner += fmt.Sprintf(" - Merge netsplit block:       %-8v", c.MergeNetsplitBlock) | ||||
| 		if c.MergeNetsplitBlock != nil { | ||||
| 			banner += fmt.Sprintf(" - Merge netsplit block:       #%-8v\n", c.MergeNetsplitBlock) | ||||
| 		} | ||||
| 	} | ||||
| 	banner += "\n" | ||||
| 
 | ||||
| 	// Create a list of forks post-merge
 | ||||
| 	banner += "Post-Merge hard forks (timestamp based):\n" | ||||
| 	if c.ShanghaiTime != nil { | ||||
| 		banner += fmt.Sprintf(" - Shanghai:                    @%-10v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md)\n", c.ShanghaiTime) | ||||
| 	} | ||||
| 	if c.CancunBlock != nil { | ||||
| 		banner += fmt.Sprintf(" - Cancun:                      @%-10v\n", c.CancunBlock) | ||||
| 	} | ||||
| 	return banner | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user