#体重 #底座 #比较 #波卡 #提交 #区块链 #术语

应用 subweight

比较 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日
0.1.0 2023年4月5日

#1213 in 神奇豆子

Download history 59/week @ 2024-07-16 17/week @ 2024-07-23

每月76次下载

GPL-3.0-only

155KB
3.5K SLoC


Subweight

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

License: GPL v3

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

摘要

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

这就是 Subweight 发挥作用的地方:它比较旧版本和新版本的权重文件中的所有外联。
人类友好的输出看起来像这样

这自动将最严重的违规者放在顶部,并允许人类一目了然地了解情况 - 而不失细节!所有差异的链接都在那里,分享结果就像复制行链接一样简单。与大多数 Substrate 链兼容。享受吧!

您可以使用以下公开端点进行尝试,这些端点由 subweight-web 提供

dev 分支部署在 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 |
+------------------------------------------------------------------+-------------------------+--------+---------+----------------+

它首先打印出减少的(好的)内容,然后按升序绝对值排序的增减内容。

配置选项

仓库

选择要使用的项目。《子权重》的目标是与

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

注意:并非所有仓库都部署到了《子权重》网络服务。

路径模式

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

  • 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文件会自动排除。

组件

使用正则表达式过滤要包含的组件。
示例

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

外提

类似于《组件》过滤,这个过滤通过使用正则表达式来过滤外提。
示例

  • .*将匹配任何外提。
  • mint|burn将匹配mintburn外提。

评估方法

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

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

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

相对阈值

通过一个绝对百分比阈值过滤变化结果。
百分比值计算为增加或减少。
例如:从100到150将是+50%,并且会被任何阈值 >=50 包含。

绝对阈值

通过一个绝对阈值过滤变化结果。

维度

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

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

相关的MR是substrate#11637,该MR需要将权重模板集成到你的项目中以发射彩色权重。

忽略错误

静默忽略解析错误。当使用包含路径模式时非常有用。你可以通过点击红色的错误框来查看所有错误。

Git拉取

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

缓存

Web UI将成功响应缓存10分钟。目前没有标志来禁用它。
如果你想要确保不提供缓存的响应,请使用提交哈希而不是分支。

可能的错误和警告

Web界面

没有范围forcomponent …

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

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

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

运行测试

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

集成测试

集成测试以宏方式编写,以允许轻松扩展(参见integration.rs)。它们具有硬编码的预期结果,以及运行它们的特定提交哈希。
CI会这样做,对于Polkadot也会在master提交上这样做。

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

依赖关系

~4.5–7MB
~121K SLoC