内部交易

智能合约执行过程中触发的资产转移记录:可被 DApp 查询和区块浏览器展示,但不是独立链上交易。

智能合约执行时,合约逻辑可能转移 TRX 或 TRC-10 Token。这类由合约触发的资产转移称为内部交易(Internal Transaction)

内部交易不是独立链上交易。它们作为外层交易执行回执的一部分被记录,可通过节点 API 查询,也通常会在区块浏览器的父交易详情页中展示为子列表。

📘

前置阅读


哪些操作会产生内部交易

当智能合约在执行过程中向其他账户发起 TRX 或 TRC-10 转移时,网络会记录内部交易。常见场景包括:

  • 合约向外部账户转账 TRX,例如 address.transfer(amount)
  • 合约向另一个合约转账 TRX,例如调用 payable 函数时附带 value
  • 合约触发 TRC-10 Token 转移。
  • 向未激活地址转账,从而触发账户创建和激活。

一笔外层交易可能产生零条、一条或多条内部交易,取决于合约执行路径。

📘

TRC-20 转账不属于这里的内部交易

TRC-20 Token 由智能合约存储维护余额,不会触发协议层原生资产转移。追踪 TRC-20 转账时,应解析该 TRC-20 合约抛出的 Transfer 事件日志。


内部交易结构

每条内部交易包含以下字段:

Proto 序号字段说明
1hash内部交易唯一标识。根内部交易的哈希等于父交易 ID;子内部交易使用派生哈希,确保每个子调用都有独立 ID。
2caller_address发起转移的合约地址。
3transferTo_address接收方地址。
4callValueInfo[]转移资产列表。每个条目包含 callValue(金额,单位为 sun)和 tokenId(TRX 转账为空,TRC-10 转账为对应 Token ID)。
5note调用类型标签,常见取值包括 callcreatesuicide(由 SELFDESTRUCT 触发)。
6rejected父交易回滚时为 true
7extra可选上下文信息,通常为空。

如果父交易 revert,关联内部交易会标记为 rejected = true。此时资产转移不会真正生效,但记录仍保留在回执中,便于调试和追踪执行路径。


查询内部交易

内部交易附属于父交易回执。调用 wallet/gettransactioninfobyid,传入父交易 ID 即可查询:

BASE_URL=https://api.trongrid.io

curl -X POST ${BASE_URL}/wallet/gettransactioninfobyid \
  -d '{"value": "<txid>"}'

如果父交易产生了内部交易,响应中会包含 internal_transactions 数组,每个条目都遵循上面的结构。

TronScan 等区块浏览器通常也会在父交易详情页展示内部交易列表。

📘

内部交易默认不记录

java-tron 默认不将内部交易写入本地交易回执。自建 FullNode 如需保存普通 callcreatesuicide 类型,应在 config.conf 中设置 vm.saveInternalTx = true 并重启节点;该设置仅影响重启后处理的交易,不会补齐已有历史记录。如需保存 Stake 2.0、投票等扩展类型,还需启用 vm.saveFeaturedInternalTx。托管 RPC 是否返回内部交易取决于服务提供方的节点配置。


与以太坊内部交易的对比

TRON 的内部交易与以太坊常说的 internal transactions / traces 概念接近:都表示合约执行期间触发的价值流转,都不是独立签名的链上交易,也都依附于外层交易结果。

主要差异如下:

对比维度TRONEthereum
原生资产转移TRX 和 TRC-10ETH
查询方式作为交易回执的 internal_transactions 数组返回通常通过 debug_traceTransaction 等追踪接口重建
Token 转账追踪TRC-20 通过事件日志追踪ERC-20 通过事件日志追踪

API

API说明
wallet/gettransactioninfobyid查询交易回执,其中包含 internal_transactions 数组。
wallet/triggerconstantcontract模拟合约调用,不产生链上状态变更,可在响应中查看模拟执行结果。

相关资源

  • 交易 — 顶层交易结构、生命周期与防重放机制
  • 签名校验 — 交易签名验证与多签权限
  • 监听事件 — 追踪 TRC-20 Token 转移事件