波场TRON动态能量模型分析
概述
波场(Tron)Odyssey-v3.5版本包含了6项重大改进,这次升级不仅使得Tron网络性能大幅提升,而且为机构者进入波场铺平了道路。其中的能量上限动态调整,根据网络当前状态,实时动态调整能量上限,也可以让波场网络内的能量使用更为高效。今天我们就来仔细探究一下这个提案的具体实现细节。
背景
在“能量上限动态调整”的提案生效之前,整个Tron网络的能量供应是固定的,如果有开发者获得了能量但不使用,当其他开发者需要使用能量时将无法获取,这会影响整个网络的能量利用率,也不利于Tron网络生态多样性的发展。
为了解决这个问题,Tron在其3.5版本中提出了“能量上限动态调整”的方案。
什么是“能量上限动态调整”
能量
要搞清楚这个问题,需要先理解什么是能量(Energy)。
首先,创建和运行智能合约需要使用能量。智能合约需要在虚拟机(VM)中运行,跟普通程序执行的过程类似,这个过程需要占用存储和CPU资源,根据合约指令的复杂度不同会消耗不同的资源。在Tron网络中这个存储和CPU资源的消耗,用能量来计算。
获取能量
除了用户免费获取的能量,用户还可以通过冻结TRX来获得:
用户获得的能量 = 用户为获得能量而冻结的TRX * 系统所有人“共享”的能量总上限 / 在整个网络中为获得能量而冻结的TRX总数
用户根据抵押TRX的量来获取一定比例的能量,抵押的TRX越多,获取的能量越多。可以把公式中后面的系统所有人“共享”的能量总上限/在整个网络中为获得能量而冻结的TRX总数的倒数当做能量的价格,用户使用TRX兑换能量。这样,能量上限动态调整其实是调整能量的价格。
这里的兑换和价格是一个抽象出来的概念,在Tron网络中,用户是先抵押TRX(这里如果不考虑其它用户在这个时间点后抵押TRX,则上面公式中的值已经确定),当用户需要消耗能量时,再根据上面的公式计算用户可以使用的总能量,这是一个实时计算的过程。
用户冻结的TRX在冻结期(最少3天)之后,还可以通过解冻操作获取回来,所以实际上获取能量并不会减少用户TRX的量。
能量上限调整
能量上限是指Tron总的能量供应的上限,目前整个能量供应是固定的,如果有开发者获得了能量但不进行使用,也会影响到其他开发者获得的能量总数。动态调整以后,如果当前网络能量使用情况比较空闲,开发者会用较小的代价使用更多的能量,因此这种机制会在一定程度上降低使用能量的成本。
另外,由于Dapp是基于智能合约实现的,能量上限动态调整的实现,也会为Dapp的运行和发展提供了更好的底层基础。
技术实现
能量获取(改进后)
可以用下面的公式表示上节中提到的用户获取能量的大小:
USER_ENERGY_LIMIT = USER_ENERGY_WEIGHT * TOTAL_ENERGY_LIMIT / TOTAL_ENERGY_WEIGHT
USER_ENERGY_LIMIT: 用户获取的能量
USER_ENERGY_WEIGHT: 用户抵押的TRX量
TOTAL_ENERGY_LIMIT: 系统所有人“共享”的能量总上限,系统24小时可以使用的能量上限的设定值,这个值是固定的,由19号提案确定和修改
TOTAL_ENERGY_WEIGHT: 在整个系统中为获得能量而冻结的TRX总数
由此可见,为了调整用户可以使用的能量大小,可以通过修改公式中唯一的变量TOTAL_ENERGY_LIMIT来实现。
实现思路
为了跟旧的实现进行区分,这里用新的公式来表示(用TOTAL_ENERGY_CURRENT_LIMIT替换TOTAL_ENERGY_LIMIT):
USER_ENERGY_LIMIT = USER_ENERGY_WEIGHT * TOTAL_ENERGY_CURRENT_LIMIT / TOTAL_ENERGY_WEIGHT
能量上限调整的过程,其实就是通过一定的规则来动态修改TOTAL_ENERGY_CURRENT_LIMIT的值。我们可以统计一个时间段内(例如1分钟)的能量消耗
(TOTAL_ENERGY_AVERAGE_USAGE),将这个值和一个期望值(TOTAL_ENERGY_TARGET_LIMIT)作对比,根据不同情况调整TOTAL_ENERGY_CURRENT_LIMIT。
一句话,根据TOTAL_ENERGY_AVERAGE_USAGE和TOTAL_ENERGY_TARGET_LIMIT,调整TOTAL_ENERGY_CURRENT_LIMIT)。
实现逻辑
统计最近20个块(一分钟内)的系统总能量消耗量,记为TOTAL_ENERGY_AVERAGE_USAGE。每次产完块之后,根据旧的TOTAL_ENERGY_AVERAGE_USAGE和当前块的能量消耗(blockEnergyUsage),计算出新的TOTAL_ENERGY_AVERAGE_USAGE的值;然后跟目标值TOTAL_ENERGY_TARGET_LIMIT作对比,进而调整TOTAL_ENERGY_CURRENT_LIMIT。
如果TOTAL_ENERGY_AVERAGE_USAGE大于TOTAL_ENERGY_TARGET_LIMIT,表示当前能量消耗较大,需要提高单价,将TOTAL_ENERGY_CURRENT_LIMIT减小;否则表示当前能量消耗较少,需要降低单价,将TOTAL_ENERGY_CURRENT_LIMIT增加。
这里有一点需要强调的是,为了保证开发者的利益,TOTAL_ENERGY_CURRENT_LIMIT的值有一个范围,从 TOTAL_ENERGY_LIMIT到50 * TOTAL_ENERGY_LIMIT,意味着用户获取的能量最多可以达到之前的50倍,但是不会减少。
代码解析
我们用伪代码来表示整个过程。
用户可以使用的能量
def get_user_energy(account):
用户的抵押量
energy_weight = get_weight_by_balance(account.froze_balance)
用户通过抵押获取的能量
user_total_energy = energy_weight * TOTAL_ENERGY_CURRENT_LIMIT / TOTAL_ENERGY_WEIGHT
用户已经使用的能量
user_used_energy = account.get_energy_usage()
用户还可以使用的能量
return (user_total_energy - user_used_energy)
能量上限动态调整
def process_block(block):
处理块过程
...
...
调整能量上限
if allow_adaptive_energy:
获取当前块的能量消耗
block_energy_usage = block.get_block_energy_usage()
计算最近20个块(1分钟)的能量总消耗量
TOTAL_ENERGY_AVERAGE_USAGE = TOTAL_ENERGY_AVERAGE_USAGE * 19/20 + block_energy_usage
调低上限,减少1/100
if TOTAL_ENERGY_AVERAGE_USAGE > TOTAL_ENERGY_TARGET_LIMIT:
TOTAL_ENERGY_CURRENT_LIMIT = TOTAL_ENERGY_CURRENT_LIMIT * 99/100
调高上限,增加1/1000
else:
TOTAL_ENERGY_CURRENT_LIMIT = TOTAL_ENERGY_CURRENT_LIMIT * 1000/999
上述过程中,还需要保证TOTAL_ENERGY_CURRENT_LIMIT在[TOTAL_ENERGY_LIMIT, 50* TOTAL_ENERGY_LIMIT]之间,50这个倍数值(ADAPTIVE_RESOURCE_LIMIT_MULTIPLIER)也是可以通过提案进行修改的。
开启能量上限动态调整
由上述内容可以知道,开启这个提案需要指定目标值TOTAL_ENERGY_TARGET_LIMIT的大小,以及能量上限调整中的上限倍数ADAPTIVE_RESOURCE_LIMIT_MULTIPLIER。
def do_allow_apative_energy:
系统1分钟内可以使用的能量上限“设定值”的1/2,由TOTAL_ENERGY_LIMIT决定
24小时为6024为1440分钟,一分钟的一半,则需要除以14402=2880
ADAPTIVE_RESOURCE_LIMIT_TARGET_RATIO = 2880
TOTAL_ENERGY_TARGET_LIMIT = TOTAL_ENERGY_LIMIT / ADAPTIVE_RESOURCE_LIMIT_TARGET_RATIO
ADAPTIVE_RESOURCE_LIMIT_MULTIPLIER = 50
在通过其它提案修改ADAPTIVE_RESOURCE_LIMIT_MULTIPLIER的过程中,会同时修改TOTAL_ENERGY_TARGET_LIMIT的值,TOTAL_ENERGY_TARGET_LIMIT = TOTAL_ENERGY_LIMIT/ ADAPTIVE_RESOURCE_LIMIT_TARGET_RATIO
总结
综上所述,能量上限动态调整的过程,其实就是利用数学的思想,调整公式中的可变参数(TOTAL_ENERGY_CURRENT_LIMIT),来调整获取值的大小;通过观察一定时间内的统计值(TOTAL_ENERGY_AVERAGE_USAGE)以及期望值(TOTAL_ENERGY_TARGET_LIMIT)之间的关系,达到动态调整的目的。
参考资料
Tron网络
Odyssey-v3.5
Tron协议-能量
Dapp
tip: Adaptive Energy Limit Model
关于我们
我们是波场公链核心开发者团队,致力于依托区块链技术打造下一代分布式计算平台,如果您想持续了解我们并获取技术支持,请关注我们的公众号:波场核心开发者团队
关于波场公链
波场公链代码仓库: https://github.com/tronprotocol/java-tron
波场开发者电报群: https://t.me/troncoredevscommunity
区块链孙哥