@@ -316,6 +316,17 @@ var (
316316 TestRules = TestChainConfig .Rules (new (big.Int ), false )
317317)
318318
319+ // NetworkNames are user friendly names to use in the chain spec banner.
320+ var NetworkNames = map [string ]string {
321+ MainnetChainConfig .ChainID .String (): "mainnet" ,
322+ RopstenChainConfig .ChainID .String (): "ropsten" ,
323+ RinkebyChainConfig .ChainID .String (): "rinkeby" ,
324+ GoerliChainConfig .ChainID .String (): "goerli" ,
325+ SepoliaChainConfig .ChainID .String (): "sepolia" ,
326+ WemixMainnetChainConfig .ChainID .String (): "wemix mainnet" ,
327+ WemixTestnetChainConfig .ChainID .String (): "wemix testnet" ,
328+ }
329+
319330// TrustedCheckpoint represents a set of post-processed trie roots (CHT and
320331// BloomTrie) associated with the appropriate section index and head hash. It is
321332// used to start light syncing from this checkpoint and avoid downloading the
@@ -392,7 +403,7 @@ type ChainConfig struct {
392403 BerlinBlock * big.Int `json:"berlinBlock,omitempty"` // Berlin switch block (nil = no fork, 0 = already on berlin)
393404 LondonBlock * big.Int `json:"londonBlock,omitempty"` // London switch block (nil = no fork, 0 = already on london)
394405 ArrowGlacierBlock * big.Int `json:"arrowGlacierBlock,omitempty"` // Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)
395- MergeForkBlock * big.Int `json:"mergeForkBlock ,omitempty"` // EIP-3675 (TheMerge) switch block (nil = no fork, 0 = already in merge proceedings)
406+ MergeNetsplitBlock * big.Int `json:"mergeNetsplitBlock ,omitempty"` // Virtual fork after The Merge to use as a network splitter
396407 PangyoBlock * big.Int `json:"pangyoBlock,omitempty"` // Pangyo switch block (nil = no fork, 0 = already on pangyo)
397408 ApplepieBlock * big.Int `json:"applepieBlock,omitempty"` // Applepie switch block (nil = no fork, 0 = already on applepie)
398409
@@ -426,37 +437,75 @@ func (c *CliqueConfig) String() string {
426437
427438// String implements the fmt.Stringer interface.
428439func (c * ChainConfig ) String () string {
429- var engine interface {}
440+ var banner string
441+
442+ // Create some basinc network config output
443+ network := NetworkNames [c .ChainID .String ()]
444+ if network == "" {
445+ network = "unknown"
446+ }
447+ banner += fmt .Sprintf ("Chain ID: %v (%s)\n " , c .ChainID , network )
430448 switch {
431449 case c .Ethash != nil :
432- engine = c .Ethash
450+ if c .TerminalTotalDifficulty == nil {
451+ if ConsensusMethod == ConsensusPoW {
452+ banner += "Consensus: Ethash (proof-of-work)\n "
453+ } else {
454+ banner += "Consensus: Ethash (Stake base Proof of Authority for wemix)\n "
455+ }
456+ } else {
457+ banner += "Consensus: Beacon (proof-of-stake), merged from Ethash (proof-of-work)\n "
458+ }
433459 case c .Clique != nil :
434- engine = c .Clique
460+ if c .TerminalTotalDifficulty == nil {
461+ banner += "Consensus: Clique (proof-of-authority)\n "
462+ } else {
463+ banner += "Consensus: Beacon (proof-of-stake), merged from Clique (proof-of-authority)\n "
464+ }
435465 default :
436- engine = "unknown"
437- }
438- return fmt .Sprintf ("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, MergeFork: %v, PangyoFork: %v, ApplepieFork: %v, Terminal TD: %v, Engine: %v}" ,
439- c .ChainID ,
440- c .HomesteadBlock ,
441- c .DAOForkBlock ,
442- c .DAOForkSupport ,
443- c .EIP150Block ,
444- c .EIP155Block ,
445- c .EIP158Block ,
446- c .ByzantiumBlock ,
447- c .ConstantinopleBlock ,
448- c .PetersburgBlock ,
449- c .IstanbulBlock ,
450- c .MuirGlacierBlock ,
451- c .BerlinBlock ,
452- c .LondonBlock ,
453- c .ArrowGlacierBlock ,
454- c .MergeForkBlock ,
455- c .PangyoBlock ,
456- c .ApplepieBlock ,
457- c .TerminalTotalDifficulty ,
458- engine ,
459- )
466+ banner += "Consensus: unknown\n "
467+ }
468+ banner += "\n "
469+
470+ // Create a list of forks with a short description of them. Forks that only
471+ // makes sense for mainnet should be optional at printing to avoid bloating
472+ // the output for testnets and private networks.
473+ banner += "Pre-Merge hard forks:\n "
474+ banner += fmt .Sprintf (" - Homestead: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/homestead.md)\n " , c .HomesteadBlock )
475+ if c .DAOForkBlock != nil {
476+ banner += fmt .Sprintf (" - DAO Fork: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/dao-fork.md)\n " , c .DAOForkBlock )
477+ }
478+ 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 )
479+ 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 )
480+ 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 )
481+ banner += fmt .Sprintf (" - Byzantium: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/byzantium.md)\n " , c .ByzantiumBlock )
482+ banner += fmt .Sprintf (" - Constantinople: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/constantinople.md)\n " , c .ConstantinopleBlock )
483+ banner += fmt .Sprintf (" - Petersburg: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/petersburg.md)\n " , c .PetersburgBlock )
484+ banner += fmt .Sprintf (" - Istanbul: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/istanbul.md)\n " , c .IstanbulBlock )
485+ if c .MuirGlacierBlock != nil {
486+ banner += fmt .Sprintf (" - Muir Glacier: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/muir-glacier.md)\n " , c .MuirGlacierBlock )
487+ }
488+ banner += fmt .Sprintf (" - Berlin: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/berlin.md)\n " , c .BerlinBlock )
489+ banner += fmt .Sprintf (" - London: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/london.md)\n " , c .LondonBlock )
490+ if c .ArrowGlacierBlock != nil {
491+ banner += fmt .Sprintf (" - Arrow Glacier: %-8v (https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/arrow-glacier.md)\n " , c .ArrowGlacierBlock )
492+ }
493+ banner += fmt .Sprintf (" - Pangyo: %-8v\n " , c .PangyoBlock )
494+ banner += fmt .Sprintf (" - Applepie: %-8v\n " , c .ApplepieBlock )
495+ banner += "\n "
496+
497+ // Add a special section for the merge as it's non-obvious
498+ if c .TerminalTotalDifficulty == nil {
499+ banner += "Merge not configured!\n "
500+ banner += " - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md)"
501+ } else {
502+ banner += "Merge configured:\n "
503+ banner += " - Hard-fork specification: https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md)\n "
504+ banner += fmt .Sprintf (" - Total terminal difficulty: %v\n " , c .TerminalTotalDifficulty )
505+ banner += fmt .Sprintf (" - Merge netsplit block: %-8v" , c .MergeNetsplitBlock )
506+ }
507+ return banner
508+
460509}
461510
462511// IsHomestead returns whether num is either equal to the homestead block or greater.
@@ -591,7 +640,7 @@ func (c *ChainConfig) CheckConfigForkOrder() error {
591640 {name : "berlinBlock" , block : c .BerlinBlock },
592641 {name : "londonBlock" , block : c .LondonBlock },
593642 {name : "arrowGlacierBlock" , block : c .ArrowGlacierBlock , optional : true },
594- {name : "mergeStartBlock " , block : c .MergeForkBlock , optional : true },
643+ {name : "mergeNetsplitBlock " , block : c .MergeNetsplitBlock , optional : true },
595644 } {
596645 if lastFork .name != "" {
597646 // Next one must be higher number
@@ -664,8 +713,8 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi
664713 if isForkIncompatible (c .ArrowGlacierBlock , newcfg .ArrowGlacierBlock , head ) {
665714 return newCompatError ("Arrow Glacier fork block" , c .ArrowGlacierBlock , newcfg .ArrowGlacierBlock )
666715 }
667- if isForkIncompatible (c .MergeForkBlock , newcfg .MergeForkBlock , head ) {
668- return newCompatError ("Merge Start fork block" , c .MergeForkBlock , newcfg .MergeForkBlock )
716+ if isForkIncompatible (c .MergeNetsplitBlock , newcfg .MergeNetsplitBlock , head ) {
717+ return newCompatError ("Merge netsplit fork block" , c .MergeNetsplitBlock , newcfg .MergeNetsplitBlock )
669718 }
670719 return nil
671720}
0 commit comments