波场合约调用由谁付费:资源分摊机制

TRON 虚拟机如何决定合约能量由谁支付:consume_user_resource_percent、origin_energy_limit 与调用者付费顺序。

发布于 · 更新于

在 TRON 区块链上,智能合约的执行费用并不一定由调用者承担。与发起交易的账户总是支付 gas 的 EVM 网络不同,**TRON 虚拟机(TVM)**采用双付费方的资源模型,由两个合约级设置控制:consume_user_resource_percent 和 origin_energy_limit。

理解这两个参数,就能明白为什么 USDT TRC-20 的发送方最终要支付全部能量,而某些去中心化应用(DApp)和测试网合约却可以为用户代付执行 gas。

USDT TRC-20 合约(TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t)将 consume_user_resource_percent 设为 30,origin_energy_limit 设为 10,000,000[3]:从参数配置上看,创建者为每次调用承担 70%。但我们在 2026-10-03 查询时,创建者账户只有 9,330 能量且已全部用完[4],因此发送方要支付全部 64,285 或 130,285 能量。

TVM 资源分摊的判定顺序

当交易触发 TRON 上的智能合约方法时,TVM 按以下顺序判定资源由谁支付:

Contract Execution Request
            |
            v
Check `consume_user_resource_percent` (0 - 100%)
            |
  +---------+---------+
  |                   |
Caller Portion     Deployer Portion (100 - X%)
  |                   |
  |                   v
  |         Check deployer `origin_energy_limit` & balance
  |                   |
  |         +---------+---------+
  |         |                   |
  |     Sufficient         Exhausted
  |         |                   |
  v         v                   v
Caller   Deployer            Fallback:
Energy   Energy              Billed to Caller
  1. 部署者分担比例(consume_user_resource_percent):
    • 设为 100 时,调用者支付全部能量。
    • 设为 0 时,只要创建者有可用资源,就由合约创建者支付 100% 的能量。
    • 设为 1 到 99 之间时,执行能量在调用者和创建者之间按比例分摊。
  2. 部署者能量上限(origin_energy_limit):
    • 创建者在单次调用中最多承担的能量。超出部分由调用者支付。
  3. 回落到调用者:
    • 如果部署者质押获得的能量已耗尽,或超过 origin_energy_limit,TVM 会把剩余缺口计到调用者头上。如果调用者也没有能量和可用的 TRX,交易会以 OUT_OF_ENERGY 回滚。

对开发者的实际影响

  • USDT: 创建者的分担比例已设定(70%),但没有资源支撑,所以发送方要支付全部能量:需要能量或 TRX。
  • 为用户免 gas 接入: DApp 开发者可以在部署者地址上质押 TRX,并设置 consume_user_resource_percent = 0,为调用者承担能量,每次调用以 origin_energy_limit 为上限(调用者仍需支付带宽)。

如需模拟合约的资源分摊,可参考我们的指南在 Nile 测试网测试合约能量,在 Nile 上测试你的调用。

常见问题

在波场上,智能合约执行总是由调用者付费吗?

默认是的。不过 TRON 允许合约创建者通过设置 consume_user_resource_percent 和 origin_energy_limit 参数,为调用者分担能量。

TRON 中的 consume_user_resource_percent 是什么?

这是智能合约的一个配置参数(0 到 100),决定执行所需能量中由调用者承担的百分比,其余部分由合约创建者承担。

USDT TRC-20 转账由谁付费?

实际上是发送方。USDT 合约将 consume_user_resource_percent 设为 30,因此创建者本应为每次调用承担 70%,上限 10,000,000 能量;但 2026-10-03 查询时,创建者账户只有 9,330 能量且已全部用完,所以全部费用都落回发送方。

合约创建者的能量耗尽后会怎样?

剩余部分由调用者支付:先用调用者自己的能量,不够时燃烧 TRX。