From b75153fa957babcf56c9b7ef00a207c39c4c4297 Mon Sep 17 00:00:00 2001 From: corver <29249923+corverroos@users.noreply.github.com> Date: Mon, 9 Dec 2024 07:40:22 +0200 Subject: [PATCH] ci(e2e): support custom genesis upgrade (#2646) Adds the `EphemeralGenesisBinary` field to manifest. This adds support to reset ephemeral networks to start genesis from arbitrary network upgrade. This ensures we can skip old upgrades already performed on protected networks. issue: #2517 --- e2e/app/run.go | 9 +++- e2e/app/setup.go | 10 ++-- e2e/docker/compose.yaml.tmpl | 1 + e2e/docker/docker.go | 44 +++++++++--------- e2e/docker/docker_test.go | 1 + .../TestComposeTemplate_commit.golden | 1 + ...estComposeTemplate_empheral_network.golden | 1 + ...seTemplate_empheral_network_upgrade.golden | 1 + e2e/types/manifest.go | 7 ++- .../TestSetup_127-0-0-1-compose.yaml.golden | 1 + .../TestSetup_127-0-0-2-compose.yaml.golden | 1 + .../TestSetup_127-0-0-4-compose.yaml.golden | 1 + .../TestSetup_127-0-0-5-compose.yaml.golden | 1 + halo/app/upgrades.go | 46 ++++++++++++++----- scripts/halovisor/Dockerfile | 2 +- 15 files changed, 87 insertions(+), 40 deletions(-) diff --git a/e2e/app/run.go b/e2e/app/run.go index 1efc177cc..85b89e04f 100644 --- a/e2e/app/run.go +++ b/e2e/app/run.go @@ -10,6 +10,7 @@ import ( "github.com/omni-network/omni/e2e/netman/pingpong" "github.com/omni-network/omni/e2e/solve" "github.com/omni-network/omni/e2e/types" + haloapp "github.com/omni-network/omni/halo/app" "github.com/omni-network/omni/halo/genutil/evm/predeploys" "github.com/omni-network/omni/lib/contracts" "github.com/omni-network/omni/lib/errors" @@ -403,10 +404,14 @@ func maybeSubmitNetworkUpgrade(ctx context.Context, def Definition) error { height = uint64(def.Manifest.NetworkUpgradeHeight) } - log.Info(ctx, "Planning upgrade", "height", height, "name", latestUpgrade) + upgrade, err := haloapp.NextUpgrade(def.Manifest.EphemeralGenesisBinary) + if err != nil { + return err + } + log.Info(ctx, "Planning upgrade", "height", height, "name", upgrade) tx, err := contract.PlanUpgrade(txOpts, bindings.UpgradePlan{ - Name: latestUpgrade, + Name: upgrade, Height: height, Info: "e2e triggered upgrade", }) diff --git a/e2e/app/setup.go b/e2e/app/setup.go index bd0b37e87..836fd82d9 100644 --- a/e2e/app/setup.go +++ b/e2e/app/setup.go @@ -18,7 +18,7 @@ import ( "github.com/omni-network/omni/e2e/app/static" "github.com/omni-network/omni/e2e/types" "github.com/omni-network/omni/e2e/vmcompose" - uluwatu1 "github.com/omni-network/omni/halo/app/upgrades/uluwatu" + haloapp "github.com/omni-network/omni/halo/app" halocmd "github.com/omni-network/omni/halo/cmd" halocfg "github.com/omni-network/omni/halo/config" "github.com/omni-network/omni/halo/genutil" @@ -50,8 +50,6 @@ const ( PrivvalKeyFile = "config/priv_validator_key.json" PrivvalStateFile = "data/priv_validator_state.json" - - latestUpgrade = uluwatu1.UpgradeName ) // Setup sets up the testnet configuration. @@ -89,9 +87,13 @@ func Setup(ctx context.Context, def Definition, depCfg DeployConfig) error { valPrivKeys = append(valPrivKeys, val.PrivvalKey) } + // Network upgrade to include in genesis (applied at height=1) var upgrade string if def.Manifest.NetworkUpgradeHeight == 0 { - upgrade = latestUpgrade // Genesis upgrade. + upgrade, err = haloapp.NextUpgrade(def.Manifest.EphemeralGenesisBinary) + if err != nil { + return err + } } cosmosGenesis, err := genutil.MakeGenesis( diff --git a/e2e/docker/compose.yaml.tmpl b/e2e/docker/compose.yaml.tmpl index b70e19ef7..848dabbb4 100644 --- a/e2e/docker/compose.yaml.tmpl +++ b/e2e/docker/compose.yaml.tmpl @@ -31,6 +31,7 @@ services: - 6060 # Pprof volumes: - ./{{ .Name }}:/halo + environment: [{{ if $.EphemeralGenesisBinary}}COSMOVISOR_CUSTOM_GENESIS={{$.EphemeralGenesisBinary}}{{ end }}] logging: driver: local networks: diff --git a/e2e/docker/docker.go b/e2e/docker/docker.go index cdb5cf393..b9e7915c4 100644 --- a/e2e/docker/docker.go +++ b/e2e/docker/docker.go @@ -87,20 +87,21 @@ func (p *Provider) Setup() error { } def := ComposeDef{ - Network: true, - NetworkName: p.testnet.Name, - NetworkCIDR: p.testnet.IP.String(), - BindAll: false, - UpgradeVersion: p.testnet.UpgradeVersion, - Nodes: p.testnet.Nodes, - OmniEVMs: p.testnet.OmniEVMs, - Anvils: p.testnet.AnvilChains, - Relayer: true, - Prometheus: p.testnet.Prometheus, - Monitor: true, - Solver: true, - GethVerbosity: 3, // Info - GethInitTags: gethInitTags, + Network: true, + NetworkName: p.testnet.Name, + NetworkCIDR: p.testnet.IP.String(), + BindAll: false, + UpgradeVersion: p.testnet.UpgradeVersion, + Nodes: p.testnet.Nodes, + OmniEVMs: p.testnet.OmniEVMs, + Anvils: p.testnet.AnvilChains, + Relayer: true, + Prometheus: p.testnet.Prometheus, + Monitor: true, + Solver: true, + GethVerbosity: 3, // Info + GethInitTags: gethInitTags, + EphemeralGenesisBinary: p.testnet.Manifest.EphemeralGenesisBinary, } def = SetImageTags(def, p.testnet.Manifest, p.omniTag) @@ -180,13 +181,14 @@ func (p *Provider) StartNodes(ctx context.Context, nodes ...*e2e.Node) error { } type ComposeDef struct { - Network bool - NetworkName string - NetworkCIDR string - BindAll bool - UpgradeVersion string // Halo target upgrade version - GethVerbosity int // Geth log level (1=error,2=warn,3=info(default),4=debug,5=trace) - GethInitTags map[int]string // Optional geth initial tags. Defaults to latest if empty. + Network bool + NetworkName string + NetworkCIDR string + BindAll bool + UpgradeVersion string // Halo target upgrade version + GethVerbosity int // Geth log level (1=error,2=warn,3=info(default),4=debug,5=trace) + GethInitTags map[int]string // Optional geth initial tags. Defaults to latest if empty. + EphemeralGenesisBinary string // Optional network upgrade to use from genesis Nodes []*e2e.Node OmniEVMs []types.OmniEVM diff --git a/e2e/docker/docker_test.go b/e2e/docker/docker_test.go index 5acf06d53..a2073dc3b 100644 --- a/e2e/docker/docker_test.go +++ b/e2e/docker/docker_test.go @@ -113,6 +113,7 @@ func TestComposeTemplate(t *testing.T) { // If the network is empheral, we use the devnet configuration. if test.isEmpheral { testnet.Network = netconf.Devnet + testnet.Manifest.EphemeralGenesisBinary = "ephemeral_upgrade_99" } if test.upgrade != "" { diff --git a/e2e/docker/testdata/TestComposeTemplate_commit.golden b/e2e/docker/testdata/TestComposeTemplate_commit.golden index 6d8b34b20..0a6931e21 100644 --- a/e2e/docker/testdata/TestComposeTemplate_commit.golden +++ b/e2e/docker/testdata/TestComposeTemplate_commit.golden @@ -25,6 +25,7 @@ services: - 6060 # Pprof volumes: - ./node0:/halo + environment: [] logging: driver: local networks: diff --git a/e2e/docker/testdata/TestComposeTemplate_empheral_network.golden b/e2e/docker/testdata/TestComposeTemplate_empheral_network.golden index 7915d725a..9e08420d8 100644 --- a/e2e/docker/testdata/TestComposeTemplate_empheral_network.golden +++ b/e2e/docker/testdata/TestComposeTemplate_empheral_network.golden @@ -25,6 +25,7 @@ services: - 6060 # Pprof volumes: - ./node0:/halo + environment: [COSMOVISOR_CUSTOM_GENESIS=ephemeral_upgrade_99] logging: driver: local networks: diff --git a/e2e/docker/testdata/TestComposeTemplate_empheral_network_upgrade.golden b/e2e/docker/testdata/TestComposeTemplate_empheral_network_upgrade.golden index 643c40d69..e0b305b02 100644 --- a/e2e/docker/testdata/TestComposeTemplate_empheral_network_upgrade.golden +++ b/e2e/docker/testdata/TestComposeTemplate_empheral_network_upgrade.golden @@ -25,6 +25,7 @@ services: - 6060 # Pprof volumes: - ./node0:/halo + environment: [COSMOVISOR_CUSTOM_GENESIS=ephemeral_upgrade_99] logging: driver: local networks: diff --git a/e2e/types/manifest.go b/e2e/types/manifest.go index c1debdb57..83901102b 100644 --- a/e2e/types/manifest.go +++ b/e2e/types/manifest.go @@ -121,10 +121,15 @@ type Manifest struct { // This overrides the --omni-image-tag if non-empty. PinnedRelayerTag string `toml:"pinned_relayer_tag"` - // NetworkUpgradeHeight defines the network upgrade height, default is genesis, negative is disabled. + // NetworkUpgradeHeight defines the network upgrade height, default=0, negative is disabled. // Note that it might be scheduled at a later height. NetworkUpgradeHeight int64 `toml:"network_upgrade_height"` + // EphemeralGenesisBinary defines halovisor binary (network upgrade) to use from genesis onwards. + // The subsequent network upgrade will be planned at NetworkUpgradeHeight. + // This is only applicable to ephemeral networks. + EphemeralGenesisBinary string `toml:"ephemeral_genesis_binary"` + // FeatureFlags defines the feature flags to enable. FeatureFlags feature.Flags `toml:"feature_flags"` } diff --git a/e2e/vmcompose/testdata/TestSetup_127-0-0-1-compose.yaml.golden b/e2e/vmcompose/testdata/TestSetup_127-0-0-1-compose.yaml.golden index 5b9291b7f..d5ad1361e 100644 --- a/e2e/vmcompose/testdata/TestSetup_127-0-0-1-compose.yaml.golden +++ b/e2e/vmcompose/testdata/TestSetup_127-0-0-1-compose.yaml.golden @@ -21,6 +21,7 @@ services: - 6060 # Pprof volumes: - ./validator01:/halo + environment: [] logging: driver: local networks: diff --git a/e2e/vmcompose/testdata/TestSetup_127-0-0-2-compose.yaml.golden b/e2e/vmcompose/testdata/TestSetup_127-0-0-2-compose.yaml.golden index d1aa352cc..28b72737a 100644 --- a/e2e/vmcompose/testdata/TestSetup_127-0-0-2-compose.yaml.golden +++ b/e2e/vmcompose/testdata/TestSetup_127-0-0-2-compose.yaml.golden @@ -21,6 +21,7 @@ services: - 6060 # Pprof volumes: - ./validator02:/halo + environment: [] logging: driver: local networks: diff --git a/e2e/vmcompose/testdata/TestSetup_127-0-0-4-compose.yaml.golden b/e2e/vmcompose/testdata/TestSetup_127-0-0-4-compose.yaml.golden index 34d66c5d4..4b7bcbb04 100644 --- a/e2e/vmcompose/testdata/TestSetup_127-0-0-4-compose.yaml.golden +++ b/e2e/vmcompose/testdata/TestSetup_127-0-0-4-compose.yaml.golden @@ -21,6 +21,7 @@ services: - 6060 # Pprof volumes: - ./seed01:/halo + environment: [] logging: driver: local networks: diff --git a/e2e/vmcompose/testdata/TestSetup_127-0-0-5-compose.yaml.golden b/e2e/vmcompose/testdata/TestSetup_127-0-0-5-compose.yaml.golden index b7533b475..1df534b48 100644 --- a/e2e/vmcompose/testdata/TestSetup_127-0-0-5-compose.yaml.golden +++ b/e2e/vmcompose/testdata/TestSetup_127-0-0-5-compose.yaml.golden @@ -21,6 +21,7 @@ services: - 6060 # Pprof volumes: - ./fullnode01:/halo + environment: [] logging: driver: local networks: diff --git a/halo/app/upgrades.go b/halo/app/upgrades.go index b17012b3f..49e3964a5 100644 --- a/halo/app/upgrades.go +++ b/halo/app/upgrades.go @@ -8,21 +8,45 @@ import ( upgradetypes "cosmossdk.io/x/upgrade/types" ) -func (a App) setUpgradeHandlers() error { - upgrades := []struct { - Name string - Handler upgradetypes.UpgradeHandler - Store storetypes.StoreUpgrades - }{ - { - Name: uluwatu1.UpgradeName, - Handler: uluwatu1.CreateUpgradeHandler(a.ModuleManager, a.Configurator(), a.SlashingKeeper), - Store: uluwatu1.StoreUpgrades, +// Upgrade defines a network upgrade. +type Upgrade struct { + Name string + HandlerFunc func(App) upgradetypes.UpgradeHandler + Store storetypes.StoreUpgrades +} + +var upgrades = []Upgrade{ + { + Name: uluwatu1.UpgradeName, + HandlerFunc: func(a App) upgradetypes.UpgradeHandler { + return uluwatu1.CreateUpgradeHandler(a.ModuleManager, a.Configurator(), a.SlashingKeeper) }, + Store: uluwatu1.StoreUpgrades, + }, +} + +// NextUpgrade returns the next upgrade name after the provided previous upgrade.. +func NextUpgrade(prev string) (string, error) { + if prev == "" { // Return the first upgrade + return upgrades[0].Name, nil } + for i, u := range upgrades { + if i == len(upgrades)-1 { + break + } + + if u.Name == prev { + return upgrades[i+1].Name, nil + } + } + + return "", errors.New("prev upgrade not found [BUG]") +} + +func (a App) setUpgradeHandlers() error { for _, u := range upgrades { - a.UpgradeKeeper.SetUpgradeHandler(u.Name, u.Handler) + a.UpgradeKeeper.SetUpgradeHandler(u.Name, u.HandlerFunc(a)) } upgradeInfo, err := a.UpgradeKeeper.ReadUpgradeInfoFromDisk() diff --git a/scripts/halovisor/Dockerfile b/scripts/halovisor/Dockerfile index dd88a8695..4423c5780 100644 --- a/scripts/halovisor/Dockerfile +++ b/scripts/halovisor/Dockerfile @@ -1,5 +1,5 @@ # Docker build args -ARG OMNI_COSMOVISOR_VERSION=v0.4.0 +ARG OMNI_COSMOVISOR_VERSION=v0.5.0 ARG HALO_VERSION_0_GENESIS=v0.8.1 ARG HALO_VERSION_1_ULUWATU=main