配额

TIP

本文主要描述配额相关逻辑,并非详细的技术文档,详细技术文档会在技术黄皮书里提及。

相关词汇解释:

  • 配额: 在Vite系统中,交易时使用配额来支付计算和存储资源。
  • : 即工作量证明(Proof of Work),简单来说就是用来证明进行了一定量的计算。
  • 抵押: 指账户中的一部分被冻结,无法交易,无法使用。
  • 抵押地址:指抵押发起方。
  • 配额受益地址:指抵押成功后获得配额的账户地址。

什么是配额

在以太坊的设计中,每个交易在发起时需要指定gas和gas price,从而与其他交易竞争写入账本的机会。这是一个典型的竞价模型,原则上可以通过价格有效调控供给和需求的平衡。但由于用户在出价之前,很难量化当前的供需情况,也无法预测其他竞争者的出价,很容易发生市场失灵(market failure)。而且,每次出价所竞争的资源都是针对一个交易的,没有一个按账户维度对资源进行合理配置的协议。

在Vite中,当用户发起一笔交易,即发起转账交易、部署合约、调用合约方法、发行新代币、注册超级节点、提取出块奖励、投票、抵押时,需要消耗一定的配额。Vite通过配额模型来调整供需平衡。

用户可以通过两种方式来获取更高的资源配额:

  • 在发起交易时计算一个
  • 在账户中抵押一定数量的

如果用户希望一次性地发起一笔交易,可以选择计算一个来一次性的获取配额;如果希望频繁发起交易,可以抵押一定数量的来获取持久的配额。

Vite提倡用户通过抵押的方式来获取配额。

配额使用规则

用户发起的交易类型不同,所需的配额也不同,测试网络中,各种交易类型所需的配额见下表:

交易类型 所需配额
不带备注的转出交易 21000
转入交易 21000
注册超级节点交易 62200
更新注册信息交易 62200
注销超级节点交易 83200
提取出块奖励交易 238800
投票交易 62000
撤销投票交易 62000
抵押获取配额交易 21000
撤销抵押交易 21000
铸币交易 83200
撤回铸币抵押交易 83200

另外,对于转账交易中的备注,每个字符都需要收取额外的配额,每个0字符收取4配额,每个非0字符收取68配额。

例如,如果用十六进制编码来表示备注,发起一笔备注为0x0001(共两个字符,第一个字符为0,第二个字符非0)的转账交易,需要的配额为:

配额计算逻辑

配额可以通过下面的公式来计算:

其中,

  • : 一个账户的当前可用配额;
  • : 单个账户配额上限,和系统总吞吐以及账户总数相关;
  • : 用户在发起一笔交易时计算出的难度;
  • : 通过计算获取配额的权重;
  • : 账户受益的抵押金额;
  • : 发起交易前等待的快照块高度,即当前交易引用的快照块高度和账户链中引用的上一个不同的快照块高度的高度差;
  • : 抵押获取配额的权重。

根据上面的配额计算公式,一个用户账户当前可用的配额和系统总吞吐该用户账户的抵押受益金额该用户账户发起交易前等待的快照块高度发起交易时计算的PoW难度相关。

目前测试网络中,各参数取值如下:

  • = 1000000
  • = 6.259419649e-10
  • = 4.200627522e-24

为了计算方便,实际计算配额时,只计算的值,并将计算结果分段映射成相应的配额。映射表如下:

每等待一个快照块能发起的不带备注交易数量 大约相当于在不算的情况下抵押多少 大约相当于在不抵押的情况下计算多少难度的
0.0 0 0 0 0
21000 1 10000 67108864
42000 2 20009 134276096
63000 3 30036 201564160
84000 4 40089 269029376
105000 5 50178 336736256
126000 6 60312 404742144
147000 7 70501 473120768
168000 8 80754 541929472
189000 9 91082 611241984
210000 10 101495 681119744
231000 11 112005 751652864
252000 12 122623 822910976
273000 13 133362 894976000
294000 14 144235 967946240
315000 15 155256 1041903616
336000 16 166440 1116962816
357000 17 177804 1193222144
378000 18 189364 1270800384
399000 19 201141 1349836800
420000 20 213156 1430462464
441000 21 225428 1512824832
462000 22 237989 1597120512
483000 23 250862 1683513344
504000 24 264082 1772216320
525000 25 277682 1863491584
546000 26 291702 1957568512
567000 27 306188 2054791168
588000 28 321192 2155479040
609000 29 336772 2260041728
630000 30 353004 2368962560
651000 31 369958 2482757632
672000 32 387743 2602090496
693000 33 406468 2727755776
714000 34 426270 2860646400
735000 35 447322 3001933824
756000 36 469840 3153051648
777000 37 494096 3315826688
798000 38 520436 3492593664
819000 39 549332 3686514688
840000 40 581427 3901882368
861000 41 617620 4144775168
882000 42 659288 4424400896
903000 43 708576 4755193856
924000 44 769276 5162500096
945000 45 848844 5696520192
966000 46 965904 6482067456
987000 47 1197301 8034975744

即,在不计算的情况下,抵押10000可以获得最高1 的交易频率,抵押20009可以获得最高2 的交易频率。抵押10等待1000个快照块(约16分钟40秒)也可以发起一笔不带备注的转账交易。

获取配额的两种方式

抵押

用户可以发起一笔抵押交易来获取配额。抵押时,由抵押地址发起一笔抵押交易(实际上是调用内置合约),当该交易被内置合约接收并被快照链打包确认后,抵押受益账户就能获取到相应的配额。

参数

  • 抵押金额:抵押金额最少为10
  • 配额受益地址:抵押成功后获取配额的账户,可以填写抵押地址,也可以填写其他账户地址。即Vite允许给别人抵押。

抵押的会暂时从用户余额中扣除,这部分在抵押期间不能用于交易。 抵押账户可以在抵押成功后等待259200个快照块(大约3天),取回抵押的金额。取回抵押时,同样由抵押地址发起一笔撤销抵押的交易,当该交易被内置合约接收并被快照链打包确认后,抵押受益账户也就不再能获得相应的配额。

计算PoW

用户可以在发起一笔交易时计算一个来一次性获取配额。根据配额公式,在没有抵押的情况下,要发起一笔不带备注的转账交易,需要计算的难度为 0x3FFFFFF。

测试网络中,Vite会提供计算的矿池。Vite官方钱包提供通过计算PoW的方式获取交易配额的功能。

PoW计算公式

  1. 首先将转换为,计算公式为:

= 2**256 / (1 + 1/)

其中,

  • : 难度,长度为256位的数字,不足256位时前面补0;
  • : 目标,长度为256位的数字,通常第0位为1。

例如,当 = 0x3FFFFFF 时,对应的 = 0xFFFFFFC000000000。

  1. 然后根据交易数据计算即为工作量证明,计算时,不断将随机数赋值给,直到满足下面的条件:

其中,

  • : Vite使用的哈希函数
  • : 用户账户的地址
  • : 用户账户中最后一个账户块的哈希

FAQ

  • 一个抵押地址能否给多个配额受益地址抵押?

可以。需要发起多笔交易分别给不同的受益地址抵押,每一个配额受益地址的抵押到期时间不同。

  • 一个抵押地址能否多次给同一个配额受益地址抵押?

可以。给同一个配额受益地址抵押时,抵押金额会累加,抵押到期的高度以最后一次抵押交易被内置合约接收时引用的快照块高度+259200为准。

  • 抵押给一个配额受益地址的是否可以分批取回?

可以。抵押到期后可以分批取回,取回操作不影响到期时间。

  • 抵押还没到期是否可以取回?

不可以。但抵押到期后随时可以取回。

  • 抵押获取的配额是否会用完?

通过抵押的方式获取的配额数量跟抵押受益金额和发起交易前等待的快照块高度有关,抵押的如果没有取回,就可以持续获得配额。如果钱包中的当前配额展示为0,那么等待一段时间后展示的配额就会变多。

  • 一个配额受益地址能否接受多个抵押地址的抵押?

可以。抵押的受益金额是多个抵押地址给这个受益地址抵押的金额总和。

  • 入账交易是否需要消耗配额?

需要,一笔入账交易需要消耗21000配额。Vite中,转账交易的发起者和接收者需要分别消耗配额来执行出账交易和入账交易,此外,投票、注册超级节点、铸币、抵押、创建委托共识组等也需要消耗配额来发起交易,不同交易类型需要的配额不同。

  • 一个账户收到的第一笔转账交易,在没有抵押的情况下,怎么接收?

如果没有抵押,可以计算来一次性获取配额。