默认的 Substrate 区块生产系统以一致的时间间隔生产区块。这就是所谓的目标区块时间。鉴于此要求,基于 Substrate 的区块链的每个区块只能执行有限数量的extrinsics。执行外部函数所需的时间可能因计算复杂性、存储复杂性、使用的硬件和许多其他因素而异。我们使用称为weight的通用度量来表示一个区块中可以容纳多少extrinsics。这将在交易权重部分进一步解释。
在 Substrate 中,10^12 Weight = 1 Second,即 1,000 weight = 1 纳秒,这是在特定的参考硬件上测量[1]。
由于此类过程会引入大量开销,因此Substrate不使用类似于“gas metering”的机制进行extrinsic测量。相反,Substrate 期望使用benchmarking为执行extrinsic的最坏情况提供近似的最大值。假设采用了这种最坏情况下的路径,Substrate 将向用户收费,并且如果extrinsic需要更少的资源,则可以退还一些预估的weight和fees。这在交易费用一章中有进一步的解释 。
那么我们如何确定最坏情况下的计算时间和extrinsics的权重呢( computation time and weight of our extrinsics )?
这就是 Substrate Runtime Benchmarking 的产生的原因。它有一组工具来帮助确定运行时extrinsic的权重。它在运行时环境中多次执行pallet中的extrinsics,并跟踪执行时间。
总的来说,它:
拒绝服务(DoS)是分布式系统的一种常见的攻击向量,包括blockchain网络。这种攻击的一个简单例子是用户重复执行一个涉及大量计算的extrinsic。为了防止用户在网络上发垃圾邮件,我们对用户中心该调用收取费用。调用的成本应该反映系统发生的计算和存储成本,调用越复杂,我们收取的费用就越多。不过,我们还是希望鼓励用户使用我们的区块链系统,所以我们也希望这个估算成本相对准确,这样我们就不会向用户收取超出必要的费用。
有了Substrate的benchmarking框架,运行时开发人员可以估计extrinsics的权重,并向终端用户收取适当的交易费用。因此,对我们的运行时外部函数进行基准测试是非常关键的,以测量外部计算是如何随输入而变化的,并为这些外部函数设置适当的权重函数。设置适当的权值函数,准确反映底层的计算和存储是Substrate的安全的重要保障。
相关内容:
https://substrate.dev/docs/en/knowledgebase/runtime/benchmarking