确认语义

区分广播接收、交易打包、执行收据、已固化区块和索引数据延迟,避免把中间状态当作最终结果。

TRON API 会在不同阶段返回不同类型的数据。集成时应先判断当前拿到的是广播接收结果交易本体执行收据已固化状态,还是索引服务数据。不要把中间状态当作最终结果。

📘

前置阅读


状态语义速查

你看到的结果代表什么不代表什么下一步
BroadcastTransaction 返回 result: true广播节点接受交易,并尝试放入本地 mempool不代表交易已打包、执行成功或已固化继续查询交易本体或 receipt
GetTransactionById 返回交易对象节点能找到交易本体,包括 raw_data、签名和合约参数不代表合约执行成功;也不包含手续费、Event 或内部交易查询 GetTransactionInfoById
GetTransactionInfoById 返回 receipt交易已被执行,并产生手续费、Energy、Event、内部交易等执行结果FullNode 版本不一定表示已固化需要最终状态时查询 SolidityNode 版本
SolidityNode 返回交易或区块数据来自已固化区块不代表可以查询完整历史索引可作为最终确认或对账依据
TronGrid 返回历史交易或 Event索引服务已经处理到对应数据不等同于节点原生当前状态;可能受分页、限流和索引延迟影响对关键状态可用节点或自建索引复核

广播接收不等于执行成功

广播接口只检查交易是否能被节点接受。它不会告诉你合约是否执行成功,也不会告诉你交易是否已经进入已固化区块。

常见错误是把下面的响应直接当作最终成功:

{ "result": true, "txid": "..." }

正确流程是继续查询 receipt:

  1. GetTransactionById 查询交易本体,确认节点能找到这笔交易。
  2. GetTransactionInfoById 查询执行 receipt。
  3. 需要最终状态时,用 GetTransactionInfoById,SolidityNode 查询已固化 receipt。

交易本体不等于执行收据

交易本体描述“请求方提交了什么”,执行收据描述“链上实际执行后发生了什么”。

数据类型推荐接口包含内容
交易本体GetTransactionByIdraw_data、签名、合约调用参数
执行收据GetTransactionInfoById手续费、Energy 消耗、合约执行状态、Event、内部交易
已固化执行收据GetTransactionInfoById,SolidityNode已固化区块中的执行收据

对普通 TRX / TRC-10 顶层转账,交易本体通常已经包含收款地址和金额。对 TriggerSmartContract,必须读取 receipt 才能判断实际执行结果。


最新链头不等于已固化状态

FullNode 返回节点当前看到的最新链头。这个状态延迟低,但可能尚未固化。SolidityNode 返回最新已固化区块上的状态,通常比链头落后约 1 分钟。

读取目标推荐接口
最新区块展示GetNowBlock,FullNode
最新已固化区块GetNowBlock,SolidityNode
按高度查询最新链头视图GetBlockByNum,FullNode
按高度确认是否已固化GetBlockByNum,SolidityNode

如果流程需要最终状态(如交易确认、余额对账、报表生成和区块监听),应基于 SolidityNode 或本地已固化区块索引判断。


索引数据不等于节点原生状态

TronGrid V1 API 和自建索引器适合查询账户历史、TRC-20 转账历史、Event、内部交易和聚合统计。索引服务通常比直接扫块更方便,但要考虑分页、限流、重试和索引延迟。

当你需要完整状态判断时,可以按以下方式组合:

  1. 用 TronGrid 或自建索引器发现候选交易、Event 或内部交易。
  2. 用 SolidityNode receipt 或已固化区块扫描确认最终状态。
  3. 在本地保存已处理的 block number、transaction ID 和 log index,保证重试幂等。

相关资源