TRON Developer Hub CN

TRON开发者中心

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

Get Started    

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

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

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

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

如果交易执行消耗的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 有一个全局设定, 智能合约调用的交易,执行时间不能超过80ms, 这个80ms参数可以通过SR投票修改。如果合约代码复杂很高,导致执行时间超过80ms,会触发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/gettransactioninfobyid接口查询返回的结果中contractResult字段,如果字段不为空, 可以看到message的abi编码值,将编码值转成字符串,查找报错原因
例如 txid:e5e013e81cb50a4c495a11c8130ad165a4e98d89b9e3fb5b79e6111bf23b31ed
返回contractResult数据:
"contractResult": [ "08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001e536166654d6174683a207375627472616374696f6e206f766572666c6f770000"
]
将1e536166654d6174683a207375627472616374696f6e206f766572666c6f77转成字符串是:SafeMath: subtraction overflow,这笔交易是因为转账时,转出地址做减法操作时溢出,具体失败原因可能是余额不足引起,需要检查地址余额及转出金额,其他报错可根据具体报错原因进行排查。

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

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

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

6.交易广播成功后,为什么链上查询不到?

答案
交易广播成功但是没有上链,是因为节点所在网络或其他未知原因导致该交易没有广播给SR节点,这种情况下,因为交易都有有效期,最好加上延迟判断,超过交易的有效期再加一点额外的时间还未上链,可以判断这个交易已经超过有效期,可以重新发起交易,或者在有效期内重新广播该交易。

7.如何解决“OUT_OF_ENERGY”报错?

答案
1.需要检查调用合约的地址是否有TRX及是否足够支付燃烧能量或带宽费用,否则该地址需要获取足够的TRX。
2.如果有足够的TRX,则交易设置的feelimit较小,需要提高feelimit设置。

8.如何解决节点区块同步慢或者停止同步问题?

答案
1.提高机器配置,推荐16core 32GRAM 1T硬盘(ssd)

确保单个物理cpu的逻辑core的数量大于等于16,下面的命令的结果中,cpu cores和siblings两者的最大值需要大于等于16

$cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq
cpu cores : 8
siblings : 16
2.提高验证交易的时间容忍度
节点配置文件中maxTimeRatio配置项的值提高到20.0或者以上

vm = {
supportConstant = false
minTimeRatio = 0.0
maxTimeRatio = 20.0
saveInternalTx = false
}
3.修改java-tron的启动参数,增加并行垃圾回收参数:XX:+UseConcMarkSweepGC 及-Xmx参数
类似
java -Xmx24g -XX:+UseConcMarkSweepGC -jar FullNode.jar -c .....
-XX:+UseConcMarkSweepGC 要放在 -jar 参数前面,不能放在最后面
-xmx可以设置成物理内存的80%

9.如何解决SERVER_BUSY报错?

答案
如果节点未处理的交易数量超过2000会返回server busy错误, 根据机器情况,可以通过修改节点配置文件中的node.maxTransactionPendingSize来增加PendingSize。 比如设置node.maxTransactionPendingSize = 5000。

10.如何解决TronGrid 503 Service Temporarily Unavailable报错?

答案
因目前TronGrid对所有TronGrid请求有IP频率限制,对于使用API Key的TronGrid HTTP请求, IP频率限制为15QPS,不使用API Key的TronGrid HTTP请求,目前IP频率限制为10QPS并且会定期逐渐下降。使用TronGrid GRPC服务目前IP频率限制为15QPS,超出频率限制后将返回503错误,如有503报错,请降低TronGrid请求频率,及建议尽快添加API Key。

11.如何解决调用合约pureView方法时返回的Transaction中缺少Constant_result字段?

答案
此问题目前只见于用户将java-tron版本从GreatVoyage-v4.2.2(Lucretius)或其他更高版本降级到GreatVoyage-v4.2.1(Origen)(或者GreatVoyage-v4.2.0(Plato)版本) 后,如果用户遇到此问题,需要使用修复工具对数据库进行修复,修复完成之后使用 GreatVoyage-v4.2.2.1(Epictetus)或者更高版本即可正常启动节点。 详细操作步骤参看DBReqair.jar使用指南

12. 常见广播错误码说明

错误码

原因

解决方案

SIGERROR

签名错误

  1. 检查用以签名的私钥是否和发起交易的地址一致

  2. 检查私钥格式是否错误

BANDWITH_ERROR

发起交易需要的带宽不足,并且没有足够的TRX燃烧

向账户中充值TRX,或者用其他账号代理带宽给此账号

DUP_TRANSACTION_ERROR

广播了相同哈希的交易

  1. 重新创建交易

  2. 换一个节点重新广播

TAPOS_ERROR

reference block与交易不在同一条链上

  1. 如果是通过自建节点API创建交易,可以修改节点配置 trx.reference.block = "solid"

  2. 如果是本地创建的交易,建议引用最新已固化的区块

TOO_BIG_TRANSACTION_ERROR

交易过大,可能是交易的memo过长

减少交易的大小

TRANSACTION_EXPIRATION_ERROR

交易过期。节点配置中,默认的交易过期时间是60秒,如生成交易与广播的间隔超过此时间即为超时

在交易过期前广播交易。自建节点可以在配置中修改交易有效期。公共节点无法修改,默认为60秒

SERVER_BUSY

网络繁忙

等待,错开网络繁忙的时间再重新发送交易

NOT_ENOUGH_EFFECTIVE_CONNECTION

节点未同步到最新区块

通过Tronscan查询当前的区块高度,并与本地节点/wallet/getnowblock的结果进行比较

OTHER_ERROR

未知错误

只能通过节点日志来获取到详细的错误信息

CONTRACT_VALIDATE_ERROR

交易(系统合约)验证失败

任何的参数错误都可能导致这个错误,需要解析错误消息查看详情。常见错误消息见下表

CONTRACT_VALIDATE_ERROR常见错误说明

错误信息

说明

account does not exist

发起交易的账号未激活

Validate *** error, no OwnerAccount

Owner address不正确

No contract or not a valid smart contract

合约地址错误

this node does not support constant

节点的vm.supportconstant没有设置为1,常见于自建节点

Updated 11 days 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.