TRON Developer Hub CN

TRON开发者中心

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

Get Started    

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

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

解释
fee_limit表示的是合约调用者最多能够忍受这笔交易消耗的总energy的价值。

fee_limit单位是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设置的过大引起过大的损失。

3.波场网络的销毁地址是什么?

Base58格式:T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb
HexString格式:410000000000000000000000000000000000000000

4.调用合约,返回revert报错如何进行排查?

答案
1.首先根据txid,通过wallet/gettrasactioninfobyid接口查询返回的结果中contractResult字段,如果字段不为空, 可以看到message的abi编码值,将编码值转成字符串,查找报错原因
例如 txid:e5e013e81cb50a4c495a11c8130ad165a4e98d89b9e3fb5b79e6111bf23b31ed
返回contractResult数据:
"contractResult": [ "08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001e536166654d6174683a207375627472616374696f6e206f766572666c6f770000"
]
将1e536166654d6174683a207375627472616374696f6e206f766572666c6f77转成字符串是:SafeMath: subtraction overflow,这笔交易是因为转账时,转出地址做减法操作时溢出,具体失败原因可能是余额不足引起,需要检查地址余额及转出金额,其他报错可根据具体报错原因进行排查。

2.如果contractResult为空,则可能是合约中不带message的require断言失败导致,具体可参考文档及查看合约源码进行分析。

5.如何计算调用合约时消耗的带宽及能量?

答案
1.带宽根据交易protobuf编码后的字节数计算。
2.能量根据合约执行的指令来扣费,不同的指令扣费不一样 ,越复杂的合约则消耗的能量则越多。目前合约消耗的能量可以通过在测试网测试或者通过tronscan查看该合约之前的历史调用来预估。
资源模型可参考文档

Updated about 23 hours 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.