TRON Developer Hub CN

TRON开发者中心

欢迎来到TRON开发者中心。您将找到全面的指南和文档,以帮助您尽快开始使用TRON Developer Hub,并在遇到困难时提供支持。让我们跳进去吧!

Get Started    

1.发送智能合约调用交易时,为什么要填写fee_limit字段?

答案
防止合约调用交易消耗过多energy

解释
fee_limit表示的是合约调用者最多能够忍受这笔交易消耗的总energy的价值,单位是sun,最大可以设为1e9,如果用户不设置fee_limit,默认值是0。比如在交易中fee_limit设置为1000sun, 那么表示合约调用者最多忍受这笔交易消耗100energy(目前energy的单价是10sun)。

如果交易执行消耗的energy数量超过了fee_limit*energy单价, 就会停止合约执行,并触发OUT_OF_ENERGY错误。

有些合约函数中会存在复杂的循环, 用户在不知道的情况下误调用, 可能会导致用户消耗过多的energy, 于是用户可以设定这个fee_limit字段来设置一个上限。

有一些情况会导致所有的fee_limit被扣除:

  • 合约执行过程中遇到非法指令
  • 合约调用超时,触发OUT_OF_TIME错误
  • 如果你访问数组的索引太大或为负数(例如 x[i] 其中 i >= x.length 或 i < 0)
  • 如果你访问固定长度 bytesN 的索引太大或为负数
  • 如果你用零当除数做除法或模运算(例如 5 / 0 或 23 % 0 )
  • 如果你移位负数位
  • 如果你将一个太大或负数值转换为一个枚举类型
  • 如果你调用未被初始化的内部函数类型变量
  • 合约中调用assert的参数(表达式)最终结果是false
  • 发生JVMStackOverFlowException
  • 发生OutOfMem异常,即内存超过了3M
  • 合约运行过程中,发生了加法等溢出

2.调用合约,为什么会触发OUT_OF_TIME错误?

答案
合约函数复杂度太高或者SR节点的性能波动。

解释
目前TRON 有一个全局设定, 智能合约调用的交易,执行时间不能超过50ms, 这个50ms参数可以通过SR投票修改。如果合约代码复杂很高,导致执行时间超过50ms,会触发OUT_OF_TIME错误,同时扣除全部fee_limit费用。

如果同一个合约函数,有时会触发OUT_OF_TIME错误,有时不会触发OUT_OF_TIME错误,说明合约代码的复杂度在一个临界值,由于不同的SR的机器性能不一样, 所以会导致间歇性触发。

另外需要注意的是由于SR机器性能的波动,会存在很小的概率导致复杂度非常低的合约函数调用也会触发OUT_OF_TIME错误。建议用户根据合约复杂度设置适当的fee_limit,防止fee_limit设置的过大引起过大的损失。

Updated about a month ago

FAQ


Suggested Edits are limited on API Reference Pages

You can only suggest edits to Markdown body content, but not to the API spec.