【cosmos-sdk-笔记】cosmovisor 简单实现(代码:基础)

Page content

这一篇整理使用cosmovisor更新时如何修改代码。

1.下载代码

我使用cosmos-sdk简单的写了tvote模块。

git clone https://github.com/taoyuans/mingxie.git

cd mingxie
git checkout main_v1_1

这里有 2 个分支:
main_v1 是升级前的代码(v0.1.0)
main_v1_1 是升级后的代码(v0.1.1)

2.项目结构

app
| ... ...
|___app.go  
|___upgrades // => 创建更新目录,后续的更新代码卸载这里
| |___v01   // => 版本号,因为是 v0.1 系列版本,所以取名为 01 这个可以随意
| | |___upgrades.go // => 此版本更新逻辑
| | |___constants.go // => 一些使用的常量
|___upgrades.go // => 整体更新逻辑
|... ...

3.app/upgrade/v01/constants.go

这里的 UpgradeName 会在同一个目录的upgrades.go使用。 需要注意的是这里的 UpgradeName 和 我们申请 upgrade proposal的 name 要一致。
简单说 proposal.json 里的 name 字段和一致。

const (
 UpgradeName        = "v0.1.1"
)

4.app/upgrade/v01/upgrades.go

这里创建 CreateUpgradeHandler
需要注意的是返回是 mm.RunMigrations(ctx, configurator, vm)

package v01

import (
 sdk "github.com/cosmos/cosmos-sdk/types"
 "github.com/cosmos/cosmos-sdk/types/module"
 upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
)

func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator) upgradetypes.UpgradeHandler {
 return func(ctx sdk.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
  //
  return mm.RunMigrations(ctx, configurator, vm)
 }
}

5.app/upgrades.go

这里的setupUpgradeHandlers是在 app.go 里设置

package app

import (
 "fmt"
 v01 "mingxie/app/upgrades/v01"

 tvotemodulekeeper "mingxie/x/tvote/keeper"

 storetypes "github.com/cosmos/cosmos-sdk/store/types"
 "github.com/cosmos/cosmos-sdk/types/module"
 upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
)

func (app *App) setupUpgradeHandlers(configurator module.Configurator, keeper tvotemodulekeeper.Keeper) {
 app.UpgradeKeeper.SetUpgradeHandler(v01.UpgradeName, v01.CreateUpgradeHandler(app.mm, configurator))

//  upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk()
//  if err != nil {
//   panic(fmt.Errorf("failed to read upgrade info from disk: %w", err))
//  }

//  if app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
//   return
//  }

//  var storeUpgrades *storetypes.StoreUpgrades

//  switch upgradeInfo.Name {
//  case v01.UpgradeName:
//   fmt.Println("更新 v0.1.1")
//  }

//  if storeUpgrades != nil {
//   app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, storeUpgrades))
//  }
}

6.app/app.go

在 app.LoadLatestVersion() 方法执行之前
设置app.setupUpgradeHandlers(app.configurator, app.TvoteKeeper)

 // setupUpgradeHandlers should be called before `LoadLatestVersion()`
 // because StoreLoad is sealed after that
 app.setupUpgradeHandlers(app.configurator, app.TvoteKeeper)

 if loadLatest {
  if err := app.LoadLatestVersion(); err != nil {
   tmos.Exit(err.Error())
  }
 }

7.运行

以上的步骤是最简单的修改,之后根据前一篇文章。
使用 cosmovisor 运行就可以了。


欢迎大家的意见和交流

email: li_mingxie@163.com