Cosmos SDK升级指南:从v0.50.x到v0.53.x版本迁移详解
前言
本文为Cosmos SDK区块链开发者提供从v0.50.x版本升级到v0.53.x版本的完整指南。作为区块链基础设施的核心框架,Cosmos SDK的版本升级往往伴随着重要功能改进和架构调整。本文将详细介绍升级过程中的必改项和可选功能,帮助开发者顺利完成迁移。
升级概览
本次升级包含一个必须修改项和三个可选功能:
必须修改项:
- 应用布线变更(App Wiring Changes)
可选功能:
- 添加ProtocolPool模块
- 添加Epochs模块
- 启用无序交易支持
完成升级后,应用将获得上述新功能模块的支持。
一、必须修改项:应用布线变更
在v0.53.x版本中,x/auth
模块新增了PreBlocker
功能,开发者必须将其添加到模块管理器的SetOrderPreBlockers
方法中。
app.ModuleManager.SetOrderPreBlockers(
upgradetypes.ModuleName,
authtypes.ModuleName, // 新增项
)
这项变更是为了确保在区块处理前正确执行账户相关的预处理逻辑。
二、可选功能:ProtocolPool模块
ProtocolPool模块提供了一个独立于传统分发模块的社区资金池管理方案。需要注意的是,启用此模块后,x/distribution
模块中的相关功能将不再可用。
手动布线实现
- 导入必要包:
import (
"github.com/cosmos/cosmos-sdk/x/protocolpool"
protocolpoolkeeper "github.com/cosmos/cosmos-sdk/x/protocolpool/keeper"
protocolpooltypes "github.com/cosmos/cosmos-sdk/x/protocolpool/types"
)
- 设置模块账户权限:
maccPerms = map[string][]string{
protocolpooltypes.ModuleName: nil,
protocolpooltypes.ProtocolPoolEscrowAccount: nil,
}
- 初始化Keeper(需在分发模块之前):
app.ProtocolPoolKeeper = protocolpoolkeeper.NewKeeper(
appCodec,
runtime.NewKVStoreService(keys[protocolpooltypes.StoreKey]),
app.AccountKeeper,
app.BankKeeper,
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
)
- 将ProtocolPool Keeper传递给分发模块:
app.DistrKeeper = distrkeeper.NewKeeper(
// ...其他参数
distrkeeper.WithExternalCommunityPool(app.ProtocolPoolKeeper),
)
- 模块顺序配置:
app.ModuleManager.SetOrderBeginBlockers(
distrtypes.ModuleName,
protocolpooltypes.ModuleName,
)
依赖注入(DI)实现
使用依赖注入方式更简洁:
- 配置模块账户权限:
moduleAccPerms = []*authmodulev1.ModuleAccountPermission{
{Account: protocolpooltypes.ModuleName},
{Account: protocolpooltypes.ProtocolPoolEscrowAccount},
}
- 模块配置:
{
Name: protocolpooltypes.ModuleName,
Config: appconfig.WrapAny(&protocolpoolmodulev1.Module{}),
}
三、可选功能:Epochs模块
Epochs模块提供了周期性的区块触发机制,适用于需要定期执行的任务。
手动布线实现
- 初始化Keeper:
app.EpochsKeeper = epochskeeper.NewKeeper(
runtime.NewKVStoreService(keys[epochstypes.StoreKey]),
appCodec,
)
- 设置钩子函数:
app.EpochsKeeper.SetHooks(
epochstypes.NewMultiEpochHooks(
app.SomeOtherModule, // 你的业务模块
),
)
- 模块顺序配置:
app.ModuleManager.SetOrderBeginBlockers(
epochstypes.ModuleName,
)
依赖注入实现
- 模块配置:
{
Name: epochstypes.ModuleName,
Config: appconfig.WrapAny(&epochsmodulev1.Module{}),
}
四、可选功能:无序交易支持
v0.53.x版本引入了无序交易支持,为交易处理提供了更大的灵活性。
启用方式
- 配置Account Keeper:
app.AccountKeeper = authkeeper.NewAccountKeeper(
// ...其他参数
authkeeper.WithUnorderedTransactions(true),
)
- 注意事项:
- 无序交易的sequence值必须为0
- 默认超时时间为10分钟
- 默认gas费用为2240单位
- 自定义参数:
ante.NewSigVerificationDecorator(
options.AccountKeeper,
options.SignModeHandler,
ante.WithUnorderedTxGasCost(customGasCost),
ante.WithMaxUnorderedTxTimeoutDuration(customDuration),
)
五、升级处理器实现
升级处理器需要为新模块添加存储升级配置:
storeUpgrades := storetypes.StoreUpgrades{
Added: []string{
epochstypes.ModuleName, // 如未添加则移除
protocolpooltypes.ModuleName, // 如未添加则移除
},
}
结语
本文详细介绍了Cosmos SDK从v0.50.x升级到v0.53.x版本的关键步骤。开发者应根据自身业务需求选择性地实现可选功能。特别提醒,在升级生产环境前,务必在测试网充分验证所有变更,确保升级过程平稳顺利。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考