资源模型
投票权、带宽和能量是波场网络的重要系统资源。 其中,投票权用于投票选择超级代表;带宽是衡量存储在区块链数据库中交易字节大小的单位。 交易越大,消耗的带宽资源越多。能量是衡量波场虚拟机在波场网络上执行特定操作所需计算量的单位。 由于智能合约交易需要计算资源来执行,每笔智能合约交易都需要支付能量费。
投票权
在任何账户能够为超级代表投票之前,该账户需要获得投票权,即波场权力(TRON Power,TP)。 通证持有者可以通过质押 TRX 来获得投票权。 质押 TRX 除了能够获得带宽或能量,还可以同时获得投票权。 质押1个TRX的投票者将获得1个TP。关于如何进行质押,请参考《波场网络质押》章节。
投票者可以多次进行质押,多次质押所获得的投票权将累加到投票者的账户中。
投票者可以通过 wallet/getaccountresource
接口查询账户所拥有的投票权总数以及已使用的投票权数量。
带宽
所有类型的交易都需要消耗带宽点。 交易以字节数组的形式在波场网络中传输和存储。 一个字节需要消耗一个带宽点,因此一笔交易所需消耗的带宽点等于该交易的字节数。
当可用带宽不足时,需要燃烧 TRX 来支付带宽点:
燃烧的 TRX = 消耗的带宽数量 * 带宽单价
当前,带宽的单价为 1000sun
。
获取带宽
每个外部账户每天有 600
个免费带宽,此外还可以通过质押 TRX 来获得更多带宽。
所有用户根据质押 TRX 的数量共享固定数量的带宽。
整个网络的总固定带宽供应量为每天 43,200,000,000
。可以使用以下公式计算通过质押一定数量的 TRX 可以获得多少带宽:
获得的带宽数量 = 为获得带宽而质押的 TRX 数量 / 全网为获得带宽而质押的 TRX 总量 * 43_200_000_000
可以通过 wallet/getaccountresource
接口获取全网为获得带宽而质押的 TRX 总量。
可以发送 FreezeBalanceV2Contract
类型的交易来质押 TRX 以获得带宽。以下将以 wallet-cli 为例,创建一个 FreezeBalanceContract
类型的交易:
wallet> freezeBalanceV2 1000000 0
带宽消耗
除了查询操作,任何交易都需要消耗带宽。
带宽的消耗规则如下:首先,检查交易发起人通过质押 TRX 获得的带宽是否充足,如果充足,则消耗质押 TRX 获得的带宽;
否则,检查交易发起人的免费带宽是否充足,如果充足,则消耗免费带宽;否则,将燃烧 TRX,以 0.001TRX
每带宽的单价支付交易带宽。
带宽恢复
账户的免费带宽和质押 TRX 获得的带宽在被消耗后,将在24小时内逐渐恢复。
带宽查询
首先,调用节点的 HTTP 接口 wallet/getaccountresource
以获取账户的当前资源状态,然后通过以下公式计算带宽余额:
免费带宽余额 = freeNetLimit - freeNetUsed
质押 TRX 获得的带宽余额 = NetLimit - NetUsed
Tip
如果接口返回的结果中不包含上述公式中的参数,则表示该参数值为0。
能量
智能合约的每条指令在运行时都会消耗一定量的能量,因此不同复杂度的合约会消耗不同数量的能量。 当合约执行时,系统会根据指令逐一计算并扣除能量。 当账户的可用能量不足时,需要燃烧 TRX 来支付相应的能量费用。
燃烧的 TRX = 能量数量 × 能量单价
目前,能量的单价是 210sun
。
获取能量
能量只能通过质押 TRX 来获得。
所有用户根据质押 TRX 的数量共享固定的能量总量。
整个网络每日固定总能量供应量为 180,000,000,000
。
请使用以下公式计算通过质押一定数量的 TRX 可以获得的能量:
获得的能量数量 = 为获得能量所质押的 TRX 数量 / 全网为获得能量所质押的 TRX 总量 × 180_000_000_000
可以通过 wallet/getaccountresource
接口获取全网为获得能量所质押的 TRX 总量。
可以发送 FreezeBalanceV2Contract
类型的交易来质押 TRX 以获取能量。以下示例将使用 wallet-cli 来创建一个 FreezeBalanceContract
类型的交易:
wallet> freezeBalanceV2 1000000 1
能量消耗
当合约执行时,系统会根据指令逐一计算并扣除能量。账户能量消耗的优先顺序如下:
- 通过质押 TRX 获得的能量
- 燃烧 TRX
首先,消耗通过质押 TRX 获得的能量。
如果这部分能量不足,账户的 TRX 将继续被燃烧以支付交易所需的能量资源,按照每单位能量 0.00021TRX
的单价。
如果合约在执行过程中因抛出回退异常而退出,只会扣除已执行指令所消耗的能量。
但是,对于异常合约,如合约执行超时或因错误导致的异常退出,将扣除此交易的最大可用能量。
您可以通过设置交易的 fee_limit
参数来限制此交易的最大能量消耗。
能量恢复
当账户的能量资源被消耗后,将在24小时内逐渐恢复。
能量查询
首先调用节点 HTTP 接口 wallet/getaccountresource
以获取账户的当前资源状态,然后通过以下公式计算能量余额:
能量余额 = EnergyLimit - EnergyUsed
Tip
如果接口返回的结果中不包含上述公式中的参数,则表示该参数值为0。
动态能量模型
动态能量模型是波场网络的一种资源平衡机制, 可根据合约的资源占用情况动态调整每个合约的能量消耗, 从而使链上能量资源的分配更为合理, 并防止网络资源过度集中于少数热门合约。 更多详情请参阅动态能量模型简介。
原理
如果某合约在一个维护周期内使用了过多资源, 那么在下一个维护周期中,将增加一定比例的惩罚性消耗, 发送相同交易至该合约的用户将比之前消耗更多能量。 当合约合理使用资源时,用户调用该合约所产生的能量消耗将逐渐恢复正常。
每个合约都有一个 energy_factor
字段,用于指示智能合约交易的能量消耗相对于基础能量消耗的增加比例,
其初始值为0
。当合约的 energy_factor
为0时,表示合约合理使用资源,
调用该合约时不会有额外的能量消耗。当 energy_factor
大于0
时,表示合约已成为热门合约,
调用该合约时将消耗额外能量。可通过 getcontractinfo
API 查询合约的 energy_factor
。
合约调用交易的最终能量消耗计算公式如下:
合约调用交易的能量消耗 = 交易产生的基础能量消耗 * (1 + energy_factor)
动态能量模型引入了波场网络的以下三个参数,共同控制合约的 energy_factor
字段:
threshold
:合约基础能量消耗的阈值。在一个维护周期内,如果合约的基础能量消耗超过该阈值,则在下一个维护周期中合约的能量消耗将增加。increase_factor
:如果合约的基础能量消耗在某一维护周期内超过阈值,则在下一个维护周期中,energy_factor
将根据max_factor
增长一定百分比。max_factor
:energy_factor
的最大值。
还有一个用于减少合约 energy_factor
的变量,即 decrease_factor
:
decrease_factor
:为increase_factor
的1/4。当合约的基础能量消耗降至阈值以下后,energy_factor
将根据decrease_factor
减少一定百分比。
当合约的基础能量消耗在某一维护周期内超过阈值时,其 energy_factor
将在下一个维护周期内增加,但最大值不会超过 max_factor
,计算公式为:
energy_factor = min((1 + energy_factor) * (1 + increaese_factor)-1, max_factor)
当合约的基础能量消耗在某一维护周期内降至阈值以下时,其 energy_factor
将在下一个维护周期内减少,但最小值不会低于0。计算公式如下:
energy_factor = max((1 + energy_factor) * (1 - decrease_factor)- 1, 0)
主网络已启用动态能量模型,并设置了相关参数如下:
threshold
:5,000,000,000increase_factor
:0.2max_factor
:3.4
由于热门合约在不同维护周期中的能量消耗不同,因此在调用合约时需要为交易设置适当的 feelimit
参数。有关详细信息,请参阅设置交易 feelimit
。
API
下表列出了动态能量模型的相关界面及其说明:
接口名称 | 描述 | 返回值与动态能量模型相关 |
---|---|---|
getcontractinfo |
查询合约信息 | contract_state.energy_usage:表示合约在当前维护周期的基本能量使用总量;contract_state.energy_factor:合约的能量因子,0 表示非热门合约,大于零表示热门合约;contract_state.update_cycle:当前维护周期的编号。 |
triggerconstantcontract |
查询合约数据或估算能量 | energy_penalty 表示惩罚能量;energy_used 表示总能量(基础能量与惩罚能量之和)。 |
gettransactioninfobyid |
查询交易信息 | receipt.energy_penalty_total 表示惩罚能量。 |
gettransactionreceiptbyid |
查询交易执行结果、费用和其他信息 | receipt.energy_penalty_total 表示惩罚能量 |