Skip to content

Commit

Permalink
feat!: add app version to param store (#347)
Browse files Browse the repository at this point in the history
  • Loading branch information
cmwaters authored Nov 13, 2023
1 parent 4c897c6 commit 562a626
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 17 deletions.
3 changes: 3 additions & 0 deletions baseapp/abci.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ func (app *BaseApp) InitChain(req abci.RequestInitChain) (res abci.ResponseInitC
// to state.
if req.ConsensusParams != nil {
app.StoreConsensusParams(app.deliverState.ctx, req.ConsensusParams)
if req.ConsensusParams.Version != nil {
app.appVersion = req.ConsensusParams.Version.AppVersion
}
}

if app.initChainer == nil {
Expand Down
27 changes: 14 additions & 13 deletions baseapp/baseapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ type BaseApp struct { // nolint: maligned
postHandler sdk.AnteHandler // post handler, optional, e.g. for tips

appStore
baseappVersions
peerFilters
snapshotData
abciData
Expand Down Expand Up @@ -98,6 +97,13 @@ type BaseApp struct { // nolint: maligned
// ResponseCommit.RetainHeight.
minRetainBlocks uint64

// application's version string
version string

// application's protocol version that increments on every upgrade
// if BaseApp is passed to the upgrade keeper's NewKeeper method.
appVersion uint64

// recovery handler for app.runTx method
runTxRecoveryMiddleware recoveryMiddleware

Expand Down Expand Up @@ -145,15 +151,6 @@ type abciData struct {
voteInfos []abci.VoteInfo
}

type baseappVersions struct {
// application's version string
version string

// application's protocol version that increments on every upgrade
// if BaseApp is passed to the upgrade keeper's NewKeeper method.
appVersion uint64
}

// should really get handled in some db struct
// which then has a sub-item, persistence fields
type snapshotData struct {
Expand Down Expand Up @@ -482,7 +479,12 @@ func (app *BaseApp) GetConsensusParams(ctx sdk.Context) *abci.ConsensusParams {
cp.Validator = &vp
}

cp.Version = &tmproto.VersionParams{AppVersion: app.appVersion}
if app.paramStore.Has(ctx, ParamStoreKeyVersionParams) {
var vp tmproto.VersionParams

app.paramStore.Get(ctx, ParamStoreKeyVersionParams, &vp)
cp.Version = &vp
}

return cp
}
Expand All @@ -507,8 +509,7 @@ func (app *BaseApp) StoreConsensusParams(ctx sdk.Context, cp *abci.ConsensusPara
app.paramStore.Set(ctx, ParamStoreKeyBlockParams, cp.Block)
app.paramStore.Set(ctx, ParamStoreKeyEvidenceParams, cp.Evidence)
app.paramStore.Set(ctx, ParamStoreKeyValidatorParams, cp.Validator)
// We're explicitly not storing the Tendermint app_version in the param store. It's
// stored instead in the x/upgrade store, with its own bump logic.
app.paramStore.Set(ctx, ParamStoreKeyVersionParams, cp.Version)
}

// getMaximumBlockGas gets the maximum gas from the consensus params. It panics
Expand Down
11 changes: 9 additions & 2 deletions baseapp/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"io"

tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
dbm "github.com/tendermint/tm-db"

"github.com/cosmos/cosmos-sdk/codec/types"
Expand Down Expand Up @@ -110,8 +111,14 @@ func (app *BaseApp) SetVersion(v string) {
app.version = v
}

// SetProtocolVersion sets the application's protocol version
func (app *BaseApp) SetProtocolVersion(v uint64) {
// SetAppVersion sets the application's protocol version
func (app *BaseApp) SetAppVersion(ctx sdk.Context, v uint64) {
// TODO: could make this less hacky in the future since the SDK
// shouldn't have to know about the app versioning scheme
if ctx.BlockHeader().Version.App >= 2 {
vp := &tmproto.VersionParams{AppVersion: v}
app.paramStore.Set(ctx, ParamStoreKeyVersionParams, vp)
}
app.appVersion = v
}

Expand Down
16 changes: 16 additions & 0 deletions baseapp/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ var (
ParamStoreKeyBlockParams = []byte("BlockParams")
ParamStoreKeyEvidenceParams = []byte("EvidenceParams")
ParamStoreKeyValidatorParams = []byte("ValidatorParams")
ParamStoreKeyVersionParams = []byte("VersionParams")
)

// ParamStore defines the interface the parameter store used by the BaseApp must
Expand Down Expand Up @@ -84,3 +85,18 @@ func ValidateValidatorParams(i interface{}) error {

return nil
}

// ValidateVersionParams defines a stateless validation on VersionParams. This
// function is called whenever the parameters are updated or stored.
func ValidateVersionParams(i interface{}) error {
v, ok := i.(tmproto.VersionParams)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

if v.AppVersion == 0 {
return errors.New("application version must not be zero")
}

return nil
}
3 changes: 3 additions & 0 deletions x/params/types/consensus_params.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,8 @@ func ConsensusParamsKeyTable() KeyTable {
NewParamSetPair(
baseapp.ParamStoreKeyValidatorParams, tmproto.ValidatorParams{}, baseapp.ValidateValidatorParams,
),
NewParamSetPair(
baseapp.ParamStoreKeyVersionParams, tmproto.VersionParams{}, baseapp.ValidateVersionParams,
),
)
}
4 changes: 3 additions & 1 deletion x/upgrade/exported/exported.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package exported

import sdk "github.com/cosmos/cosmos-sdk/types"

// ProtocolVersionSetter defines the interface fulfilled by BaseApp
// which allows setting it's appVersion field.
type ProtocolVersionSetter interface {
SetProtocolVersion(uint64)
SetAppVersion(sdk.Context, uint64)
}
2 changes: 1 addition & 1 deletion x/upgrade/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ func (k Keeper) ApplyUpgrade(ctx sdk.Context, plan types.Plan) {
k.setProtocolVersion(ctx, nextProtocolVersion)
if k.versionSetter != nil {
// set protocol version on BaseApp
k.versionSetter.SetProtocolVersion(nextProtocolVersion)
k.versionSetter.SetAppVersion(ctx, nextProtocolVersion)
}

// Must clear IBC state after upgrade is applied as it is stored separately from the upgrade plan.
Expand Down

0 comments on commit 562a626

Please sign in to comment.