#weight #substrate #compare #polkadot #commit #repository #pallet

app subweight-web

比较 Substrate 区块链 SDK 的权重文件

6 个稳定版本

3.4.2 2024 年 3 月 30 日
3.4.1 2024 年 3 月 11 日
3.3.1 2023 年 11 月 2 日
3.3.0 2023 年 10 月 3 日
3.0.0 2023 年 5 月 24 日

#867 in 神奇豆子

Download history

293 每月下载

GPL-3.0-only

195KB
4K SLoC

Rust 3.5K SLoC // 0.0% comments JavaScript 420 SLoC // 0.2% comments


Subweight

比较由 Substrate 生成的权重文件。

License: GPL v3

该项目解析并比较 Substrate 权重文件。它极大地帮助了大型权重差异的审查过程。结果可以在 CLI 或浏览器中方便地显示。

摘要

手动比较 Substrate 权重文件是计算机擅长的,而人类容易出错的任务。
当你想知道我在说什么时,看看 这个差异
现在告诉我哪些行有问题,哪些行没问题 😈?看起来不太吸引人,对吧?

这就是 Subweight 来拯救的地方:它比较旧版本和新版本的权重文件中的所有外部事务。
人性化的输出如下

这自动将最严重的违规者排在最上面,并允许人类一眼就能看到正在发生什么 - 而不失细节!所有差异链接都在那里,分享结果就像复制行链接一样简单。与大多数 Substrate 链兼容。享受吧!

你可以通过以下公开端点来玩 subweight-web 提供的功能

开发分支已部署在 https://weights.tasty.limo:8443/

安装

安装两个二进制文件

cargo install subweight subweight-web

subweight --version
subweight-web --version

编译

rust-toolchain.toml 定义了与代码一起测试的确切 Rust 版本。
格式化规则定义在 rustfmt.toml 中。

git clone https://github.com/ggwpez/substrate-weight-compare

cd substrate-weight-compare/
cargo build --profile production

示例:Web 界面

假设您在父目录中已经检出与 Substrate 兼容的仓库

subweight-web --root ../ --repos polkadot substrate cumulus

然后在浏览器中尝试以下操作

示例:比较权重文件

假设您有一些权重文件在

  • OLD=repos/polkadot/
  • NEW=my_other_repos/polkadot
    基本命令如下所示
subweight compare files --old $OLD/* --new $NEW/* --method asymptotic

如果您想比较 Kusama 到 Polkadot 运行时的权重,命令会变得更长一些

subweight compare files --old ../polkadot/runtime/kusama/**/weights/*.rs --new ../polkadot/runtime/polkadot/*/weights/*.rs --method asymptotic --ignore-errors --change changed unchanged --unit time --threshold 10
+-----------------------------------------+-----------------------------+----------+----------+---------------+
| File                                    | Extrinsic                   | Old      | New      | Change [%]    |
+=============================================================================================================+
| pallet_election_provider_multi_phase.rs | feasibility_check           | 1.23ms   | 812.80us | -33.90 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| frame_benchmarking_baseline.rs          | addition                    | 162.00ns | 112.00ns | -30.86 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | hrmp_cancel_open_request    | 27.90us  | 39.02us  | +39.86 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| pallet_tips.rs                          | slash_tip                   | 15.86us  | 22.61us  | +42.56 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_initializer.rs       | force_approve               | 3.12us   | 4.53us   | +45.02 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | clean_open_channel_requests | 366.82us | 590.73us | +61.04 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | hrmp_accept_open_channel    | 29.81us  | 48.54us  | +62.81 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | hrmp_close_channel          | 27.58us  | 44.92us  | +62.89 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | force_process_hrmp_open     | 2.17ms   | 3.64ms   | +67.28 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | hrmp_init_open_channel      | 32.67us  | 55.70us  | +70.49 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | force_process_hrmp_close    | 1.21ms   | 2.11ms   | +74.25 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | force_clean_hrmp            | 1.82ms   | 3.27ms   | +80.04 |
+-----------------------------------------+-----------------------------+----------+----------+---------------+

您可以使用 --print-terms 标志来打印术语。此示例省略了它们,因为行变得非常长。

示例:比较 Polkadot 提交

假设您在 Polkadot 目录中运行此操作,比较任意的 Polkadot 提交

subweight --verbose compare commits HEAD HEAD~100 --threshold 10 --method asymptotic --path-pattern "runtime/*/src/weights/**/*.rs,bridges/modules/*/src/weights.rs"

+------------------------------------------------------------------+-------------------------+--------+---------+----------------+
| File                                                             | Extrinsic               | Old    | New     | Change [%]     |
+================================================================================================================================+
| runtime/rococo/src/weights/runtime_parachains_paras_inherent.rs  | enter_variable_disputes | -      | -       | ERROR          |
|------------------------------------------------------------------+-------------------------+--------+---------+----------------|
| runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs | set_topic               | 2.59us | 10.01us | +286.67 |
|------------------------------------------------------------------+-------------------------+--------+---------+----------------|
| runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs | clear_transact_status   | 2.65us | 9.96us  | +276.24 |
|------------------------------------------------------------------+-------------------------+--------+---------+----------------|
| runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs | clear_topic             | 2.59us | 8.29us  | +220.04 |
+------------------------------------------------------------------+-------------------------+--------+---------+----------------+

它首先打印出减少的(好的)和增加的(坏的),按升序绝对值排序。

配置选项

仓库

选择要使用的项目。 Subweight 的目标是与

其他当前兼容但不是硬要求的项

注意:并非所有仓库都已部署到 Subweight 网络服务。

路径模式

使用 glob 包来匹配仓库路径中的文件与给定的模式。
以下是 Web 界面使用的示例。这些示例没有捕获 所有 文件,这是一个错误。

  • Substrate: frame/*/src/weights.rs
  • Polkadot: runtime/*/src/weights/**/*.rs,bridges/modules/*/src/weights.rs
  • Cumulus: **/weights/*.rs,**/weights/xcm/*.rs,**/src/weights.rs

weights/**/*.rs 优于 weights/*.rs,因为它包括可能的子文件夹,如 XCM。
自动排除 mod.rs 文件。

组件

使用 Regex 过滤要包含的组件。
示例

  • .* 将是 任何 组件。
  • system|assets 将是 systemassets 组件。

外发事务

类似于 组件 过滤,它使用 Regex 过滤外发事务。
示例

  • .* 将是 任何 外发事务。
  • mint|burn 将是 mintburn 外发事务。

评估方法

评估方法定义了如何评估(计算)权重方程。
这是在决定权重是否变差时的重要决定因素。

  • 基本:仅考虑权重加存储操作的常数因子。
  • 精确最坏情况:假设两个方程都是超平面,通过评估所有角来找到它们最大的相对增加。对于 n 个组件的运行时间是 2^n,这被严格限制为 16 个组件。
    这需要您的权重文件支持组件范围注释。检查的一种方法是在您的weight.rs文件中搜索字符串"The range of component"
  • 猜测最坏情况:尝试应用精确最坏情况,但如果未找到最大值,则假设所有组件的最大值为100。这是一种在您的权重文件没有组件范围注释的情况下的最佳尝试方法。
  • 渐近:将所有组件设置为最大值。可以用来了解公式的渐近变化。

注意:存储权重目前设置为RocksDB Substrate默认。

相对阈值

通过绝对百分比阈值过滤更改结果。
百分比值按增加或减少计算。
例如:从100到150将是+50%,并且会被任何大于等于50的阈值包含。

绝对阈值

通过绝对阈值过滤更改结果。

维度

Substrate中的权重是彩色的(二维)。其维度是参考时间证明大小。因此,维度可以设置为时间证明。然后将自动选择良好的单位,例如,对于时间µs,对于证明KiB;具体标量的大小而定。

  • 时间:在参考硬件上调用消耗的执行时间。
  • 证明:调用生成的证明大小(PoV)。

相关的MR是substrate#11637,该MR要求集成您的项目权重模板以发出彩色权重。

忽略错误

静默忽略解析错误。这在使用包含路径模式时很有用。您可以在点击红色错误框时查看所有错误。

Git拉取

在比较任何内容之前拉取分支。这确保您处于最后一个提交。
这不会覆盖缓存。因此,新更改可能需要10分钟才能显示出来。

缓存

Web UI缓存成功响应10分钟。目前没有标志可以禁用它。
如果您想确保不提供缓存结果,请使用提交散列而不是分支。

可能出现的错误和警告

Web界面

没有范围forcomponent …

这意味着该调用的权重未更新以显示该组件的确切范围。如果您想这样做,请使用Substrate的新版本重新运行它们。

…在不同的版本中有不同的范围in旧的和新的版本中

这意味着组件的范围在旧版本和新版本之间发生了变化。这不是错误或问题,但会使准确比较项变得不可能——因此错误。当使用Guess-*比较方法之一时,它不会尝试进行准确比较,因此错误消失。

运行测试

存在单元集成测试。其中大多数都受功能标志保护。下面的说明涵盖了两者。
您可以使用cargo test仅运行健全性检查。

集成测试

集成测试以宏的方式编写,以便于扩展(见integration.rs)。它们包含硬编码的预期结果和运行时的特定提交哈希。
CI执行此操作,并且对于Polkadot也在主提交上执行。

git clone https://github.com/ggwpez/substrate-weight-compare
cd substrate-weight-compare

# Clone all the test-able repos
mkdir -p repos
git clone https://github.com/paritytech/polkadot/ repos/polkadot
git clone https://github.com/paritytech/substrate/ repos/substrate
git clone https://github.com/paritytech/cumulus/ repos/cumulus
git clone https://github.com/AcalaNetwork/acala/ repos/acala
git clone https://github.com/AstarNetwork/astar/ repos/astar
git clone https://github.com/PureStake/moonbeam/ repos/moonbeam
git clone https://github.com/ComposableFi/composable/ repos/composable
git clone https://github.com/NodleCode/chain/ repos/chain

# Run ALL the tests
cargo test --release --all-targets --all-features

许可证

仅限GPLv3,见LICENSE

依赖项

~22–35MB
~619K SLoC