NEAR 上不同的 GAS 限制

Different GAS limits on NEAR

我在调用该状态的函数时看到错误:

"FunctionCallError": { 
    "ExecutionError": "Exceeded the maximum amount of gas allowed to burn per contract." 
}

我看过其他有关 exceeding the prepaid gas 错误的堆栈溢出帖子,但这似乎是一个不同的错误。我想知道这个错误是什么以及导致它的原因。它与超出预付 GAS 错误有何不同,我该如何解决?

就上下文而言,从 wall-clock 时间的角度考虑 GAS 很重要。 NEAR GAS 值被调整为与 wall-clock 时间相关; 1 Tgas 大约 1 ms.

一般来说,您应该了解三个 GAS 限制:

  • 交易限制(300 TGas:0.03 $NEAR & 300ms wall-clock 时间)。在 nearcore 中找到的实际值 here
  • receipt 限制(300 TGas:0.03 $NEAR & 300ms wall-clock 时间)。找到实际值 here in nearcore. Note that it says 200 TGas but has been updated to be 300 TGas as shown here
  • 限制(1_000 TGas:0.1 $NEAR & 1s wall-clock时间)。在 nearcore 中找到的实际值 here

NOTE: the limits are subject to change. The numbers I've listed here are based on the protocol configuration at the time of writing this post.

NEAR 上的每笔交易可以目前 燃烧 最大300 TGas(0.03 $ NEAR) 相当于大约 300 毫秒的 wall-clock 时间。这是通过不允许用户将超过 300 个 TGas 附加到任何给定交易来强制执行的。例如,如果您尝试附加 400 TGas,则会抛出服务器错误:

"TotalPrepaidGasExceeded":{"limit":300000000000000,"total_prepaid_gas":4000000000000000}

这意味着交易中每笔收据的所有销毁GAS总和不能超过300 TGas。

这不同于接收限制,后者概述了任何可以燃烧的最大 GAS 数量收到收据。该限制目前与交易限制(300 TGas)相同。您可以进行由许多不同收据组成的交易。 所有收据中所有已销毁的 GAS 总和不能超过 300 TGas,但任何一张收据不能销毁超过 300 TGas

历史上,交易和收款限额是不同的。收款限额过去是 200 TGas,但最近发生了变化。这意味着由于您可以将多少 GAS 附加到整个交易的上限,任何给定的收据都不可能用完超过 300 TGas。这意味着您的错误永远不会发生。

"ExecutionError": "Exceeded the maximum amount of gas allowed to burn per contract." 

当燃烧的GAS超过接收限制时抛出此错误。过去,这个限制是 200 TGas,如果你的交易中的任何收据计算量很大并且用掉了超过 200 TGas,就有可能超过这个限制。但是,随着限制的更改,这现在应该不是问题了。

最后一个限制是块限制,它概述了每个块可以燃烧的最大 GAS 量。此限制当前为 1 PetaGAS 或 1_000 TGas (0.1 $NEAR)。这相当于每个块最多约 1 秒。因此,1_000 Tgas 区块限制只是加强了 NEAR 想要拥有的 1 秒区块时间。

这些限制与 exceeding the prepaid gas 错误不同,因为它们是硬编码限制,不能超过。当您尝试燃烧比当前收据上附加的 GAS 多的 GAS 时,会出现超出预付 GAS 的错误。