资源模型

带宽和能量是TRON网络两种重要的系统资源。其中带宽是衡量保存在区块链数据库中的交易字节大小的单位,交易越大,消耗的带宽资源会越多。能量是衡量在TRON网络上TVM虚拟机执行特定操作所需的计算量的单位,由于智能合约交易都需要计算资源来执行,因此每笔智能合约交易都需要付费。

下文我们把带宽也称为Bandwidth Points,能量也称为Energy。

带宽

所有类型的交易都需要支付Bandwidth Points, 交易以字节数组的形式在网络中传输以及存储,一个字节需要一个Bandwidth Points,因此一笔交易需要消耗的Bandwidth Points等于交易字节数。

当可用带宽不足时,需要燃烧TRX来支付Bandwidth Points费用:

燃烧的TRX = 消耗带宽数量 * 带宽单价

目前,带宽单价为1000sun。

带宽的获取

每一个外部账户每天有1500个免费带宽,还可以通过质押TRX获取更多的带宽,所有用户按质押的TRX的数量平分固定额度的带宽,全网每日固定总带宽的供应数量是43,200,000,000个,按如下公式可以计算得到质押一定数量的TRX能获得多少带宽:

获得的带宽数量 = 为获取带宽的TRX质押量 / 全网为获取带宽质押TRX的总量 * 43_200_000_000 

发送FreezeBalanceContract类型交易来质押TRX获取带宽,使用wallet-cli为例:

wallet> freezeBalance TC9vGE2cPC3AkLtCpRvDjNvLh7Efap9Pvg  1000000 3 0  TC9vGE2cPC3AkLtCpRvDjNvLh7Efap9Pvg

带宽的消耗

除了查询操作,任何交易都需要消耗带宽,账户带宽的消耗规则为,首先,判断交易发起者质押TRX获取的带宽是否足够,如果足够,则消耗质押TRX获取的带宽,否则,判断交易发起者的免费带宽是否足够,如果足够,则消耗账户的免费带宽,否则,将燃烧TRX来支付交易的带宽费用,并按照每一个带宽0.001TRX的单价来支付。

带宽的恢复

账户的免费带宽和质押TRX获取的带宽消耗后, 会在24小时内逐步恢复。

账户带宽余额查询

首先调用节点HTTP接口wallet/getaccountresource来获取账户当前的资源状态,然后通过如下公式计算带宽余额:

免费带宽余额 = freeNetLimit - freeNetUsed

通过质押获取的带宽余额 = NetLimit - NetUsed

注:如果接口返回的结果中没有包含上述公式中的参数,表示该参数值为0。

能量

智能合约运行时,每一条指令的执行都需要消耗一定的能量,所以不同复杂度的合约,消耗的能量数量是不一样的。在执行合约时,逐条指令计算并扣除Energy,当账户可用能量不足时,需要燃烧TRX来支付相应的能量费用

燃烧的TRX = Energy数量 * Energy单价

目前,Energy单价为280sun。

能量的获取

能量只能通过质押TRX来获取,所有用户按质押的TRX的数量平分固定额度的能量,全网每日固定总能量的供应数量是90,000,000,000个,按如下公式可以计算得到质押一定数量的TRX能获得多少能量:

获得的能量数量 = 为获取能量质押的TRX数量 / 全网为获取能量质押TRX的总量 * 90_000_000_000

发送FreezeBalanceContract类型交易来质押TRX获取能量,使用wallet-cli为例:

wallet> freezeBalance TC9vGE2cPC3AkLtCpRvDjNvLh7Efap9Pvg  1000000 3 1  TC9vGE2cPC3AkLtCpRvDjNvLh7Efap9Pvg

能量的消耗

在执行合约时,逐条指令计算并扣除账户能量,账户能量消耗的优先级如下:

  • 质押TRX获取的能量
  • 燃烧TRX

首先会消耗交易发起者质押TRX获取的能量,如果消耗完这部分能量后还不够,会继续燃烧账户的TRX来支付交易所需的能量资源,按照每一个能量0.00028TRX的单价来支付。

如果合约中途由于抛出revert异常而退出,则仅扣除已经执行的指令所对应的能量,但是对于异常合约,比如合约执行超时,或因bug异常退出,会扣除本次交易最大可用的能量,用户可以通过设置交易的fee_limit参数来限定这笔交易最多可以消耗的能量费用上限。

能量的恢复

账户的能量资源消耗后,会在24小时内逐步恢复。

账户能量余额查询

首先调用节点HTTP接口wallet/getaccountresource来获取账户当前的资源状态,然后通过如下公式计算能量余额:

能量余额 = EnergyLimit - EnergyUsed

注:如果接口返回的结果中没有包含上述公式中的参数,表示该参数值为0。