Substrate knowledgebase: Benchmarking

金理
2023-12-01

What Is Runtime Benchmarking?

默认的 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,并跟踪执行时间。

总的来说,它:

  • 从你的pallets中设置和执行extrinsics。
  • 使用这些不同的输入捕获这些基准测试的原始数据,包括执行了多少数据库读取和写入。
  • 使用线性回归分析来确定计算时间和外部输入之间的关系。
  • 输出带有随时可用的weight函数的 Rust 文件,这些函数可以轻松集成到您的runtime中。

Why Benchmark a Runtime Pallet?

拒绝服务(DoS)是分布式系统的一种常见的攻击向量,包括blockchain网络。这种攻击的一个简单例子是用户重复执行一个涉及大量计算的extrinsic。为了防止用户在网络上发垃圾邮件,我们对用户中心该调用收取费用。调用的成本应该反映系统发生的计算和存储成本,调用越复杂,我们收取的费用就越多。不过,我们还是希望鼓励用户使用我们的区块链系统,所以我们也希望这个估算成本相对准确,这样我们就不会向用户收取超出必要的费用。

有了Substrate的benchmarking框架,运行时开发人员可以估计extrinsics的权重,并向终端用户收取适当的交易费用。因此,对我们的运行时外部函数进行基准测试是非常关键的,以测量外部计算是如何随输入而变化的,并为这些外部函数设置适当的权重函数。设置适当的权值函数,准确反映底层的计算和存储是Substrate的安全的重要保障。

相关内容:
https://substrate.dev/docs/en/knowledgebase/runtime/benchmarking

 类似资料:

相关阅读

相关文章

相关问答