8 个重大版本更新

0.8.0 2024年7月18日
0.6.0 2024年6月24日
0.2.0 2024年3月18日

#1735魔法豆

Download history 122/week @ 2024-04-29 3/week @ 2024-05-13 150/week @ 2024-05-20 30/week @ 2024-05-27 149/week @ 2024-06-03 200/week @ 2024-06-10 112/week @ 2024-06-17 381/week @ 2024-06-24 121/week @ 2024-07-01 224/week @ 2024-07-08 315/week @ 2024-07-15 106/week @ 2024-07-22 199/week @ 2024-07-29

853 每月下载次数
用于 5 个软件包(2 个直接使用)

Apache-2.0

2.5MB
43K SLoC

⚠️ 警告 ⚠️


此软件包未经过审计,不应在生产中使用。

参数

允许在运行时更新配置参数。

模块 API

该托盘公开了两个API;一个用于更新参数的入站端,另一个用于访问这些参数的出站端。参数本身在运行时配置中定义,并将汇总成一个枚举。每个参数都通过一个key进行寻址,并可以有一个默认值。这不是由托盘完成的,而是通过frame_support::dynamic_params::dynamic_params宏或替代品来实现的。

请注意,每次访问都会产生一次存储读取。在大多数情况下这不应成问题,但在重量受限的代码中必须考虑这一点。

入站

入站端仅包含用于更新参数值的Pallet::set_parameter外联。每个参数都可以拥有自己的管理员起源,由Config::AdminOrigin指定。

出站

出站端主要是面向运行时的。更具体地说,它提供了一个Get实现,可以在任何接受该实现的地方使用。有两个宏:[frame_support::dynamic_params::define_parametersframe_support::dynamic_params:dynamic_pallet_params用于以类型化的方式定义和公开参数。

有关该托盘公开的接口的更多信息,包括其配置特性、派发可执行项、存储项、事件和错误,请参阅pallet模块。

概述

该托盘非常适合在不进行运行时升级的情况下更新参数。由于运行时升级需要大量的细致工作和总是存在风险,因此不需要运行时升级来更改简单参数是非常方便的。对于简单的参数更改,更新整个运行时似乎是过度行为。该托盘允许对谁可以更新什么进行精细控制。唯一的缺点是它以便利性为代价换取了性能,因此应该仅在证明其非关键的地方使用。那些很少访问但经常更改的值将是一个完美的选择。

示例配置

以下是定义一些参数及其默认值的示例

可以按键的每个键定义受权限的来源,如下所示

该托盘还需要一个默认值用于基准测试。理想情况下,这是编码长度最长的变体。尽管在任一种情况下,PoV基准测试都会在整个枚举上考虑最坏情况。

现在需要将汇总的参数注入到模块配置中

作为最后一步,现在可以在其他模块中使用这些参数了 🙌

示例用法

现在来演示如何更新这些值

低级/实现细节

该托盘在存储映射中存储参数,并为每个Key类型实现了相应的Get<Value>。然后Get会访问Parameters映射以检索值。每次值被更新时都会触发一个事件。即使值更改到相同的值,也会触发该事件。

键和值类型本身是由宏定义的,并聚合到运行时范围内的枚举中。这个枚举随后注入到模块中。这允许它在无需对参数将使用的模块进行任何更改的情况下使用。

设计目标

  1. 易于更新而无需运行时升级。
  2. 公开元数据和文档,方便用户使用。
  3. 可以按键进行权限控制。

设计

  1. 所有操作都在运行时完成,无需使用const值。 Get允许这样做——这既是优点也是缺点。2. 类型通过宏定义,这允许公开元数据和文档。3. 访问控制通过EnsureOriginWithArg特质完成,它允许将数据传递给原始检查。数据通过键传递。实现者可以匹配键和原始值来决定原始值是否具有设置值的权限。

依赖项

~18–33MB
~551K SLoC