8 个重大版本更新
0.8.0 | 2024年7月18日 |
---|---|
0.6.0 | 2024年6月24日 |
0.2.0 | 2024年3月18日 |
#1735 在 魔法豆
853 每月下载次数
用于 5 个软件包(2 个直接使用)
2.5MB
43K SLoC
⚠️ 警告 ⚠️
此软件包未经过审计,不应在生产中使用。
参数
允许在运行时更新配置参数。
模块 API
该托盘公开了两个API;一个用于更新参数的入站端,另一个用于访问这些参数的出站端。参数本身在运行时配置中定义,并将汇总成一个枚举。每个参数都通过一个key
进行寻址,并可以有一个默认值。这不是由托盘完成的,而是通过frame_support::dynamic_params::dynamic_params
宏或替代品来实现的。
请注意,每次访问都会产生一次存储读取。在大多数情况下这不应成问题,但在重量受限的代码中必须考虑这一点。
入站
入站端仅包含用于更新参数值的Pallet::set_parameter
外联。每个参数都可以拥有自己的管理员起源,由Config::AdminOrigin
指定。
出站
出站端主要是面向运行时的。更具体地说,它提供了一个Get
实现,可以在任何接受该实现的地方使用。有两个宏:[frame_support::dynamic_params::define_parameters
和frame_support::dynamic_params:dynamic_pallet_params
用于以类型化的方式定义和公开参数。
有关该托盘公开的接口的更多信息,包括其配置特性、派发可执行项、存储项、事件和错误,请参阅pallet
模块。
概述
该托盘非常适合在不进行运行时升级的情况下更新参数。由于运行时升级需要大量的细致工作和总是存在风险,因此不需要运行时升级来更改简单参数是非常方便的。对于简单的参数更改,更新整个运行时似乎是过度行为。该托盘允许对谁可以更新什么进行精细控制。唯一的缺点是它以便利性为代价换取了性能,因此应该仅在证明其非关键的地方使用。那些很少访问但经常更改的值将是一个完美的选择。
示例配置
以下是定义一些参数及其默认值的示例
可以按键的每个键定义受权限的来源,如下所示
该托盘还需要一个默认值用于基准测试。理想情况下,这是编码长度最长的变体。尽管在任一种情况下,PoV基准测试都会在整个枚举上考虑最坏情况。
现在需要将汇总的参数注入到模块配置中
作为最后一步,现在可以在其他模块中使用这些参数了 🙌
示例用法
现在来演示如何更新这些值
低级/实现细节
该托盘在存储映射中存储参数,并为每个Key
类型实现了相应的Get<Value>
。然后Get
会访问Parameters
映射以检索值。每次值被更新时都会触发一个事件。即使值更改到相同的值,也会触发该事件。
键和值类型本身是由宏定义的,并聚合到运行时范围内的枚举中。这个枚举随后注入到模块中。这允许它在无需对参数将使用的模块进行任何更改的情况下使用。
设计目标
- 易于更新而无需运行时升级。
- 公开元数据和文档,方便用户使用。
- 可以按键进行权限控制。
设计
- 所有操作都在运行时完成,无需使用
const
值。Get
允许这样做——这既是优点也是缺点。2. 类型通过宏定义,这允许公开元数据和文档。3. 访问控制通过EnsureOriginWithArg
特质完成,它允许将数据传递给原始检查。数据通过键传递。实现者可以匹配键和原始值来决定原始值是否具有设置值的权限。
依赖项
~18–33MB
~551K SLoC