参数(Params)

Note: Params 模块已被弃用,取而代之的是每个模块拥有自己的参数。

摘要

params 包提供了一个全局可用的参数存储。

主要有两种类型:Keeper 和 Subspace。Subspace 是一个用于参数存储的隔离命名空间,其键由预配置的空间名称前缀。Keeper 具有访问所有现有空间的权限。

Subspace 可供需要私有参数存储的独立 keeper 使用,其他 keeper 无法修改该存储。params Keeper 可用于向 x/gov 路由器添加路由,以便在提案通过时修改任何参数。

以下内容解释了如何在主模块和用户模块中使用 params 模块。

目录

Keeper

在应用程序初始化阶段,可以使用 Keeper.Subspace 为其他模块的 keeper 分配子空间,并将其存储在 Keeper.spaces 中。然后,这些模块可以通过 Keeper.GetSubspace 获得对其特定参数存储的引用。

示例:

type ExampleKeeper struct {
	paramSpace paramtypes.Subspace
}

func (k ExampleKeeper) SetParams(ctx sdk.Context, params types.Params) {
	k.paramSpace.SetParamSet(ctx, &params)
}

子空间

Subspace 是参数存储的一个前缀子空间。每个使用参数存储的模块都会获取一个 Subspace,以隔离访问权限。

参数键是人类可读的字母数字字符串。例如,键为 "ExampleParameter" 的参数存储在 []byte("SubspaceName" + "/" + "ExampleParameter") 下,其中 "SubspaceName" 是子空间的名称。

子键是与主参数键一起使用的次级参数键。子键可用于分组或在运行时动态生成参数键。

键表(KeyTable)

所有将要使用的参数键都应在编译时注册。KeyTable 本质上是一个 map[string]attribute,其中字符串是参数键。

当前,attribute 包括一个 reflect.Type,用于指示参数类型,以检查提供的键和值是否兼容并已注册,以及一个函数 ValueValidatorFn 用于验证值。

只有主键需要在 KeyTable 上注册。子键继承主键的属性。

参数集(ParamSet)

模块通常将参数定义为 proto 消息。生成的结构体可以实现 ParamSet 接口,以便与以下方法一起使用:

  • KeyTable.RegisterParamSet():注册结构体中的所有参数

  • Subspace.{Get, Set}ParamSet():从结构体中获取或设置参数

实现者应为指针,以便使用 GetParamSet()

Last updated