波场合约调用由谁付费:资源分摊机制
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
- 部署者分担比例(
consume_user_resource_percent):- 设为
100时,调用者支付全部能量。 - 设为
0时,只要创建者有可用资源,就由合约创建者支付 100% 的能量。 - 设为
1到99之间时,执行能量在调用者和创建者之间按比例分摊。
- 设为
- 部署者能量上限(
origin_energy_limit):- 创建者在单次调用中最多承担的能量。超出部分由调用者支付。
- 回落到调用者:
- 如果部署者质押获得的能量已耗尽,或超过
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。