mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 03:27:26 +00:00 
			
		
		
		
	Add upgrade handler for Kava v0.26.0 (#1827)
* Add upgrade handler for Kava v0.26.0 * Update tests e2e to run upgrade tests
This commit is contained in:
		
							parent
							
								
									5914f1db85
								
							
						
					
					
						commit
						ad387e6a42
					
				
							
								
								
									
										123
									
								
								app/upgrades.go
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								app/upgrades.go
									
									
									
									
									
								
							@ -1,3 +1,124 @@
 | 
			
		||||
package app
 | 
			
		||||
 | 
			
		||||
func (app App) RegisterUpgradeHandlers() {}
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/baseapp"
 | 
			
		||||
	storetypes "github.com/cosmos/cosmos-sdk/store/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/types/module"
 | 
			
		||||
	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
			
		||||
	consensustypes "github.com/cosmos/cosmos-sdk/x/consensus/types"
 | 
			
		||||
	crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types"
 | 
			
		||||
	distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
 | 
			
		||||
	govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
 | 
			
		||||
	govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
 | 
			
		||||
	minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
 | 
			
		||||
	paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
 | 
			
		||||
	slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
 | 
			
		||||
	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
 | 
			
		||||
	upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
 | 
			
		||||
	ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
 | 
			
		||||
	ibctmmigrations "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint/migrations"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	UpgradeName_Mainnet = "v0.26.0"
 | 
			
		||||
	UpgradeName_Testnet = "v0.26.0-alpha.0"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RegisterUpgradeHandlers registers the upgrade handlers for the app.
 | 
			
		||||
func (app App) RegisterUpgradeHandlers() {
 | 
			
		||||
	app.upgradeKeeper.SetUpgradeHandler(
 | 
			
		||||
		UpgradeName_Mainnet,
 | 
			
		||||
		upgradeHandler(app, UpgradeName_Mainnet),
 | 
			
		||||
	)
 | 
			
		||||
	app.upgradeKeeper.SetUpgradeHandler(
 | 
			
		||||
		UpgradeName_Testnet,
 | 
			
		||||
		upgradeHandler(app, UpgradeName_Testnet),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	upgradeInfo, err := app.upgradeKeeper.ReadUpgradeInfoFromDisk()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	doUpgrade := upgradeInfo.Name == UpgradeName_Mainnet ||
 | 
			
		||||
		upgradeInfo.Name == UpgradeName_Testnet
 | 
			
		||||
 | 
			
		||||
	if doUpgrade && !app.upgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
 | 
			
		||||
		storeUpgrades := storetypes.StoreUpgrades{
 | 
			
		||||
			Added: []string{
 | 
			
		||||
				crisistypes.ModuleName,
 | 
			
		||||
				consensustypes.ModuleName,
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// configure store loader that checks if version == upgradeHeight and applies store upgrades
 | 
			
		||||
		app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// upgradeHandler returns an UpgradeHandler for the given upgrade parameters.
 | 
			
		||||
func upgradeHandler(
 | 
			
		||||
	app App,
 | 
			
		||||
	name string,
 | 
			
		||||
) upgradetypes.UpgradeHandler {
 | 
			
		||||
	return func(
 | 
			
		||||
		ctx sdk.Context,
 | 
			
		||||
		plan upgradetypes.Plan,
 | 
			
		||||
		fromVM module.VersionMap,
 | 
			
		||||
	) (module.VersionMap, error) {
 | 
			
		||||
		app.Logger().Info(fmt.Sprintf("running %s upgrade handler", name))
 | 
			
		||||
 | 
			
		||||
		baseAppLegacySS := app.paramsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())
 | 
			
		||||
 | 
			
		||||
		// Set param key table for params module migration
 | 
			
		||||
		for _, subspace := range app.paramsKeeper.GetSubspaces() {
 | 
			
		||||
			subspace := subspace
 | 
			
		||||
			var keyTable paramstypes.KeyTable
 | 
			
		||||
			switch subspace.Name() {
 | 
			
		||||
			// sdk
 | 
			
		||||
			case authtypes.ModuleName:
 | 
			
		||||
				keyTable = authtypes.ParamKeyTable() //nolint:staticcheck
 | 
			
		||||
			case banktypes.ModuleName:
 | 
			
		||||
				keyTable = banktypes.ParamKeyTable() //nolint:staticcheck,nolintlint
 | 
			
		||||
			case stakingtypes.ModuleName:
 | 
			
		||||
				keyTable = stakingtypes.ParamKeyTable()
 | 
			
		||||
			case minttypes.ModuleName:
 | 
			
		||||
				keyTable = minttypes.ParamKeyTable() //nolint:staticcheck
 | 
			
		||||
			case distrtypes.ModuleName:
 | 
			
		||||
				keyTable = distrtypes.ParamKeyTable() //nolint:staticcheck,nolintlint
 | 
			
		||||
			case slashingtypes.ModuleName:
 | 
			
		||||
				keyTable = slashingtypes.ParamKeyTable() //nolint:staticcheck
 | 
			
		||||
			case govtypes.ModuleName:
 | 
			
		||||
				keyTable = govv1.ParamKeyTable() //nolint:staticcheck
 | 
			
		||||
			case crisistypes.ModuleName:
 | 
			
		||||
				keyTable = crisistypes.ParamKeyTable() //nolint:staticcheck
 | 
			
		||||
 | 
			
		||||
			// ibc
 | 
			
		||||
			case ibctransfertypes.ModuleName:
 | 
			
		||||
				keyTable = ibctransfertypes.ParamKeyTable() //nolint:staticcheck
 | 
			
		||||
 | 
			
		||||
			default:
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if !subspace.HasKeyTable() {
 | 
			
		||||
				subspace.WithKeyTable(keyTable)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// optional migration: prune expired tendermint consensus states to save storage space
 | 
			
		||||
		// see https://github.com/cosmos/ibc-go/blob/v7.2.0/docs/migrations/v6-to-v7.md#chains
 | 
			
		||||
		if _, err := ibctmmigrations.PruneExpiredConsensusStates(ctx, app.appCodec, app.ibcKeeper.ClientKeeper); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// migrate tendermint consensus parameters from x/params module to a
 | 
			
		||||
		// dedicated x/consensus module.
 | 
			
		||||
		baseapp.MigrateParams(ctx, baseAppLegacySS, &app.consensusParamsKeeper)
 | 
			
		||||
 | 
			
		||||
		return app.mm.RunMigrations(ctx, app.configurator, fromVM)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ E2E_RUN_KVTOOL_NETWORKS=true
 | 
			
		||||
 | 
			
		||||
# E2E_KVTOOL_KAVA_CONFIG_TEMPLATE is the kvtool template used to start the chain. See the `kava.configTemplate` flag in kvtool.
 | 
			
		||||
# Note that the config tempalte must support overriding the docker image tag via the KAVA_TAG variable.
 | 
			
		||||
E2E_KVTOOL_KAVA_CONFIG_TEMPLATE="v0.26"
 | 
			
		||||
E2E_KVTOOL_KAVA_CONFIG_TEMPLATE="v0.25"
 | 
			
		||||
 | 
			
		||||
# E2E_INCLUDE_IBC_TESTS when true will start a 2nd chain & open an IBC channel. It will enable all IBC tests.
 | 
			
		||||
E2E_INCLUDE_IBC_TESTS=true
 | 
			
		||||
@ -19,14 +19,14 @@ E2E_SKIP_SHUTDOWN=false
 | 
			
		||||
 | 
			
		||||
# The following variables should be defined to run an upgrade.
 | 
			
		||||
# E2E_INCLUDE_AUTOMATED_UPGRADE when true enables the automated upgrade & corresponding tests in the suite.
 | 
			
		||||
E2E_INCLUDE_AUTOMATED_UPGRADE=false
 | 
			
		||||
E2E_INCLUDE_AUTOMATED_UPGRADE=true
 | 
			
		||||
# E2E_KAVA_UPGRADE_NAME is the name of the upgrade that must be in the current local image.
 | 
			
		||||
E2E_KAVA_UPGRADE_NAME=
 | 
			
		||||
E2E_KAVA_UPGRADE_NAME=v0.26.0
 | 
			
		||||
# E2E_KAVA_UPGRADE_HEIGHT is the height at which the upgrade will be applied.
 | 
			
		||||
# If IBC tests are enabled this should be >30. Otherwise, this should be >10.
 | 
			
		||||
E2E_KAVA_UPGRADE_HEIGHT=
 | 
			
		||||
E2E_KAVA_UPGRADE_HEIGHT=35
 | 
			
		||||
# E2E_KAVA_UPGRADE_BASE_IMAGE_TAG is the tag of the docker image the chain should upgrade from.
 | 
			
		||||
E2E_KAVA_UPGRADE_BASE_IMAGE_TAG=
 | 
			
		||||
E2E_KAVA_UPGRADE_BASE_IMAGE_TAG=v0.25.1-goleveldb
 | 
			
		||||
 | 
			
		||||
# E2E_KAVA_ERC20_ADDRESS is the address of a pre-deployed ERC20 token with the following properties:
 | 
			
		||||
# - the E2E_KAVA_FUNDED_ACCOUNT_MNEMONIC has nonzero balance
 | 
			
		||||
 | 
			
		||||
@ -1,18 +1,107 @@
 | 
			
		||||
package e2e_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
 | 
			
		||||
	tmtypes "github.com/cometbft/cometbft/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	consensustypes "github.com/cosmos/cosmos-sdk/x/consensus/types"
 | 
			
		||||
	govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TestUpgradeHandler can be used to run tests post-upgrade. If an upgrade is enabled, all tests
 | 
			
		||||
// are run against the upgraded chain. However, this file is a good place to consolidate all
 | 
			
		||||
// acceptance tests for a given set of upgrade handlers.
 | 
			
		||||
func (suite *IntegrationTestSuite) TestUpgradeHandler() {
 | 
			
		||||
func (suite *IntegrationTestSuite) TestUpgradeParams_SDK() {
 | 
			
		||||
	suite.SkipIfUpgradeDisabled()
 | 
			
		||||
	fmt.Println("An upgrade has run!")
 | 
			
		||||
	suite.True(true)
 | 
			
		||||
 | 
			
		||||
	// Uncomment & use these contexts to compare chain state before & after the upgrade occurs.
 | 
			
		||||
	// beforeUpgradeCtx := suite.Kava.Grpc.CtxAtHeight(suite.UpgradeHeight - 1)
 | 
			
		||||
	// afterUpgradeCtx := suite.Kava.Grpc.CtxAtHeight(suite.UpgradeHeight)
 | 
			
		||||
	beforeUpgradeCtx := suite.Kava.Grpc.CtxAtHeight(suite.UpgradeHeight - 1)
 | 
			
		||||
	afterUpgradeCtx := suite.Kava.Grpc.CtxAtHeight(suite.UpgradeHeight)
 | 
			
		||||
 | 
			
		||||
	// Before params
 | 
			
		||||
	grpcClient := suite.Kava.Grpc
 | 
			
		||||
	govParamsBefore, err := grpcClient.Query.Gov.Params(beforeUpgradeCtx, &govtypes.QueryParamsRequest{
 | 
			
		||||
		ParamsType: govtypes.ParamDeposit,
 | 
			
		||||
	})
 | 
			
		||||
	suite.NoError(err)
 | 
			
		||||
	govParamsAfter, err := grpcClient.Query.Gov.Params(afterUpgradeCtx, &govtypes.QueryParamsRequest{
 | 
			
		||||
		ParamsType: govtypes.ParamDeposit,
 | 
			
		||||
	})
 | 
			
		||||
	suite.NoError(err)
 | 
			
		||||
 | 
			
		||||
	// after upgrade, querying params before upgrade height returns nil
 | 
			
		||||
	// since the param gprc query no longer queries x/params
 | 
			
		||||
	suite.Run("x/gov parameters before upgrade", func() {
 | 
			
		||||
		suite.Assert().Nil(
 | 
			
		||||
			govParamsBefore.DepositParams.MaxDepositPeriod,
 | 
			
		||||
			"x/gov DepositParams max deposit period before upgrade should be nil",
 | 
			
		||||
		)
 | 
			
		||||
		suite.Assert().Nil(
 | 
			
		||||
			govParamsBefore.DepositParams.MinDeposit,
 | 
			
		||||
			"x/gov DepositParams min deposit before upgrade should be 10_000_000 ukava",
 | 
			
		||||
		)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	suite.Run("x/gov parameters after upgrade", func() {
 | 
			
		||||
		suite.Assert().Equal(
 | 
			
		||||
			mustParseDuration("172800s"),
 | 
			
		||||
			govParamsAfter.DepositParams.MaxDepositPeriod,
 | 
			
		||||
			"x/gov DepositParams max deposit period after upgrade should be 172800s",
 | 
			
		||||
		)
 | 
			
		||||
		suite.Assert().Equal(
 | 
			
		||||
			[]sdk.Coin{{Denom: "ukava", Amount: sdk.NewInt(10_000_000)}},
 | 
			
		||||
			govParamsAfter.DepositParams.MinDeposit,
 | 
			
		||||
			"x/gov DepositParams min deposit after upgrade should be 10_000_000 ukava",
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		expectedParams := govtypes.Params{
 | 
			
		||||
			MinDeposit:                 sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(10_000_000))),
 | 
			
		||||
			MaxDepositPeriod:           mustParseDuration("172800s"),
 | 
			
		||||
			VotingPeriod:               mustParseDuration("30s"),
 | 
			
		||||
			Quorum:                     "0.334000000000000000",
 | 
			
		||||
			Threshold:                  "0.500000000000000000",
 | 
			
		||||
			VetoThreshold:              "0.334000000000000000",
 | 
			
		||||
			MinInitialDepositRatio:     "0.000000000000000000",
 | 
			
		||||
			BurnVoteQuorum:             false,
 | 
			
		||||
			BurnProposalDepositPrevote: false,
 | 
			
		||||
			BurnVoteVeto:               true,
 | 
			
		||||
		}
 | 
			
		||||
		suite.Require().Equal(expectedParams, *govParamsAfter.Params, "x/gov params after upgrade should be as expected")
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *IntegrationTestSuite) TestUpgradeParams_Consensus() {
 | 
			
		||||
	suite.SkipIfUpgradeDisabled()
 | 
			
		||||
 | 
			
		||||
	afterUpgradeCtx := suite.Kava.Grpc.CtxAtHeight(suite.UpgradeHeight)
 | 
			
		||||
 | 
			
		||||
	grpcClient := suite.Kava.Grpc
 | 
			
		||||
	paramsAfter, err := grpcClient.Query.Consensus.Params(afterUpgradeCtx, &consensustypes.QueryParamsRequest{})
 | 
			
		||||
	suite.NoError(err)
 | 
			
		||||
 | 
			
		||||
	// v25 consensus params from x/params should be migrated to x/consensus
 | 
			
		||||
	expectedParams := tmproto.ConsensusParams{
 | 
			
		||||
		Block: &tmproto.BlockParams{
 | 
			
		||||
			MaxBytes: 22020096,
 | 
			
		||||
			MaxGas:   20000000,
 | 
			
		||||
		},
 | 
			
		||||
		Evidence: &tmproto.EvidenceParams{
 | 
			
		||||
			MaxAgeNumBlocks: 100000,
 | 
			
		||||
			MaxAgeDuration:  *mustParseDuration("172800s"),
 | 
			
		||||
			MaxBytes:        1048576,
 | 
			
		||||
		},
 | 
			
		||||
		Validator: &tmproto.ValidatorParams{
 | 
			
		||||
			PubKeyTypes: []string{
 | 
			
		||||
				tmtypes.ABCIPubKeyTypeEd25519,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		Version: nil,
 | 
			
		||||
	}
 | 
			
		||||
	suite.Require().Equal(expectedParams, *paramsAfter.Params, "x/consensus params after upgrade should be as expected")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func mustParseDuration(s string) *time.Duration {
 | 
			
		||||
	d, err := time.ParseDuration(s)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	return &d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user