TRON Developer Hub CN

TRON开发者中心

欢迎来到TRON开发者中心。您将找到全面的指南和文档,以帮助您尽快开始使用TRON Developer Hub,并在遇到困难时提供支持。让我们跳进去吧!

Get Started    

能量消耗机制

介绍

本文介绍波场中智能合约执行和部署时的能量(energy)消耗模型。

术语表

术语

定义

OriginEnergyLimit

合约部署者可提供消耗的能量

CallerEnergyLimit

合约调用者可提供消耗的能量,当部署合约时,等价于 OriginEnergyLimit

TotalEnergyLimit

OriginEnergyLimit + CallerEnergyLimit

EnergyLimitOfFeelimit

Feelimit / 10 SUN (主网及官方测试网的 energy 单价均是 10 SUN, 私有网默认是 100 SUM)。
FeeLimit 在创建合约或调用合约时提供。

EnergyLimitOfAccount

用户 freeze 获得的能量剩余 + (Balance of TRX / 10 SUN)。
即用户所能支付的最多能量。

部署合约

如果 合约部署所需能量 <= min(EnergyLimitOfFeelimit, EnergyLimitOfAccount),则合约可以成功部署。 否则,会出现 OUT_OF_ENERGY 错误。

触发调用合约

consume_user_resource_percent = 100(用户支付的资源比例),调用方支付操作的全部费用。 调用方需要满足:

调用合约所需能量 <= min(EnergyLimitOfFeelimit,EnergyLimitOfAccount)

从而成功调用合约。 否则,会出现OUT_OF_ENERGY错误。

0 <= consume_user_resource_percent < 100 时,这表示操作成本由合约部署者和调用者按比例支付。 如果合约部署者有足够的能量,调用方需要满足:

  • 调用者所需能量 = 调用合约所需能量 * consume_user_resource_percent / 100
  • 调用者所需能量 <= min(EnergyLimitOfFeelimit, EnergyLimitOfAccount)

对于合约部署人员(开发者):

开发者所消耗能源 = 调用合约所需能量 *(100 - consume_user_resource_percent)/ 100

其中 开发者所消耗能源 <= OriginEnergyLimit .

如果开发人员的能量不足,则所有的能量消耗由调用者支付,并且不消耗开发者的TRX。 也就是说,调用者需要满足:

调用合约所需能量 <= min(EnergyLimitOfFeelimit,EnergyLimitOfAccount) + DeveloperProvideEnergy

为了成功调用合约,DeveloperProvideEnergy <= OriginEnergyLimit 。 否则,会出现OUT_OF_ENERGY错误。

合约执行

执行合约方法时,OUT_OF_ENERGY 可以根据 API 查看详细信息。 调用/walletsolidity/gettransactionInfoByID接口,并将返回的resMessage字段从十六进制转换为字符串。

resMessages包括:执行“AND”操作的能量不足:curInvokeEnergyLimit[1000],curOpEnergy[3],usedEnergy[1000] 类似信息。

术语

定义

curInvokeEnergyLimit

表示最大能耗, 即 min(EnergyOfFeelimit,EnergyOfAccount).

curOpEnergy

运行当前指令需要的能量。

usedEnergy

触发合约已经使用的能量。

能源不足解决方案

  1. 如果EnergyOFAccount < curInvokeEnergyLimit,表示调用方剩余能量和TRX余额不足,需要给TRX充值。

  2. 如果EnergyOfFeelimit < curInvokeEnergyLimit,表明费用限额设置太小,需要增加费用限额。 最高费用限额为1000 TRX。

消费过程

  1. 根据合约中设置的 consume_user_resource_percent 比率,消耗合约创建者从质押TRX获得的能量。如果能量不足,继续消耗合约创建者的剩余能量。任何剩余的能源短缺都由合约调用者提供。

  2. 合约调用者者消费过程:(首先消耗呼叫者通过质押TRX获得的能量,以确保合约可以正常执行,并且通过销毁TRX来抵消不足部分)。

  3. 如果合约创建者未质押能源资源的TRX,则呼叫者需要所有消费。

专业术语

术语

解释

合约创建者

即创建合约的账户

合约调用者

即调用合约的账户

Energy

智能合约运行时每一步指令都需要消耗一定的资源,资源的多少用energy的值来衡量。

Freeze

质押,即将持有的trx锁定,无法进行交易,作为抵押,并以此获得免费使用energy的权利。具体计算与全网所有账户质押有关,可参考相关部分计算。

Fee Limit

用户在调用或者创建智能合约时,指定的最高可接受的trx费用消耗,包含消耗质押获得资源的trx 和消耗用户本身持有的trx两部分,优先使用质押资源。

Call Value

用户在智能合约调用或创建时给智能合约本身的账户转账的trx数量,在判断feelimit的时候会抛去这部分的值。

consume_user_resource_percent

对于一个智能合约来说,付费是由两大部分组成的。一部分是合约开发者付费,另一部分是由合约调用者支付。这个值是调用者付费的比例。

origin_energy_limit

开发者设置的在一次合约调用过程中自己消耗的energy的上限,必须大于0。对于之前老的合约,没有提供设置该值的参数,会存成0,但是会按照1000万energy上限计算,开发者可以通过updateEnergyLimit接口重新设置该值,设置新值时也必须大于0。

相关接口

参数getTransactionInfoById 查询包含合约调用或合约创建结果的交易信息。

getTransactionInfoById 需要1个参数,交易 ID

相关字段

energy_usage: //本次合约调用者消耗的Energy数量
0
energy_fee: //本次合约调用者消耗TRX数量(SUN)
120
origin_energy_usage: //本次合约创建者提供的Energy数量
0
energy_usage_total: //本次合约总共消耗的Energy数量(包含energy_usage,origin_energy_usage 和energy_fee对应的Energy数量)
252
net_usage: //本次合约消耗的Bandwidth(不包含NetFee对应的)
0
net_fee: //本次合约因Bandwidth不足消耗的TRX
0

FreezeBalance 质押TRX以获得带宽或能量

freezeBalance frozen_balance frozen_duration [ResourceCode:0 BANDWIDTH,1 ENERGY]

说明

参数 “fee_limit” 在部署合约和调用合约的过程中传递。 TRX 数量对应于此执行中消耗的能量。

能量部分被质押: (质押平衡量/质押以获得总能量) * 能量消耗。 销毁TRX以获得能量部分:按比例消耗的TRX数量。

Updated about a month ago

能量消耗机制


Suggested Edits are limited on API Reference Pages

You can only suggest edits to Markdown body content, but not to the API spec.