forked from cerc-io/plugeth
		
	cmd, core, params: add support for the Holesky testnet (#28007)
* cmd, core, params: add support for the Holesky testnet * cmd/devp2p: add support for holesky for the dns crawler
This commit is contained in:
		
							parent
							
								
									5e0eb62a8e
								
							
						
					
					
						commit
						6b98d18789
					
				| @ -44,7 +44,7 @@ set to standard output. The following filters are supported: | ||||
| - `-limit <N>` limits the output set to N entries, taking the top N nodes by score | ||||
| - `-ip <CIDR>` filters nodes by IP subnet | ||||
| - `-min-age <duration>` filters nodes by 'first seen' time | ||||
| - `-eth-network <mainnet/goerli/sepolia>` filters nodes by "eth" ENR entry | ||||
| - `-eth-network <mainnet/goerli/sepolia/holesky>` filters nodes by "eth" ENR entry | ||||
| - `-les-server` filters nodes by LES server support | ||||
| - `-snap` filters nodes by snap protocol support | ||||
| 
 | ||||
|  | ||||
| @ -233,6 +233,8 @@ func ethFilter(args []string) (nodeFilter, error) { | ||||
| 		filter = forkid.NewStaticFilter(params.GoerliChainConfig, params.GoerliGenesisHash) | ||||
| 	case "sepolia": | ||||
| 		filter = forkid.NewStaticFilter(params.SepoliaChainConfig, params.SepoliaGenesisHash) | ||||
| 	case "holesky": | ||||
| 		filter = forkid.NewStaticFilter(params.HoleskyChainConfig, params.HoleskyGenesisHash) | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("unknown network %q", args[0]) | ||||
| 	} | ||||
|  | ||||
| @ -275,6 +275,9 @@ func prepare(ctx *cli.Context) { | ||||
| 	case ctx.IsSet(utils.SepoliaFlag.Name): | ||||
| 		log.Info("Starting Geth on Sepolia testnet...") | ||||
| 
 | ||||
| 	case ctx.IsSet(utils.HoleskyFlag.Name): | ||||
| 		log.Info("Starting Geth on Holesky testnet...") | ||||
| 
 | ||||
| 	case ctx.IsSet(utils.DeveloperFlag.Name): | ||||
| 		log.Info("Starting Geth in ephemeral dev mode...") | ||||
| 		log.Warn(`You are running Geth in --dev mode. Please note the following: | ||||
| @ -299,7 +302,8 @@ func prepare(ctx *cli.Context) { | ||||
| 	// If we're a full node on mainnet without --cache specified, bump default cache allowance
 | ||||
| 	if ctx.String(utils.SyncModeFlag.Name) != "light" && !ctx.IsSet(utils.CacheFlag.Name) && !ctx.IsSet(utils.NetworkIdFlag.Name) { | ||||
| 		// Make sure we're not on any supported preconfigured testnet either
 | ||||
| 		if !ctx.IsSet(utils.SepoliaFlag.Name) && | ||||
| 		if !ctx.IsSet(utils.HoleskyFlag.Name) && | ||||
| 			!ctx.IsSet(utils.SepoliaFlag.Name) && | ||||
| 			!ctx.IsSet(utils.GoerliFlag.Name) && | ||||
| 			!ctx.IsSet(utils.DeveloperFlag.Name) { | ||||
| 			// Nope, we're really on mainnet. Bump that cache up!
 | ||||
|  | ||||
| @ -136,7 +136,7 @@ var ( | ||||
| 	} | ||||
| 	NetworkIdFlag = &cli.Uint64Flag{ | ||||
| 		Name:     "networkid", | ||||
| 		Usage:    "Explicitly set network id (integer)(For testnets: use --goerli, --sepolia instead)", | ||||
| 		Usage:    "Explicitly set network id (integer)(For testnets: use --goerli, --sepolia, --holesky instead)", | ||||
| 		Value:    ethconfig.Defaults.NetworkId, | ||||
| 		Category: flags.EthCategory, | ||||
| 	} | ||||
| @ -155,7 +155,11 @@ var ( | ||||
| 		Usage:    "Sepolia network: pre-configured proof-of-work test network", | ||||
| 		Category: flags.EthCategory, | ||||
| 	} | ||||
| 
 | ||||
| 	HoleskyFlag = &cli.BoolFlag{ | ||||
| 		Name:     "holesky", | ||||
| 		Usage:    "Holesky network: pre-configured proof-of-stake test network", | ||||
| 		Category: flags.EthCategory, | ||||
| 	} | ||||
| 	// Dev mode
 | ||||
| 	DeveloperFlag = &cli.BoolFlag{ | ||||
| 		Name:     "dev", | ||||
| @ -952,6 +956,7 @@ var ( | ||||
| 	TestnetFlags = []cli.Flag{ | ||||
| 		GoerliFlag, | ||||
| 		SepoliaFlag, | ||||
| 		HoleskyFlag, | ||||
| 	} | ||||
| 	// NetworkFlags is the flag group of all built-in supported networks.
 | ||||
| 	NetworkFlags = append([]cli.Flag{MainnetFlag}, TestnetFlags...) | ||||
| @ -982,6 +987,9 @@ func MakeDataDir(ctx *cli.Context) string { | ||||
| 		if ctx.Bool(SepoliaFlag.Name) { | ||||
| 			return filepath.Join(path, "sepolia") | ||||
| 		} | ||||
| 		if ctx.Bool(HoleskyFlag.Name) { | ||||
| 			return filepath.Join(path, "holesky") | ||||
| 		} | ||||
| 		return path | ||||
| 	} | ||||
| 	Fatalf("Cannot determine default data directory, please set manually (--datadir)") | ||||
| @ -1028,6 +1036,8 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { | ||||
| 	switch { | ||||
| 	case ctx.IsSet(BootnodesFlag.Name): | ||||
| 		urls = SplitAndTrim(ctx.String(BootnodesFlag.Name)) | ||||
| 	case ctx.Bool(HoleskyFlag.Name): | ||||
| 		urls = params.HoleskyBootnodes | ||||
| 	case ctx.Bool(SepoliaFlag.Name): | ||||
| 		urls = params.SepoliaBootnodes | ||||
| 	case ctx.Bool(GoerliFlag.Name): | ||||
| @ -1480,6 +1490,8 @@ func SetDataDir(ctx *cli.Context, cfg *node.Config) { | ||||
| 		cfg.DataDir = filepath.Join(node.DefaultDataDir(), "goerli") | ||||
| 	case ctx.Bool(SepoliaFlag.Name) && cfg.DataDir == node.DefaultDataDir(): | ||||
| 		cfg.DataDir = filepath.Join(node.DefaultDataDir(), "sepolia") | ||||
| 	case ctx.Bool(HoleskyFlag.Name) && cfg.DataDir == node.DefaultDataDir(): | ||||
| 		cfg.DataDir = filepath.Join(node.DefaultDataDir(), "holesky") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -1636,7 +1648,7 @@ func CheckExclusive(ctx *cli.Context, args ...interface{}) { | ||||
| // SetEthConfig applies eth-related command line flags to the config.
 | ||||
| func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { | ||||
| 	// Avoid conflicting network flags
 | ||||
| 	CheckExclusive(ctx, MainnetFlag, DeveloperFlag, GoerliFlag, SepoliaFlag) | ||||
| 	CheckExclusive(ctx, MainnetFlag, DeveloperFlag, GoerliFlag, SepoliaFlag, HoleskyFlag) | ||||
| 	CheckExclusive(ctx, LightServeFlag, SyncModeFlag, "light") | ||||
| 	CheckExclusive(ctx, DeveloperFlag, ExternalSignerFlag) // Can't use both ephemeral unlocked and external signer
 | ||||
| 
 | ||||
| @ -1789,6 +1801,12 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { | ||||
| 		} | ||||
| 		cfg.Genesis = core.DefaultGenesisBlock() | ||||
| 		SetDNSDiscoveryDefaults(cfg, params.MainnetGenesisHash) | ||||
| 	case ctx.Bool(HoleskyFlag.Name): | ||||
| 		if !ctx.IsSet(NetworkIdFlag.Name) { | ||||
| 			cfg.NetworkId = 17000 | ||||
| 		} | ||||
| 		cfg.Genesis = core.DefaultHoleskyGenesisBlock() | ||||
| 		SetDNSDiscoveryDefaults(cfg, params.HoleskyGenesisHash) | ||||
| 	case ctx.Bool(SepoliaFlag.Name): | ||||
| 		if !ctx.IsSet(NetworkIdFlag.Name) { | ||||
| 			cfg.NetworkId = 11155111 | ||||
| @ -2121,6 +2139,8 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { | ||||
| 	switch { | ||||
| 	case ctx.Bool(MainnetFlag.Name): | ||||
| 		genesis = core.DefaultGenesisBlock() | ||||
| 	case ctx.Bool(HoleskyFlag.Name): | ||||
| 		genesis = core.DefaultHoleskyGenesisBlock() | ||||
| 	case ctx.Bool(SepoliaFlag.Name): | ||||
| 		genesis = core.DefaultSepoliaGenesisBlock() | ||||
| 	case ctx.Bool(GoerliFlag.Name): | ||||
|  | ||||
| @ -580,6 +580,19 @@ func DefaultSepoliaGenesisBlock() *Genesis { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // DefaultHoleskyGenesisBlock returns the Holesky network genesis block.
 | ||||
| func DefaultHoleskyGenesisBlock() *Genesis { | ||||
| 	return &Genesis{ | ||||
| 		Config:     params.HoleskyChainConfig, | ||||
| 		Nonce:      0x1234, | ||||
| 		ExtraData:  hexutil.MustDecode("0x686f77206d7563682069732074686520666973683f"), | ||||
| 		GasLimit:   0x17d7840, | ||||
| 		Difficulty: big.NewInt(0x01), | ||||
| 		Timestamp:  1694786100, | ||||
| 		Alloc:      decodePrealloc(holeskyAllocData), | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // DeveloperGenesisBlock returns the 'geth --dev' genesis block.
 | ||||
| func DeveloperGenesisBlock(gasLimit uint64, faucet common.Address) *Genesis { | ||||
| 	// Override the default period to the user requested one
 | ||||
| @ -607,13 +620,34 @@ func DeveloperGenesisBlock(gasLimit uint64, faucet common.Address) *Genesis { | ||||
| } | ||||
| 
 | ||||
| func decodePrealloc(data string) GenesisAlloc { | ||||
| 	var p []struct{ Addr, Balance *big.Int } | ||||
| 	var p []struct { | ||||
| 		Addr    *big.Int | ||||
| 		Balance *big.Int | ||||
| 		Misc    *struct { | ||||
| 			Nonce uint64 | ||||
| 			Code  []byte | ||||
| 			Slots []struct { | ||||
| 				Key common.Hash | ||||
| 				Val common.Hash | ||||
| 			} | ||||
| 		} `rlp:"optional"` | ||||
| 	} | ||||
| 	if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	ga := make(GenesisAlloc, len(p)) | ||||
| 	for _, account := range p { | ||||
| 		ga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance} | ||||
| 		acc := GenesisAccount{Balance: account.Balance} | ||||
| 		if account.Misc != nil { | ||||
| 			acc.Nonce = account.Misc.Nonce | ||||
| 			acc.Code = account.Misc.Code | ||||
| 
 | ||||
| 			acc.Storage = make(map[common.Hash]common.Hash) | ||||
| 			for _, slot := range account.Misc.Slots { | ||||
| 				acc.Storage[slot.Key] = slot.Val | ||||
| 			} | ||||
| 		} | ||||
| 		ga[common.BigToAddress(account.Addr)] = acc | ||||
| 	} | ||||
| 	return ga | ||||
| } | ||||
|  | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -32,24 +32,51 @@ import ( | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/core" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"golang.org/x/exp/slices" | ||||
| ) | ||||
| 
 | ||||
| type allocItem struct{ Addr, Balance *big.Int } | ||||
| type allocItem struct { | ||||
| 	Addr    *big.Int | ||||
| 	Balance *big.Int | ||||
| 	Misc    *allocItemMisc `rlp:"optional"` | ||||
| } | ||||
| 
 | ||||
| type allocItemMisc struct { | ||||
| 	Nonce uint64 | ||||
| 	Code  []byte | ||||
| 	Slots []allocItemStorageItem | ||||
| } | ||||
| 
 | ||||
| type allocItemStorageItem struct { | ||||
| 	Key common.Hash | ||||
| 	Val common.Hash | ||||
| } | ||||
| 
 | ||||
| func makelist(g *core.Genesis) []allocItem { | ||||
| 	items := make([]allocItem, 0, len(g.Alloc)) | ||||
| 	for addr, account := range g.Alloc { | ||||
| 		var misc *allocItemMisc | ||||
| 		if len(account.Storage) > 0 || len(account.Code) > 0 || account.Nonce != 0 { | ||||
| 			panic(fmt.Sprintf("can't encode account %x", addr)) | ||||
| 			misc = &allocItemMisc{ | ||||
| 				Nonce: account.Nonce, | ||||
| 				Code:  account.Code, | ||||
| 				Slots: make([]allocItemStorageItem, 0, len(account.Storage)), | ||||
| 			} | ||||
| 			for key, val := range account.Storage { | ||||
| 				misc.Slots = append(misc.Slots, allocItemStorageItem{key, val}) | ||||
| 			} | ||||
| 			slices.SortFunc(misc.Slots, func(a, b allocItemStorageItem) int { | ||||
| 				return a.Key.Cmp(b.Key) | ||||
| 			}) | ||||
| 		} | ||||
| 		bigAddr := new(big.Int).SetBytes(addr.Bytes()) | ||||
| 		items = append(items, allocItem{bigAddr, account.Balance}) | ||||
| 		items = append(items, allocItem{bigAddr, account.Balance, misc}) | ||||
| 	} | ||||
| 	slices.SortFunc(items, func(a, b allocItem) bool { | ||||
| 		return a.Addr.Cmp(b.Addr) < 0 | ||||
| 	slices.SortFunc(items, func(a, b allocItem) int { | ||||
| 		return a.Addr.Cmp(b.Addr) | ||||
| 	}) | ||||
| 	return items | ||||
| } | ||||
|  | ||||
| @ -28,6 +28,14 @@ var MainnetBootnodes = []string{ | ||||
| 	"enode://4aeb4ab6c14b23e2c4cfdce879c04b0748a20d8e9b59e25ded2a08143e265c6c25936e74cbc8e641e3312ca288673d91f2f93f8e277de3cfa444ecdaaf982052@157.90.35.166:30303", // bootnode-hetzner-fsn
 | ||||
| } | ||||
| 
 | ||||
| // HoleskyBootnodes are the enode URLs of the P2P bootstrap nodes running on the
 | ||||
| // Holesky test network.
 | ||||
| var HoleskyBootnodes = []string{ | ||||
| 	// EF DevOps
 | ||||
| 	"enode://ac906289e4b7f12df423d654c5a962b6ebe5b3a74cc9e06292a85221f9a64a6f1cfdd6b714ed6dacef51578f92b34c60ee91e9ede9c7f8fadc4d347326d95e2b@146.190.13.128:30303", | ||||
| 	"enode://a3435a0155a3e837c02f5e7f5662a2f1fbc25b48e4dc232016e1c51b544cb5b4510ef633ea3278c0e970fa8ad8141e2d4d0f9f95456c537ff05fdf9b31c15072@178.128.136.233:30303", | ||||
| } | ||||
| 
 | ||||
| // SepoliaBootnodes are the enode URLs of the P2P bootstrap nodes running on the
 | ||||
| // Sepolia test network.
 | ||||
| var SepoliaBootnodes = []string{ | ||||
| @ -88,6 +96,8 @@ func KnownDNSNetwork(genesis common.Hash, protocol string) string { | ||||
| 		net = "goerli" | ||||
| 	case SepoliaGenesisHash: | ||||
| 		net = "sepolia" | ||||
| 	case HoleskyGenesisHash: | ||||
| 		net = "holesky" | ||||
| 	default: | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| @ -26,6 +26,7 @@ import ( | ||||
| // Genesis hashes to enforce below configs on.
 | ||||
| var ( | ||||
| 	MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") | ||||
| 	HoleskyGenesisHash = common.HexToHash("0xff9006519a8ce843ac9c28549d24211420b546e12ce2d170c77a8cca7964f23d") | ||||
| 	SepoliaGenesisHash = common.HexToHash("0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9") | ||||
| 	GoerliGenesisHash  = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") | ||||
| ) | ||||
| @ -58,6 +59,31 @@ var ( | ||||
| 		ShanghaiTime:                  newUint64(1681338455), | ||||
| 		Ethash:                        new(EthashConfig), | ||||
| 	} | ||||
| 	// HoleskyChainConfig contains the chain parameters to run a node on the Holesky test network.
 | ||||
| 	HoleskyChainConfig = &ChainConfig{ | ||||
| 		ChainID:                       big.NewInt(17000), | ||||
| 		HomesteadBlock:                big.NewInt(0), | ||||
| 		DAOForkBlock:                  nil, | ||||
| 		DAOForkSupport:                true, | ||||
| 		EIP150Block:                   big.NewInt(0), | ||||
| 		EIP155Block:                   big.NewInt(0), | ||||
| 		EIP158Block:                   big.NewInt(0), | ||||
| 		ByzantiumBlock:                big.NewInt(0), | ||||
| 		ConstantinopleBlock:           big.NewInt(0), | ||||
| 		PetersburgBlock:               big.NewInt(0), | ||||
| 		IstanbulBlock:                 big.NewInt(0), | ||||
| 		MuirGlacierBlock:              nil, | ||||
| 		BerlinBlock:                   big.NewInt(0), | ||||
| 		LondonBlock:                   big.NewInt(0), | ||||
| 		ArrowGlacierBlock:             nil, | ||||
| 		GrayGlacierBlock:              nil, | ||||
| 		TerminalTotalDifficulty:       big.NewInt(0), | ||||
| 		TerminalTotalDifficultyPassed: true, | ||||
| 		MergeNetsplitBlock:            nil, | ||||
| 		ShanghaiTime:                  newUint64(1694790240), | ||||
| 		CancunTime:                    newUint64(2000000000), | ||||
| 		Ethash:                        new(EthashConfig), | ||||
| 	} | ||||
| 	// SepoliaChainConfig contains the chain parameters to run a node on the Sepolia test network.
 | ||||
| 	SepoliaChainConfig = &ChainConfig{ | ||||
| 		ChainID:                       big.NewInt(11155111), | ||||
| @ -74,6 +100,8 @@ var ( | ||||
| 		MuirGlacierBlock:              big.NewInt(0), | ||||
| 		BerlinBlock:                   big.NewInt(0), | ||||
| 		LondonBlock:                   big.NewInt(0), | ||||
| 		ArrowGlacierBlock:             nil, | ||||
| 		GrayGlacierBlock:              nil, | ||||
| 		TerminalTotalDifficulty:       big.NewInt(17_000_000_000_000_000), | ||||
| 		TerminalTotalDifficultyPassed: true, | ||||
| 		MergeNetsplitBlock:            big.NewInt(1735371), | ||||
| @ -253,6 +281,7 @@ var NetworkNames = map[string]string{ | ||||
| 	MainnetChainConfig.ChainID.String(): "mainnet", | ||||
| 	GoerliChainConfig.ChainID.String():  "goerli", | ||||
| 	SepoliaChainConfig.ChainID.String(): "sepolia", | ||||
| 	HoleskyChainConfig.ChainID.String(): "holesky", | ||||
| } | ||||
| 
 | ||||
| // ChainConfig is the core config which determines the blockchain settings.
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user