能源消耗机制
介绍
波场协议中的资源消耗机制管理智能合约执行。 本指南将指导开发人员了解部署、触发和执行智能合约、资源消耗流程和相关接口/字段方面的管理规则。
管理规则
专业术语
术语 | 定义 |
|---|---|
DeveloperEnergy | 部署合同所消耗的能源。 |
CallerEnergy | 调用合同所消耗的能量。 |
TotalEnergy | DeveloperEnergy + CallerEnergy |
EnergyOfFeelimit | Feelimit / 10 SUN |
EnergyOfAccount | Energy + (Balance of TRX / 10 SUN) |
部署合同
如果DeveloperEnergy <= min(EnergyOfFeelimit, EnergyOfAccount),则合同可以成功部署。 否则,会出现OUT_OF_ENERGY错误。
触发合约
当 consume_user_resource_percent (% ratio user pays) = 100,调用方支付操作的全部费用。 调用方需要满足:
CallerNeedEnergy <= min(EnergyOfFeelimit,EnergyOfAccount)
从而成功调用合约。 否则,会出现OUT_OF_ENERGY错误。
当 0 = < 消耗_user_资源_% < 100 时,这表示操作成本由开发人员和调用者按比例支付。 如果开发人员有足够的能量,调用方需要满足:
CallerNeedEnergy = NeedEnergy * consume_user_resource_percent / 100CallerNeedEnergy <= min(EnergyOfFeelimit,EnergyOfAccount)
开发人员:
DeveloperNeedEnergy = NeedEnergy *(100-consume_user_resource_percent)/ 100
为了成功调用合约,DeveloperNeedEnergy <= OriginEnergyLimit 。 否则,报告OUT_OF_ENERGY 。
如果开发人员的能量不足,则剩余的能量消耗由调用方提供,并且不消耗开发者的TRX。 也就是说,调用者需要满足:
TotalEnergy <= min(EnergyOfFeelimit,EnergyOfAccount)+ DeveloperProvideEnergy
为了成功调用合约,DeveloperProvideEnergy <= OriginEnergyLimit 。 否则,会出现OUT_OF_ENERGY错误。
合约执行
执行合约方法时,OUT_OF_ENERGY 可以根据界面查看详细信息。 调用/ walletsolidity / gettransactionInfoByID接口,并将返回的resMessage字段从十六进制转换为字符串。
resMessages包括:执行“AND”操作的能量不足:curInvokeEnergyLimit[1000],curOpEnergy[3],usedEnergy[1000] 类似信息。
术语 | 定义 |
|---|---|
curInvokeEnergyLimit | 表示最大能耗, 即 min(EnergyOfFeelimit,EnergyOfAccount). |
curOpEnergy | 运行当前指令需要的能量。 |
usedEnergy | 触发合约已经使用的能量。 |
能源不足解决方案
-
如果
EnergyOFAccount<curInvokeEnergyLimit,表示调用方剩余能量和TRX余额不足,需要给TRX充值。 -
如果
EnergyOfFeelimit<curInvokeEnergyLimit,表明费用限额设置太小,需要增加费用限额。 最高费用限额为1000 TRX。
消费过程
-
根据合同中设置的
consume_user_resource_percent比率,消耗合同创建者从冻结TRX获得的能量。如果能量不足,继续消耗合同创建者的剩余能量。任何剩余的能源短缺都由合同来电者提供。 -
合同来电者消费过程:(首先消耗呼叫者通过冻结TRX获得的能量,以确保合同可以正常执行,并且通过销毁TRX来抵消不足部分)。
-
如果合同创建者未冻结能源资源的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
0FreezeBalance 冻结TRX以获得带宽或能量
freezeBalance frozen_balance frozen_duration [ResourceCode:0 BANDWIDTH,1 ENERGY]
说明
参数 “fee_limit” 在部署合约和调用合约的过程中传递。 TRX 数量对应于此执行中消耗的能量。
能量部分被冻结: (冻结平衡量/冻结以获得总能量) * 能量消耗。 销毁TRX以获得能量部分:按比例消耗的TRX数量。Updated 9 months ago