FeeLimit
在TRON网络中,除了合约层级的能量分摊配置,合约交易还引入了交易级别参数 FeeLimit,用于限制调用者可承担的能量支出上限,从而提供更灵活的成本控制手段。
交易成本控制参数 FeeLimit
FeeLimit 是指调用者愿意为本次智能合约部署或调用交易所支付的能量成本上限,单位为 sun(1 TRX = 1,000,000 sun)。当前网络允许设置的FeeLimit最大值为15,000 TRX,即15,000,000,000 sun。
需要注意的是,FeeLimit 仅用于限制调用者在本次交易中可承担的能量支出上限,并不影响合约部署者是否参与能量分摊及其分摊额度。然而,FeeLimit 在整个交易执行过程中,间接参与了交易总能量上限(即EnergyLimit)的计算。它明确了调用者能够承担的最大能量份额,而最终的EnergyLimit则由调用者和合约部署者各自愿意承担的能量上限共同构成。
交易能量消耗上限 EnergyLimit
EnergyLimit 是一笔合约交易在执行过程中允许消耗的最大能量值。当交易实际消耗的能量达到此上限时,交易将被立即中止,并返回错误码OUT_OF_ENERGY。
由于 TRON 网络支持 合约能量分摊机制,允许合约部署者为合约调用者分担部分能量,因此,一笔交易的 EnergyLimit 是调用者和合约部署者各自可承担能量上限的总和:
EnergyLimit = 合约部署者可承担的能量上限 + 调用者可承担的能量上限
合约调用者可承担的能量上限
调用者可承担的能量上限 = min(
FeeLimit 对应的能量值,
调用者账户可用能量 + TRX 可用余额等值的能量(这里的可用余额为扣除以下交易成本后的余额:带宽消耗所需TRX、向合约转账的TRX、其它交易费用 )
)
合约部署者可承担的能量上限
部署者可承担的能量上限 = min(
origin_energy_limit, // 合约设置的每笔交易能量上限
部署者账户可用能量, // 部署者当前实际可支配能量数量
consume_user_resource_percent>0 ? 调用者可承担的能量上限 * (100-consume_user_resource_percent)/consume_user_resource_percent : ∞ // 若用户分摊比例为0,部署者理论无上限
)
- 若consume_user_resource_percent=0,则理论上部署者需全额承担交易能量,所以其可承担的能量上限仅受合约的origin_energy_limit和部署者账户的可用能量约束。
- 若consume_user_resource_percent>0,则部署者的理论最大分摊值由调用者可承担的能量上限按比例反向推导:
理论最大分摊值 = 调用者可承担的能量上限 * (100-consume_user_resource_percent)/consume_user_resource_percent,所以最终部署者的能量上限取 origin_energy_limit、部署者账户可用能量、理论最大分摊值 中的最小值。
示例:
假设某合约的 consume_user_resource_percent = 20,origin_energy_limit = 300,调用者为交易设置的 FeeLimit 为 0.021TRX (等价于100能量),调用者账户可用能量1000,部署者账户的可用能量2000,则
- 调用者可承担能量上限:
min(100, 1000) = 100 - 部署者理论最大分摊值:
100 × (100-20)/20 = 400 - 实际上,部署者可承担能量上限:
min(300, 2000, 400) = 300 - 交易的energylimit为
100+300 = 400。交易执行时,当所需能量超过400时,交易执行失败。
合理设置FeeLimit的意义
合理设置 FeeLimit 对于TRON网络中的合约调用者和开发者而言至关重要,其主要目的和意义包括:
- 避免恶意合约或复杂逻辑导致调用者资源被过度消耗;
- 降低资源滥用风险;
- 实现调用者可预期的交易成本;
- 提供清晰的上限策略,便于开发者和用户控制成本。
开发者应结合合约的特性、预期能量消耗以及用户的使用场景,,灵活运用 FeeLimit、consume_user_resource_percent、origin_energy_limit 三个参数,以实现最优的成本控制策略,提升用户体验并保障网络资源的合理利用。
Updated 8 months ago