diff --git a/WORKSPACE b/WORKSPACE index 0e97fd7d5e..eea45bd2f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -386,6 +386,22 @@ filegroup( url = "https://github.com/eth-clients/sepolia/archive/f2c219a93c4491cee3d90c18f2f8e82aed850eab.tar.gz", # 2024-09-19 ) +http_archive( + name = "hoodi_testnet", + build_file_content = """ +filegroup( + name = "configs", + srcs = [ + "metadata/config.yaml", + ], + visibility = ["//visibility:public"], +) +""", + integrity = "sha256-o51qGunwjDib2kxxdQfjbyHGdpTVQCd4ff2KE30IToc=", + strip_prefix = "hoodi-db5bfa8c65caeef23afa225797167e956477a3ee", + url = "https://github.com/eth-clients/hoodi/archive/db5bfa8c65caeef23afa225797167e956477a3ee.tar.gz", +) + http_archive( name = "com_google_protobuf", sha256 = "9bd87b8280ef720d3240514f884e56a712f2218f0d693b48050c836028940a42", diff --git a/changelog/tt_hoodi.md b/changelog/tt_hoodi.md new file mode 100644 index 0000000000..2aedb18db6 --- /dev/null +++ b/changelog/tt_hoodi.md @@ -0,0 +1,3 @@ +### Added + +- Add Hoodi testnet flag `--hoodi` to specify Hoodi testnet config and bootnodes. \ No newline at end of file diff --git a/cmd/prysmctl/p2p/request_blocks.go b/cmd/prysmctl/p2p/request_blocks.go index de14d33fac..1f5ef382dd 100644 --- a/cmd/prysmctl/p2p/request_blocks.go +++ b/cmd/prysmctl/p2p/request_blocks.go @@ -106,6 +106,10 @@ func cliActionRequestBlocks(cliCtx *cli.Context) error { if err := params.SetActive(params.HoleskyConfig()); err != nil { log.Fatal(err) } + case params.HoodiName: + if err := params.SetActive(params.HoodiConfig()); err != nil { + log.Fatal(err) + } case params.MainnetName: // Do nothing default: diff --git a/cmd/prysmctl/validator/cmd.go b/cmd/prysmctl/validator/cmd.go index fa25ca70df..7828087144 100644 --- a/cmd/prysmctl/validator/cmd.go +++ b/cmd/prysmctl/validator/cmd.go @@ -169,6 +169,7 @@ var Commands = []*cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, cmd.AcceptTosFlag, }), Before: func(cliCtx *cli.Context) error { diff --git a/cmd/validator/accounts/accounts.go b/cmd/validator/accounts/accounts.go index 16adf06d6c..4cc7485893 100644 --- a/cmd/validator/accounts/accounts.go +++ b/cmd/validator/accounts/accounts.go @@ -29,6 +29,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, cmd.AcceptTosFlag, }), Before: func(cliCtx *cli.Context) error { @@ -64,6 +65,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, cmd.AcceptTosFlag, }), Before: func(cliCtx *cli.Context) error { @@ -97,6 +99,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, cmd.AcceptTosFlag, }), Before: func(cliCtx *cli.Context) error { @@ -127,6 +130,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, cmd.AcceptTosFlag, }), Before: func(cliCtx *cli.Context) error { @@ -169,6 +173,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, cmd.AcceptTosFlag, }), Before: func(cliCtx *cli.Context) error { diff --git a/cmd/validator/slashing-protection/slashing-protection.go b/cmd/validator/slashing-protection/slashing-protection.go index 6bc5fb0356..033c01965c 100644 --- a/cmd/validator/slashing-protection/slashing-protection.go +++ b/cmd/validator/slashing-protection/slashing-protection.go @@ -24,6 +24,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, features.EnableMinimalSlashingProtection, cmd.AcceptTosFlag, }), @@ -52,6 +53,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, features.EnableMinimalSlashingProtection, cmd.AcceptTosFlag, }), diff --git a/cmd/validator/wallet/wallet.go b/cmd/validator/wallet/wallet.go index 007a37f48a..b09195215d 100644 --- a/cmd/validator/wallet/wallet.go +++ b/cmd/validator/wallet/wallet.go @@ -33,6 +33,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, cmd.AcceptTosFlag, }), Before: func(cliCtx *cli.Context) error { @@ -64,6 +65,7 @@ var Commands = &cli.Command{ features.Mainnet, features.SepoliaTestnet, features.HoleskyTestnet, + features.HoodiTestnet, cmd.AcceptTosFlag, }), Before: func(cliCtx *cli.Context) error { diff --git a/config/features/config.go b/config/features/config.go index 1854809b58..d2e5885058 100644 --- a/config/features/config.go +++ b/config/features/config.go @@ -144,6 +144,12 @@ func configureTestnet(ctx *cli.Context) error { } applyHoleskyFeatureFlags(ctx) params.UseHoleskyNetworkConfig() + } else if ctx.Bool(HoodiTestnet.Name) { + log.Info("Running on the Hoodi Beacon Chain Testnet") + if err := params.SetActive(params.HoodiConfig().Copy()); err != nil { + return err + } + params.UseHoodiNetworkConfig() } else { if ctx.IsSet(cmd.ChainConfigFileFlag.Name) { log.Warn("Running on custom Ethereum network specified in a chain configuration yaml file") diff --git a/config/features/flags.go b/config/features/flags.go index 34d7b903e6..d4ff30a31a 100644 --- a/config/features/flags.go +++ b/config/features/flags.go @@ -18,6 +18,11 @@ var ( Name: "holesky", Usage: "Runs Prysm configured for the Holesky test network.", } + // HoodiTestnet flag for ethereum testnet. + HoodiTestnet = &cli.BoolFlag{ + Name: "hoodi", + Usage: "Runs Prysm configured for the Hoodi test network.", + } // Mainnet flag for easier tooling, no-op Mainnet = &cli.BoolFlag{ Value: true, @@ -192,6 +197,7 @@ var ValidatorFlags = append(deprecatedFlags, []cli.Flag{ writeWalletPasswordOnWebOnboarding, HoleskyTestnet, SepoliaTestnet, + HoodiTestnet, Mainnet, dynamicKeyReloadDebounceInterval, attestTimely, @@ -216,6 +222,7 @@ var BeaconChainFlags = combinedFlags([]cli.Flag{ disableGRPCConnectionLogging, HoleskyTestnet, SepoliaTestnet, + HoodiTestnet, Mainnet, disablePeerScorer, disableBroadcastSlashingFlag, @@ -260,4 +267,5 @@ var NetworkFlags = []cli.Flag{ Mainnet, SepoliaTestnet, HoleskyTestnet, + HoodiTestnet, } diff --git a/config/params/BUILD.bazel b/config/params/BUILD.bazel index b6cf387580..5114307ac1 100644 --- a/config/params/BUILD.bazel +++ b/config/params/BUILD.bazel @@ -16,6 +16,7 @@ go_library( "network_config.go", "testnet_e2e_config.go", "testnet_holesky_config.go", + "testnet_hoodi_config.go", "testnet_sepolia_config.go", "testutils.go", "testutils_develop.go", # keep @@ -49,6 +50,7 @@ go_test( "mainnet_config_test.go", "testnet_config_test.go", "testnet_holesky_config_test.go", + "testnet_hoodi_config_test.go", "testnet_sepolia_config_test.go", ], data = glob(["*.yaml"]) + [ @@ -58,6 +60,7 @@ go_test( "@consensus_spec_tests_minimal//:test_data", "@eth2_networks//:configs", "@holesky_testnet//:configs", + "@hoodi_testnet//:configs", "@sepolia_testnet//:configs", ], embed = [":go_default_library"], diff --git a/config/params/init.go b/config/params/init.go index fd2263b376..c9dcafbd8b 100644 --- a/config/params/init.go +++ b/config/params/init.go @@ -9,6 +9,7 @@ func init() { InteropConfig(), HoleskyConfig(), SepoliaConfig(), + HoodiConfig(), } configs = newConfigset(defaults...) // ensure that main net is always present and active by default diff --git a/config/params/testnet_hoodi_config.go b/config/params/testnet_hoodi_config.go new file mode 100644 index 0000000000..ec6c639db9 --- /dev/null +++ b/config/params/testnet_hoodi_config.go @@ -0,0 +1,55 @@ +package params + +import ( + "math" +) + +// UseHoodiNetworkConfig uses the Hoodi beacon chain specific network config. +func UseHoodiNetworkConfig() { + cfg := BeaconNetworkConfig().Copy() + cfg.ContractDeploymentBlock = 0 + cfg.BootstrapNodes = []string{ + "enr:-Mq4QLkmuSwbGBUph1r7iHopzRpdqE-gcm5LNZfcE-6T37OCZbRHi22bXZkaqnZ6XdIyEDTelnkmMEQB8w6NbnJUt9GGAZWaowaYh2F0dG5ldHOIABgAAAAAAACEZXRoMpDS8Zl_YAAJEAAIAAAAAAAAgmlkgnY0gmlwhNEmfKCEcXVpY4IyyIlzZWNwMjU2azGhA0hGa4jZJZYQAS-z6ZFK-m4GCFnWS8wfjO0bpSQn6hyEiHN5bmNuZXRzAIN0Y3CCIyiDdWRwgiMo", + "enr:-Ku4QLVumWTwyOUVS4ajqq8ZuZz2ik6t3Gtq0Ozxqecj0qNZWpMnudcvTs-4jrlwYRQMQwBS8Pvtmu4ZPP2Lx3i2t7YBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpBd9cEGEAAJEP__________gmlkgnY0gmlwhNEmfKCJc2VjcDI1NmsxoQLdRlI8aCa_ELwTJhVN8k7km7IDc3pYu-FMYBs5_FiigIN1ZHCCIyk", + "enr:-LK4QAYuLujoiaqCAs0-qNWj9oFws1B4iy-Hff1bRB7wpQCYSS-IIMxLWCn7sWloTJzC1SiH8Y7lMQ5I36ynGV1ASj4Eh2F0dG5ldHOIYAAAAAAAAACEZXRoMpDS8Zl_YAAJEAAIAAAAAAAAgmlkgnY0gmlwhIbRilSJc2VjcDI1NmsxoQOmI5MlAu3f5WEThAYOqoygpS2wYn0XS5NV2aYq7T0a04N0Y3CCIyiDdWRwgiMo", + "enr:-Ku4QNkWjw5tNzo8DtWqKm7CnDdIq_y7xppD6c1EZSwjB8rMOkSFA1wJPLoKrq5UvA7wcxIotH6Usx3PAugEN2JMncIBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpBd9cEGEAAJEP__________gmlkgnY0gmlwhIbHuBeJc2VjcDI1NmsxoQP3FwrhFYB60djwRjAoOjttq6du94DtkQuaN99wvgqaIYN1ZHCCIyk", + "enr:-Ku4QIC89sMC0o-irosD4_23lJJ4qCGOvdUz7SmoShWx0k6AaxCFTKviEHa-sa7-EzsiXpDp0qP0xzX6nKdXJX3X-IQBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpBd9cEGEAAJEP__________gmlkgnY0gmlwhIbRilSJc2VjcDI1NmsxoQK_m0f1DzDc9Cjrspm36zuRa7072HSiMGYWLsKiVSbP34N1ZHCCIyk", + "enr:-OS4QMJGE13xEROqvKN1xnnt7U-noc51VXyM6wFMuL9LMhQDfo1p1dF_zFdS4OsnXz_vIYk-nQWnqJMWRDKvkSK6_CwDh2F0dG5ldHOIAAAAADAAAACGY2xpZW502IpMaWdodGhvdXNljDcuMC4wLWJldGEuM4RldGgykNLxmX9gAAkQAAgAAAAAAACCaWSCdjSCaXCEhse4F4RxdWljgiMqiXNlY3AyNTZrMaECef77P8k5l3PC_raLw42OAzdXfxeQ-58BJriNaqiRGJSIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg", + } + OverrideBeaconNetworkConfig(cfg) +} + +// HoodiConfig defines the config for the Hoodi beacon chain testnet. +func HoodiConfig() *BeaconChainConfig { + cfg := MainnetConfig().Copy() + cfg.MinGenesisTime = 1742212800 + cfg.GenesisDelay = 600 + cfg.ConfigName = HoodiName + cfg.GenesisValidatorsRoot = [32]byte{ + 0x21, 0x2f, 0x13, 0xfc, 0x4d, 0xf0, 0x78, 0xb6, + 0xcb, 0x7d, 0xb2, 0x28, 0xf1, 0xc8, 0x30, 0x75, + 0x66, 0xdc, 0xec, 0xf9, 0x00, 0x86, 0x74, 0x01, + 0xa9, 0x20, 0x23, 0xd7, 0xba, 0x99, 0xcb, 0x5f, + } + cfg.GenesisForkVersion = []byte{0x10, 0x00, 0x09, 0x10} + cfg.SecondsPerETH1Block = 12 + cfg.DepositChainID = 560048 + cfg.DepositNetworkID = 560048 + cfg.AltairForkEpoch = 0 + cfg.AltairForkVersion = []byte{0x20, 0x00, 0x09, 0x10} + cfg.BellatrixForkEpoch = 0 + cfg.BellatrixForkVersion = []byte{0x30, 0x00, 0x09, 0x10} + cfg.CapellaForkEpoch = 0 + cfg.CapellaForkVersion = []byte{0x40, 0x00, 0x09, 0x10} + cfg.DenebForkEpoch = 0 + cfg.DenebForkVersion = []byte{0x50, 0x00, 0x09, 0x10} + cfg.ElectraForkEpoch = 2048 + cfg.ElectraForkVersion = []byte{0x60, 0x00, 0x09, 0x10} + cfg.FuluForkEpoch = math.MaxUint64 + cfg.FuluForkVersion = []byte{0x70, 0x00, 0x09, 0x10} + cfg.TerminalTotalDifficulty = "0" + cfg.DepositContractAddress = "0x00000000219ab540356cBB839Cbe05303d7705Fa" + cfg.MinGenesisActiveValidatorCount = 1000000 + cfg.InitializeForkSchedule() + return cfg +} diff --git a/config/params/testnet_hoodi_config_test.go b/config/params/testnet_hoodi_config_test.go new file mode 100644 index 0000000000..5fb48f432b --- /dev/null +++ b/config/params/testnet_hoodi_config_test.go @@ -0,0 +1,28 @@ +package params_test + +import ( + "path" + "testing" + + "github.com/bazelbuild/rules_go/go/tools/bazel" + "github.com/prysmaticlabs/prysm/v5/config/params" + "github.com/prysmaticlabs/prysm/v5/testing/require" +) + +func TestHoodiConfigMatchesUpstreamYaml(t *testing.T) { + presetFPs := presetsFilePath(t, "mainnet") + mn, err := params.ByName(params.MainnetName) + require.NoError(t, err) + cfg := mn.Copy() + for _, fp := range presetFPs { + cfg, err = params.UnmarshalConfigFile(fp, cfg) + require.NoError(t, err) + } + fPath, err := bazel.Runfile("external/hoodi_testnet") + require.NoError(t, err) + configFP := path.Join(fPath, "metadata", "config.yaml") + pcfg, err := params.UnmarshalConfigFile(configFP, nil) + require.NoError(t, err) + fields := fieldsFromYamls(t, append(presetFPs, configFP)) + assertYamlFieldsMatch(t, "hoodi", fields, pcfg, params.HoodiConfig()) +} diff --git a/config/params/values.go b/config/params/values.go index 36eda3db7b..b94f3ec7e9 100644 --- a/config/params/values.go +++ b/config/params/values.go @@ -10,4 +10,5 @@ const ( MinimalName = "minimal" SepoliaName = "sepolia" HoleskyName = "holesky" + HoodiName = "hoodi" ) diff --git a/tools/pcli/main.go b/tools/pcli/main.go index 810748af56..2f3b3ffe15 100644 --- a/tools/pcli/main.go +++ b/tools/pcli/main.go @@ -217,6 +217,10 @@ var stateTransitionCommand = &cli.Command{ if err := params.SetActive(params.HoleskyConfig()); err != nil { log.Fatal(err) } + case params.HoodiName: + if err := params.SetActive(params.HoodiConfig()); err != nil { + log.Fatal(err) + } default: log.Fatalf("Unknown network provided: %s", network) }