常见问题解答 (FAQ)
TRON 常见技术问题与排查指南汇总。常见概念与参考类问题提供完整解答,而复杂的故障排查类问题则直接导向对应的专项诊断文档。
本常见问题解答(FAQ)汇总了在 TRON 网络上构建与运营应用时的常见疑问。
- 对于“如何计算 X”或“Y 的语法在哪里”等参考与概念类问题,下方直接提供了完整的技术解答;
- 对于“为什么 X 接口会失败”等故障排查类问题,本文提供了简要原因说明,并附带了前往相应专项诊断文档的链接,以便查阅更详尽的诊断工作流。
| 问题核心领域 | 推荐专项诊断文档 |
|---|---|
智能合约运行期异常(如 OUT_OF_TIME、REVERT、OUT_OF_ENERGY 等) | 智能合约错误诊断说明 |
| 交易广播响应码报错、RPC 频次限制、交易广播成功但未打包上链的异常 | 广播与 RPC 错误诊断 |
节点同步缓慢、节点启动异常、网络连接不稳或日志出现 different resultCode | 节点运维常见故障排查 |
初学者应该选择 Shasta 还是 Nile?
首次学习建议选择 Shasta。Shasta 更适合教程演练、钱包调试、普通合约部署测试和上线前最终验证;文档中的大多数快速示例也默认使用 Shasta endpoint。
Nile 更适合预演新功能、参数调整和治理提议。如果你只是想完成第一笔转账、部署普通测试合约或验证 DApp 流程,优先使用 Shasta。
为什么调用智能合约时必须提供 fee_limit 字段?
fee_limit 字段?fee_limit 是写入类智能合约交易中的调用方限额参数,单位为 sun(1 TRX = 1,000,000 sun)。节点会将该数值换算为调用方可承担的 Energy 上限;该上限同时约束调用方可使用的质押 Energy,以及在 Energy 不足时可通过燃烧 TRX 获得的 Energy。fee_limit 缺省为 0 时,调用方不能承担任何 Energy;除非合约部署方能够全额承担本次执行,否则调用会因 Energy 不足而失败。TRON 主网单笔交易 fee_limit 最大可设为 15,000 TRX,对应链参数 #47 getMaxFeeLimit。
调用方可承担的 Energy 与合约部署方可代付的 Energy(如有)共同构成 TVM 的总执行预算;执行所需 Energy 超过该合计上限时,TVM 会抛出 OUT_OF_ENERGY 并中止执行。因此,fee_limit 限制的是调用方在当前交易中可承担的 Energy,而不是调用方与部署方合计可使用的总 Energy。
- 关于详细的计算公式、与合约
origin_energy_limit参数的交互关系以及三种推荐的校准策略,请参阅 FeeLimit 与 Energy 成本。 - 关于运行时异常的 Energy 记账方式,请参阅 TVM 异常处理机制。
为什么我的合约调用会触发 OUT_OF_TIME 错误?
OUT_OF_TIME 错误?OUT_OF_TIME 既可能表示合约执行超过单笔交易的 CPU 时间预算,也可能由特定协议检查直接触发。应根据交易的具体错误消息判断原因。CPU 时间上限由链参数 #13(getMaxCpuTimeOfOneTx)控制,当前主网值为 80 毫秒,可通过 wallet/getchainparameters 查询。发生 OUT_OF_TIME 后,本次合约执行可使用的 Energy 额度会被全部耗尽;失败时尚未使用的部分也会记为已消耗。
→ 请参阅 智能合约错误诊断——OUT_OF_TIME 异常排查 获取完整的诊断方案与优化建议。
TRON 常见的 Token 燃烧(Burn)地址有哪些?
按照行业惯例,由字符 “0”、“1”、“2” 和 “dead” 派生出的特定地址被广泛用作空地址或燃烧地址。这些地址在数学上不属于任何已知的私钥控制者,一旦资产被发送至此类地址,该 Token 将永久无法被找回或使用。
| 燃烧地址名称 | 十六进制 (Hex) 地址格式 | Base58Check 地址格式 |
|---|---|---|
| "0" 地址 | 410000000000000000000000000000000000000000 | T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb |
| "1" 地址 | 410000000000000000000000000000000000000001 | T9yD14Nj9j7xAB4dbGeiX9h8unkKLxmGkn |
| "2" 地址 | 410000000000000000000000000000000000000002 | T9yD14Nj9j7xAB4dbGeiX9h8unkKT76qbH |
| "dead" 地址 | 41000000000000000000000000000000000000dead | T9yD14Nj9j7xAB4dbGeiX9h8upfCg3PBbY |
这些燃烧地址常被业务系统用于执行 Token 燃烧逻辑(以减少全网总流通量),或在 Token 合约的铸造(Mint)事件日志中作为初始的 from 发送方地址。
如何排查智能合约调用返回的 REVERT 错误?
REVERT 错误?REVERT 表示合约通过 REVERT 指令终止执行并回滚状态,常见原因包括 require 校验失败、显式调用 revert 以及 Solidity 0.8+ Panic(uint256)。此时只结算错误发生前实际消耗的 Energy,未使用的 Energy 额度不会计费。
具体的 Revert 文字原因(Error Message)存放在 /wallet/gettransactioninfobyid 接口返回的 contractResult[0] 字段中。该数据经过了 ABI 编码,通常排布在标准的 Error(string) 函数选择器(0x08c379a0)之后。
→ 请参阅 智能合约错误诊断——REVERT 错误解码指南 了解具体解码步骤及代码示例。
如何在交易广播前估算其所需消耗的 Bandwidth 与 Energy?
1. Bandwidth 估算
一笔交易在链上广播时所需扣除的 Bandwidth,等于其在底层 Protocol Buffers 序列化后的总字节大小。这包括以下三部分的序列化字节:
raw_data(交易明细)signature[](包含一个或多个签名数据)ret[](交易的执行结果返回值)
可以在广播前通过代码对交易大小进行高精度预估:
-
使用 Trident (Java SDK):
调用estimateBandwidth方法,该方法接收一个未签名或已签名的交易对象:public long estimateBandwidth(Transaction txn) { // 抹去执行结果,加上 64 字节的固定响应预留空间 long byteSize = txn.toBuilder().clearRet().build().getSerializedSize() + 64; return byteSize; } -
使用 TronWeb (JavaScript SDK):
function estimateBandwidth(signedTxn) { const DATA_HEX_PROTOBUF_EXTRA = 3; // Protobuf 序列化开销 const MAX_RESULT_SIZE_IN_TX = 64; // 固定响应预留空间 const A_SIGNATURE = 67; // 单个 Secp256k1 签名长度 let len = signedTxn.raw_data_hex.length / 2 + DATA_HEX_PROTOBUF_EXTRA + MAX_RESULT_SIZE_IN_TX; // 如果有签名,累加签名长度 if (signedTxn.signature) { for (let i = 0; i < signedTxn.signature.length; i++) { len += A_SIGNATURE; } } return len; }
2. Energy 估算
智能合约执行所消耗的 Energy 由 TVM 操作码(Opcode)逐条累加决定。各指令的具体收费标准参阅 TVM 指令集收费明细。常用估算接口如下:
- 调用
/wallet/triggerconstantcontract:在节点上执行静态模拟调用,该调用不会广播上链,接口会返回energy_used的估算值。参见 FeeLimit 设定策略三。 - 调用
/wallet/estimateenergy:通过多次模拟执行,返回交易成功所需的energy_required。自建 FullNode 需要同时启用vm.estimateEnergy = true和vm.supportConstant = true;公共 RPC 是否支持取决于运营方配置。如果节点未开放该接口,可使用/wallet/triggerconstantcontract获取单次模拟执行的energy_used。 - 部署测试网络对比:建议将合约先部署在 Shasta 或 Nile 测试网中发起真实交易测试,或在区块浏览器上对照相似业务逻辑合约的历史交易记录。
交易广播成功了,为什么在链上一直查不到交易状态?
这表明虽然交易成功被广播节点接收并放入了其本地的交易内存池,但未能成功分发并同步给当前的超级代表(SR)节点。这通常属于网络层面的传播受阻,而非交易本身的结构问题。
→ 请参阅 广播与 RPC 错误——广播成功但始终未上链诊断指南 了解如何执行等待或快速重发重试的决策流程。
为什么 GetTransactionInfoById 获取不到早期交易的回执信息?
GetTransactionInfoById 获取不到早期交易的回执信息?GetTransactionInfoById 查询节点本地保存的指定交易执行结果,并以 TransactionInfo 结构返回。返回内容包括区块高度、手续费、Energy 消耗、合约执行结果和事件日志等信息。节点不会在查询时根据交易本体重新生成回执。因此,即使 GetTransactionById 能够返回交易本体,如果当前节点没有保存对应的交易执行结果,GetTransactionInfoById 仍可能返回空对象 {}。
常见原因包括:
- 早期数据未保存:FullNode 的
/wallet/gettransactioninfobyid接口在Odyssey-v3.2中加入。如果节点处理早期区块时尚未写入对应的TransactionInfo,升级后也不会自动重新处理这些区块并补写回执。因此,部分早期交易能够返回交易本体,但无法返回交易回执。java-tron Issue #3989 记录了一个此类案例。 - 处理区块时未写入:如果节点处理相关区块时将
storage.transHistory.switch设置为off,TransactionInfo不会写入本地数据库。之后重新开启该配置只会影响新处理的区块,不会自动补齐已有缺口。 - 本地历史范围有限:轻节点从状态快照启动,不包含快照保留范围之前的历史数据;节点启动后新同步的数据会继续写入本地数据库。即使启用轻节点历史查询,也只能查询本地实际保存的数据。不同 RPC 服务使用的节点类型和数据库来源可能不同,因此可查询的历史范围也可能不同。
可以按以下顺序排查:
- 调用
GetTransactionById,确认交易是否存在于当前网络。如果该接口也无法返回交易本体,应检查交易 ID、网络选择、上链状态以及节点的历史数据范围。 - 如果能够返回交易本体,但
GetTransactionInfoById返回{},可以换用保存完整历史数据的全节点或 RPC 服务进行对比。 - 对于自建节点,确认
storage.transHistory.switch已开启。该配置不能恢复已经缺失的数据;需要查询相应历史回执时,应使用包含这些数据的完整全节点快照,或使用当前版本的 java-tron 从创世区块重新同步。
如何解决交易执行返回的 OUT_OF_ENERGY 错误?
OUT_OF_ENERGY 错误?这表明合约调用在执行完成前,已经耗尽了这笔交易可使用的全部 Energy。已消耗的 Energy 不会退还。
解决方案:
先重新预估 Energy,并在构建交易时调高 fee_limit;如果是合约所有者,也可以优化合约逻辑,或调整合约的 consume_user_resource_percent(用户付费比例)设置。
→ 请参阅 智能合约错误诊断——OUT_OF_ENERGY 排查清单 获取排查与修复步骤。
如何解决自建全节点区块同步缓慢或同步停止的问题?
导致同步停滞或缓慢的最常见原因包括:主机硬件配置(特别是磁盘 I/O 读写)未达标、配置文件中的 vm.maxTimeRatio 参数设置过低、或是 JVM 虚拟机分配的堆内存过小/过大导致频发 Full GC。
→ 请参阅 节点运维常见故障——区块同步停滞排查 获取排查步骤与资源建议。
广播交易时接口返回 SERVER_BUSY 报错该如何处理?
SERVER_BUSY 报错该如何处理?这表明连接的全节点的交易积压池已经达到了上限。
解决方案:
- 如果是节点运维人员,请在
config.conf中适度调高node.maxTransactionPendingSize以扩大内存池容量; - 如果使用的是托管 RPC 服务(如 TronGrid),请在客户端代码中引入指数退避重试机制,或者将流量分流至其他备用 Endpoint。
→ 详细内容请参阅 广播与 RPC 错误——SERVER_BUSY 错误处理。
如何排查与规避 TronGrid 接口返回的 HTTP 503 错误?
这表明请求速率触发了 TronGrid 的 IP/Key 限流阈值。
排查对策:
请确保所有接口请求头均正确携带了 TRON-PRO-API-KEY;合理降低客户端(如 DApp 启动加载时)的瞬时并发请求速率;严格遵循 503 响应头中返回的 Retry-After 限流等待策略。
→ 请参阅 广播与 RPC 错误——TronGrid 503 限频应对。
为什么调用 view 或 pure 合约方法时 constant_result 返回值为空?
view 或 pure 合约方法时 constant_result 返回值为空?这通常发生在自建全节点从 GreatVoyage-v4.2.2 或更高版本强行降级运行至 v4.2.1/v4.2.0 的情况。降级后的底层数据库在结构上缺失了高版本新引入的只读查询路径所需的特定字段。
→ 请参阅 智能合约错误诊断——constant_result 为空问题处理。
每种交易广播返回的错误码(如 SIGERROR、TAPOS_ERROR)代表什么含义?
SIGERROR、TAPOS_ERROR)代表什么含义?TRON 节点在交易预校验失败时会反馈 SIGERROR(签名错误)、BANDWITH_ERROR(资源不足)、TAPOS_ERROR(区块引用错误)等明确的代码。
→ 完整的错误码对照以及针对性的业务修复逻辑,请查阅 广播与 RPC 错误——广播接口响应码清单。
如何优化并加快自建 LevelDB 全节点的启动初始化速度?
对于采用了 LevelDB 存储引擎的全节点,可以使用 Toolkit 命令行工具包中提供的 LevelDB 启动优化工具。该工具能够提前预热并优化 LevelDB 的元数据索引以减少启动时的扫描等待。
→ 请参阅 节点运维常见故障——加速节点启动 获取详细的命令行调用方法。
如何在 TronWeb 中调用链上未公开注册 ABI 的合约方法?
某些合约的 ABI 已经被执行了 clearAbi 清除操作,或者是被其他合约在链上通过内部交易动态创建,因而其 ABI 未在区块浏览器上公开注册。对于这类合约,TronWeb 支持在前端构建合约实例时,由客户端显式传入对应的 ABI 结构:
可以查阅 TronWeb 合约文档 了解 tronWeb.contract(abi, contractAddress) 构造函数的用法及代码示例。
交易所或钱包在对接 TRON 网络时,如何高效扫描区块进行充提币资金检测?
对于交易所和资产托管平台,最稳妥的方案是遍历每一个最新的已固化区块,并根据区块数据中交易的 contract[0].type 进行分类分发,以此捕获 TRX 及各类 Token 的转账明细。需要特别注意:合约中触发的内部交易(Internal Transactions)需要通过收据(Receipt)进行专门的提取和解析。
→ 详细的解析逻辑与检测步骤,请参阅 交易所钱包集成指南——解析区块实现存款监听。
为什么针对同一个 TRC-20 Token(如 USDT)在不同时间转账消耗的 Energy 不同?
这取决于两点:
- 接收方账户的存储状态:接收方账户如果余额为零,写入数据时会占用新存储槽,导致
SSTORE操作码消耗 20,000 Energy;若其余额不为零,由于只是修改已存在槽位的值,仅会扣除 5,000 Energy。 - 动态 Energy 模型限制:如果目标合约由于在当前维护周期中消耗了过多的系统计算资源而触发了动态惩罚机制,其单笔调用将面临根据惩罚乘数增加的 Energy 开销。
→ 深入了解该机制及 USDT 转账 Energy 差异分析,请参阅 智能合约错误诊断——TRC-20 Energy 成本差异。
为什么在使用多重签名(账户权限管理)执行 Stake 2.0 交易时,接口报错返回 "permission denied"?
这通常发生在那些在 TRON Stake 2.0 升级上线前就已配置好 Active 权限的早期多重签名账户上。由于配置较早,这些账户的 Active 权限所定义的 operations(操作控制权限位图)中,未包含最新引入的 Stake 2.0 合约类型 ID(即 ID 值为 54 至 59 的相关合约操作)。
→ 完整的合约类型 ID 列表以及权限位图修复流程,请参阅 智能合约错误诊断——多重签名 Stake 2.0 权限拒绝排查。
客户端如何手动解析并反序列化交易对象中的 raw_data_hex 字段?
raw_data_hex 字段?交易对象返回的 raw_data 可以通过 Protobuf 规范直接序列化为二进制字节,进而转化为 raw_data_hex 十六进制字符串:
{
"raw_data": {
"contract": [{
"parameter": {
"value": {
"data": "a9059cbb000000000000000000000000...",
"owner_address": "41b3dcf27c251da9363f1a4888257c16676cf54edf",
"contract_address": "41eca9bc828a3005b9a3b909f2cc5c2a54794de05f"
},
"type_url": "type.googleapis.com/protocol.TriggerSmartContract"
},
"type": "TriggerSmartContract"
}],
"ref_block_bytes": "1b98",
"ref_block_hash": "4e1c1e7428d1d7a4",
"expiration": 1719223548000,
"fee_limit": 30000000,
"timestamp": 1719223489371
},
"raw_data_hex": "0a021b98..."
}可以直接通过 JVM 下的 Trident SDK 工具包对 raw_data_hex 进行高效的反序列化和字段提取:
import com.google.protobuf.Any;
import com.google.protobuf.InvalidProtocolBufferException;
import org.tron.trident.abi.TypeDecoder;
import org.tron.trident.abi.datatypes.Address;
import org.tron.trident.abi.datatypes.generated.Uint256;
import org.tron.trident.core.ApiWrapper;
import org.tron.trident.core.utils.ByteArray;
import org.tron.trident.crypto.Hash;
import org.tron.trident.proto.Chain.Transaction;
import org.tron.trident.proto.Contract;
import org.tron.trident.proto.Contract.TriggerSmartContract;
import java.math.BigInteger;
public class Demo {
public void parseRawDataHex() throws InvalidProtocolBufferException {
// 使用十六进制字符串解析交易的 raw_data 明文
String rawDataHexString = "0a021b98..."; // 为简洁,此处省略了长十六进制
Transaction.raw rawData = Transaction.raw.parseFrom(ByteArray.fromHexString(rawDataHexString));
System.out.println("参考区块高度引用字节: " + ApiWrapper.toHex(rawData.getRefBlockBytes())
+ "\n参考区块哈希引用字节: " + ApiWrapper.toHex(rawData.getRefBlockHash())
+ "\n过期时间戳: " + rawData.getExpiration()
+ "\n交易时间戳: " + rawData.getTimestamp()
+ "\nfee_limit: " + rawData.getFeeLimit()
+ "\n交易合约类型: " + rawData.getContract(0).getType());
Transaction.Contract contract = rawData.getContract(0);
Any contractParameter = contract.getParameter();
switch (contract.getType()) {
case TriggerSmartContract:
TriggerSmartContract triggerSmartContract = contractParameter.unpack(TriggerSmartContract.class);
System.out.println("调用合约地址: " + ApiWrapper.toHex(triggerSmartContract.getContractAddress())
+ "\n调用发起人地址: " + ApiWrapper.toHex(triggerSmartContract.getOwnerAddress())
+ "\n调用数据 (Data Payload): " + ApiWrapper.toHex(triggerSmartContract.getData()));
// 进一步解码 Data Payload
decodeContractInputData(ApiWrapper.toHex(triggerSmartContract.getData()));
break;
default:
break;
}
}
// 演示如何手动提取并解码 Data 字段(如 transfer(address,uint256) 方法)
public void decodeContractInputData(String DATA) {
String rawSignature = DATA.substring(0, 8);
String functionSignatureExample = "transfer(address,uint256)";
String functionSelectorExample = Hash.sha3String(functionSignatureExample).substring(2, 10);
if (rawSignature.equals(functionSelectorExample)) {
Address rawRecipient = TypeDecoder.decodeAddress(DATA.substring(8, 72));
Uint256 rawAmount = TypeDecoder.decodeNumeric(DATA.substring(72, 136), Uint256.class);
BigInteger amount = rawAmount.getValue();
System.out.println("解析出的调用方法: " + functionSignatureExample);
System.out.println("转账金额: " + amount + " 至接收地址: " + rawRecipient.toString());
}
}
}- 关于如何反向从函数签名构建
data编码参数以触发合约调用,请参阅地址与数据编码指南。
如何在本地构建交易时,手动设置交易的 TAPOS 参考区块信息?
交易中的 ref_block_bytes 只有 2 字节,最多只能表达 65,536 种区块高度后缀;节点实际校验时会在本地 RecentBlockStore 的近期区块记录中查找对应参考区块。实际开发中,建议查询并引用近期的最新已固化区块,以降低链头临时分叉导致 TAPOS 失效的风险。
基于 Trident (Java SDK) 的配置参考如下:
public void setReference(long blockNum, byte[] blockHash) {
// 将区块高度转为字节数组
byte[] refBlockNum = ByteArray.fromLong(blockNum);
Transaction.raw rawData = this.transaction.getRawData().toBuilder()
// 取区块哈希的第 8 至 16 字节作为引用哈希值
.setRefBlockHash(ByteString.copyFrom(ByteArray.subArray(blockHash, 8, 16)))
// 取区块高度的第 6 至 8 字节作为引用高度值
.setRefBlockBytes(ByteString.copyFrom(ByteArray.subArray(refBlockNum, 6, 8)))
.build();
setRawData(rawData);
}
注意一笔交易被构建后,其默认的有效期限仅为 60 秒(对应
Constant.java中配置的TRANSACTION_DEFAULT_EXPIRATION_TIME)。因此,请尽量在接近发送前再执行交易构建,并快速完成签名和广播,避免在本地停留过久触发过期异常。详细细节请查阅 API 工作流中的常见陷阱。
如何调整节点处理 triggerconstantcontract 等请求的执行超时时间?
triggerconstantcontract 等请求的执行超时时间?在 GreatVoyage-v4.8.2 及更高版本中,可以在节点配置文件 config.conf 中设置 vm.constantCallTimeoutMs,调整节点处理以下请求时的 TVM 模拟执行超时时间:
triggerconstantcontractestimateenergyeth_calleth_estimateGastriggersmartcontract(仅在所调用的合约函数被标记为constant、view或pure时适用)
vm.constantCallTimeoutMs 以毫秒为单位,配置值只能为 0 或正整数。未配置或设置为 0 时,模拟执行超时时间与智能合约交易的 TVM 最大执行时间相同。修改配置后,需要重启节点使其生效。
如果设置的模拟执行超时时间高于智能合约交易的 TVM 最大执行时间,estimateenergy 等能量估算请求可能正常返回,但对应交易仍可能因执行超时而失败。
如何在隔离测试环境中临时绕过智能合约交易的 TVM 执行时间限制?
可以,但仅限完全隔离的私有链或不连接公共网络的本地测试环境。在这类环境中,可以使用 --debug 参数启动节点,使 TVM 在执行智能合约交易时跳过 CPU 超时检查。
如果只需要延长 triggerconstantcontract、estimateenergy 等请求的模拟执行时间,请参阅模拟执行超时时间配置说明,不要使用 --debug。
--debug 还会影响节点对区块中智能合约交易的执行和验证,因此不得用于连接 Mainnet、Nile 等公共网络的节点。
有关启动方式、具体影响及 different resultCode 风险,请参阅节点运维常见故障——在隔离测试环境中绕过交易执行时间限制。
如何在全节点运行达到特定区块高度后让其自动停止退出?
可以在自建全节点的配置文件 config.conf 中的 node.shutdown 配置域下,指定 BlockTime、BlockHeight 或 BlockCount 中的任意一项。当节点同步满足该配置条件时,其后台的同步引擎将优雅停止并自动安全退出进程。
从 GreatVoyage-v4.8.2 开始,这三个条件退出配置也适用于 SolidityNode。
→ 请参阅 节点运维常见故障——配置节点进程按条件自动退出。
如何提升自建全节点的网络连通稳定性并合理限制网络资源占用?
常用的调优手段有两个:一是使用 JVM 的 -XX:MaxDirectMemorySize 参数来限制虚拟机可以直接分配的堆外直接内存空间,以防进程 OOM;二是在主机上配置 Linux iptables --hashlimit 防火墙规则,对特定端口(如 P2P 默认的 18888 端口)的 TCP 连接并发吞吐速率进行硬限速。
→ 具体的服务器命令配置与防火墙参数,请查阅 节点运维常见故障——网络连通性与流量控制调优。
为什么我的节点停止了同步,并且后台日志里报错出现 different resultCode?
different resultCode?这代表全节点本地重放执行某一区块中交易的结算结果,与该区块在网络超级代表(SR)广播出块时记录的共识执行结果产生了偏差。
最常见的引发原因包括:
- 节点的服务器硬件性能不足(如磁盘速度过慢),导致交易执行遭遇了超时中断;
- 节点的 LevelDB/RocksDB 数据库文件发生了物理损坏;
- 本地节点不合规地运行在开启了
--debug调试模式的参数环境下。
→ 请参阅 节点运维常见故障——different resultCode 异常排查。
相关资源
- 智能合约错误诊断说明 —— 全面诊断 OutOfTime、Revert、OutOfEnergy 等虚拟机运行期报错
- 广播与 RPC 错误诊断 —— 详细了解各类广播返回码定义与 TronGrid 限速对策
- 节点运维常见故障排查 —— 诊断节点区块同步、不同步和 P2P 网络丢包
- FeeLimit 与 Energy 成本 —— 正确配置客户端的 fee_limit 预算参数
- TVM 异常处理机制 —— 了解 TRON 虚拟机协议底层的各类异常表现
- 错误与调试说明 —— API 层错误的分类定位与解码指南
Updated 2 days ago
