配额

提示

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

相关词汇解释:

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

什么是配额

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

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

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

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

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

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

配额使用规则

将 “无备注转账交易” 定义为 “单位交易”(Unit Transaction),作为配额单位。

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

交易类型 所需配额 所需配额(单位交易)
不带备注的转出交易 21000 1
转入交易 21000 1
注册超级节点交易 62200 2.9619
更新注册信息交易 62200 2.9619
注销超级节点交易 83200 3.9619
提取出块奖励交易 68200 3.2476
投票交易 62000 2.9524
撤销投票交易 62000 2.9524
抵押获取配额交易 82000 3.9048
撤销抵押交易 73000 3.4762
代理抵押获取配额交易 82000 3.9048
代理撤销抵押交易 73000 3.4762
铸币交易 104525 4.9774
增发代币交易 69325 3.3012
销毁代币交易 48837 2.3256
转移代币所有者交易 58981 2.8086
修改代币类型交易 63125 3.0060

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

例如,如果用十六进制编码来表示备注,发起一笔备注为 0x0001(共两个字符)的转账交易,需要的配额为 21000+68*2=21136 ,即 1.0065 单位交易。

如果创建合约时指定了一个非零的确认数(即发送给合约的请求交易被确认多少次之后再出响应交易),那么这个合约的每个响应交易都需要额外收取 确认数 * 200 的配额。

注意:官方钱包会在转账的备注中默认填写两个字节的前缀,备注为空时不填,因此通过官方钱包转账时,如果填写了备注,会额外收取 2 * 68 的配额。详情见 vep-8

配额计算逻辑

通过抵押或者计算 PoW 获得的配额可以通过下面的公式来计算:

其中,

  • : 通过计算 PoW 获得的配额,通过计算 PoW 获得的配额是一次性的,只能在当前交易中使用;
  • : 通过抵押获得的配额,抵押获得的配额是长期的,并且可以累积,最多累积 75 个快照块;
  • : 单个账户配额上限,和系统总吞吐以及账户总数相关;
  • : 用户在发起一笔交易时计算出的 PoW 难度;
  • : 通过计算 PoW 获取配额的权重;
  • : 账户受益的抵押金额;
  • : 抵押获取配额的权重。

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

  • = 1000000
  • = 6.259408129e-10
  • = 4.201037667e-24

用户在每个快照块内可以发起的单位交易数 UTPS 的计算公式如下:

一个账户的当前可用配额取决于 UTPS 和这个账户在过去 74 个快照块期间的配额使用情况,例如,一个账户通过抵押获得了 1 UTPS 的配额,在过去 74 个快照块期间没有发起交易,那么这个账户的当前可用配额为 75 UTPS

一个账户在发起一笔交易时的可用配额取决于 UTPS、这个账户在过去 74 个快照块期间的配额使用情况和发起这笔交易时通过计算 PoW 获得的一次性配额,例如,一个账户通过抵押获得了 1 UTPS 的配额,在过去 74 个快照块期间没有发起交易,并且计算了一个 2 UTPS 难度的 PoW,那么这个账户在发起一笔新交易时,最多可以使用 77 UTPS 的配额。

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

或者 UTPS 大约相当于在不算 PoW 的情况下抵押多少 vite 大约相当于在不抵押的情况下计算多少难度的 PoW
0.0 0 0 0 0
21000 1 10000 67108863
42000 2 20007 134276984
63000 3 30033 201563940
84000 4 40085 3733274509
105000 5 50173 290666828
126000 6 60306 310523977
147000 7 70494 360275060
168000 8 80746 428403748
189000 9 91073 496921930
210000 10 101486 565896574
231000 11 111995 635397250
252000 12 122612 705496588
273000 13 133350 776270783
294000 14 144222 847800161
315000 15 155241 920169805
336000 16 166424 993470265
357000 17 177787 1067798363
378000 18 189346 1143258118
399000 19 201122 1219961801
420000 20 213135 1298031169
441000 21 225407 1377598894
462000 22 237966 1458810249
483000 23 250838 1541825095
504000 24 264056 1626820249
525000 25 277654 1713992319
546000 26 291673 1803561138
567000 27 306158 1895773931
588000 28 321161 1990910446
609000 29 336741 2089289313
630000 30 352969 2191275997
651000 31 369924 2297292878
672000 32 387705 2407832162
693000 33 406426 2523472634
714000 34 426227 2644901733
735000 35 447279 2772945111
756000 36 469795 2908606929
777000 37 494048 3053125976
798000 38 520387 3208055683
819000 39 549280 3375381406
840000 40 581368 3557697962
861000 41 617561 4144793358
882000 42 659220 4424389078
903000 43 708510 4755203412
924000 44 769198 5162514130
945000 45 848763 5696519539
966000 46 965808 6482075769
987000 47 1197189 8034995932

即,在不计算 PoW 的情况下,抵押 10000vite 可以获得 1 UTPS 的交易频率,抵押 20007 可以获得 2 UTPS 的交易频率。抵押 134vite 等待 75 个快照块(约 1 分钟 15 秒)也可以发起一笔不带备注的转账交易。

获取配额的两种方式

抵押

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

参数

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

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

计算 PoW

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

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

PoW 计算公式

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

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

其中,

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

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

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