波场TRON动态能量模型分析

in #tron4 years ago (edited)

概述

波场(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

区块链孙哥

Sort:  

Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:
https://blog.csdn.net/shydesky1/article/details/103082555

Coin Marketplace

STEEM 0.28
TRX 0.12
JST 0.032
BTC 67333.93
ETH 3115.87
USDT 1.00
SBD 3.73