内部交易
智能合约执行过程中触发的资产转移记录:可被 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 序号 | 字段 | 说明 |
|---|---|---|
| 1 | hash | 内部交易唯一标识。根内部交易的哈希等于父交易 ID;子内部交易使用派生哈希,确保每个子调用都有独立 ID。 |
| 2 | caller_address | 发起转移的合约地址。 |
| 3 | transferTo_address | 接收方地址。 |
| 4 | callValueInfo[] | 转移资产列表。每个条目包含 callValue(金额,单位为 sun)和 tokenId(TRX 转账为空,TRC-10 转账为对应 Token ID)。 |
| 5 | note | 调用类型标签,常见取值包括 call、create 和 suicide(由 SELFDESTRUCT 触发)。 |
| 6 | rejected | 父交易回滚时为 true。 |
| 7 | extra | 可选上下文信息,通常为空。 |
如果父交易 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 如需保存普通
call、create和suicide类型,应在config.conf中设置vm.saveInternalTx = true并重启节点;该设置仅影响重启后处理的交易,不会补齐已有历史记录。如需保存 Stake 2.0、投票等扩展类型,还需启用vm.saveFeaturedInternalTx。托管 RPC 是否返回内部交易取决于服务提供方的节点配置。
与以太坊内部交易的对比
TRON 的内部交易与以太坊常说的 internal transactions / traces 概念接近:都表示合约执行期间触发的价值流转,都不是独立签名的链上交易,也都依附于外层交易结果。
主要差异如下:
| 对比维度 | TRON | Ethereum |
|---|---|---|
| 原生资产转移 | TRX 和 TRC-10 | ETH |
| 查询方式 | 作为交易回执的 internal_transactions 数组返回 | 通常通过 debug_traceTransaction 等追踪接口重建 |
| Token 转账追踪 | TRC-20 通过事件日志追踪 | ERC-20 通过事件日志追踪 |
API
| API | 说明 |
|---|---|
wallet/gettransactioninfobyid | 查询交易回执,其中包含 internal_transactions 数组。 |
wallet/triggerconstantcontract | 模拟合约调用,不产生链上状态变更,可在响应中查看模拟执行结果。 |
相关资源
Updated 11 days ago