Substrate Developer Hub

Substrate Developer Hub

  • 教程
  • 知识库
  • 进阶菜谱
  • API 文档
  • Languages icon简体中文
    • English
    • 协助翻译

›学习 Substrate

开始

  • 总览
  • 安装
  • 在 Windows 系统开始
  • 词汇表

学习 Substrate

  • Extrinsics
  • 交易池
  • 账户摘要
  • 会话密钥
  • 交易权重
  • 链下功能

Runtime

  • Runtime 总览
  • Runtime 的基本类型
  • FRAME
  • Pallets
  • Runtime宏
  • Runtime 元数据
  • Runtime 存储
  • Runtime 来源
  • Runtime 执行流程
  • Runtime事件
  • Runtime 错误
  • 交易费用
  • 链下工作机
  • 调试
  • Runtime 测试
  • 链上随机生成
  • Runtime 升级

智能合约

  • 总览
  • ink! 智能合约
  • ink! 概念
  • ink! 开发
  • EVM 模块
  • ink! 常问问题

整合

  • Polkadot-JS
  • 客户端库
  • 链规范
  • Subkey 工具
  • 内存分析

进阶

  • SCALE 编解码器
  • 共识机制
  • 区块导入过程
  • 执行器
  • 密码学
  • 存储
  • SS58 地址格式

贡献

  • 协助翻译
Translate

交易权重

链可用的资源是有限的。 這裡资源包括内存、存储 I/O、计算、交易/区块大小和状态数据库的大小。 有几种机制可以管理资源被获取,并防止链上的组件过多消耗任何资源。 权重就是用于管理 验证区块花费的时间 的机制。 一般来说,这用来限制存储 I/O 和计算。

备注:权重不是用来限制对其他资源的访问,例如存储本身或内存占用。 为此必须使用其他机制。

区块中可包含的权重总量是有限的,并且可选的权重消耗(即不需作为区块初始化或最终化阶段时消耗的权重,或不需用于强制性固有交易的权重)通常也会受到经济举措(也就是交易费)的限制。 交易费文档 涵盖了权重系统对交易费用的影响。

Substrate 将权重单位定义为特定硬件配置 (英特尔内核 i7-7700K CPU 加 64GB 内存配 NVMe SSD 硬盘) 的一皮秒 (pico-second) 执行时间。 使用特定硬件作为基准测试使得不同 runtime 之间的权重可进行比较,从而允许组合不同来源的软件组件。 如要调出另一个对验证人硬件有着其他假设的 runtime,您可设置不同的最大区块权重。 例如,如要允许验证人节点使用比上面参考机器慢一倍的硬件参与,应将最大区块权重设置为默认的一半,以保证默认区块时间。

最大区块权重应等于目标区块时间的三分之一,预留三分之一作区块创建,另外三分之一作网络传输,最后三分之一作区块生成和验证。 允许区块时间延长一倍,可导致最大区块权重跟着翻一倍。 这些调优选择让 runtime 开发者可根据他们自己的使用场景,在最优交易吞吐量和硬件需求之间作权衡取舍。 这些权衡取舍可以通过更新 runtime 来进行调整,以便跟上硬件和软件的更新迭代。

权重基础知识

权重代表了区块链在验证区块时有的 有限 时间。 这包括计算周期和存储 I/O 。 开发者可自定义方法来使用更复杂的结构来表示权重。 Substrate weights are simply a 数字值.

权重计算应为:

  • 在被调用之前可计算。 区块创建者在实际决定是否接受某个交易之前应该能够检查其权重。
  • 本身消耗很少的资源。 如果计算交易的权重会消耗与执行交易消耗相似的资源,那这样就没有意义了。 因此,权重计算应该比执行交易更轻量级。
  • 无需访问链上状态即可确定使用的资源。 权重擅长表示 固定 的测量或仅基于无昂贵 I/O 的可调用函数参数的测量 。 当交易成本依赖于链上状态时,权重就不是很有用了。

如果可调用函数的权重非常依赖链上的状态,则有两种选择:

  • 强制使用可调用函数可能消耗的权重上限。 如果可调用函数使用的强制权重上限与其下限差别只是很少,则可直接使用其权重上限而无需访问链上状态。 但是如果两者差别巨大,那么即使进行很少的交易,其经济成本也可能很大,这将破坏激励措施,并降低链上吞吐量。
  • 要求有效权重(或可用于有效计算权重的参照值)作为参数传递到可调用函数中。 消耗的权量应基于这些参数,同时也应包含在调用时验证它们所花费的时间。 必须经过这一验证过程以确保权重参数准确对应于链上状态,如果对应不上,则相应操作应友好地报错。

权重因素

有几个因素影响到执行时间,从而影响权重计算。 其中一个主要因素是调用函数对存储数据的访问次数。 因为数据库访问成本很大程度上取决于数据库后端和存储硬件, 权重计算得以数据库读写为参数来得出的。 这些成本是在特定参考硬件上对每个可用的数据库后端进行基准测试后确定的。 这样可以在不改变权重计算的前提下切换数据库后端。

除了仅使用常量进行预调用权重计算外,开发者还可将调用函数的参数纳入作权重计算。 当执行时间取决于参数的长度时 (比如说参数是一个数组),这可会是很有用的。 重要的是这些计算本身不应涉及复杂的计算工作。 预调用的权重应该是可以通过对输入参数进行简单运算就可以轻松得出的。

The System pallet is responsible for accumulating the weight of each block as it gets executed and making sure that it does not exceed the limit. The Transaction Payment pallet is responsible for interpreting these weights and deducting fees based upon them. The weighing function is part of the runtime so it can be upgraded if needed.

调用后权重校正

在有些情况下,这些调用函数的实际权重不能简单的从它的输入计算出来。 例如,权重可能取决于调用函数的逻辑路径。 如果没法在执行交易后修正权重,那我们只能不断高估并多收这些外部交易的费用,因为我们得在整个交易执行前用它们可能有的最差表现来计算以保证区块链的安全性。

调用后的权重校正允许所有调用函数在执行后返回他的 实际权重。 这些权重必须小于或等于调用前预估的最差权重值。 用户如要他们的调用函数能纳入区块里,他们必须得先足以支付最大权重,即便最后扣除的费用是按实际权重计算。