MOVE语言首创燃料费设计:链上计算成本如何确定

MOVE语言首个燃料费设计:如何计算链上消耗

燃料费计量是许多区块链的基本概念,它定义了执行和存储链上交易所需的计算和存储资源量的抽象计算。燃料费计划将链上所有执行所消耗的成本确定,用于计算执行交易期间使用的燃料费花费。

流程

为了有效执行,链上的流程是:

  1. 定义原则
  2. 准备评估框架,确定每个执行的价格
  3. 为MOVE建立燃料费计量系统和安全燃料费代数
  4. 将上游燃料费框架导入
  5. 使燃料费框架具有存储意识
  6. 进一步细化燃料费计划

原则

定义的原则是:

  1. 操作成本应与网络可用资源直接相关(如CPU、内存、网络、存储I/O和空间使用等)。技术和流程改进后,燃料费成本应随之降低。

  2. 燃料费应由链上治理设置,并可无缝配置。

  3. 燃料费可防止对网络固定资源的DoS攻击,可能需要根据网络情况通过治理建议快速调整。

  4. 燃料费价格反映了加速增长和保持区块链普及性的愿景。

  5. 鼓励在设计中做出好的选择,如优先考虑安全性、模块化、断言等事件。

计算燃料费

用户提交交易时,必须在交易中指定两个数量:

最大燃料费数量: 以燃料费单位计量。这是用户愿意为执行交易花费的最大燃料费单位数。

燃料费单价: 以每单位燃料费的八进制计算,1八进制=0.00000001 APT(=$10^{-8}$)。这是用户愿意支付的燃料费价格。

执行过程中,交易将被收取:

  1. 固定成本,固定基数加上大额交易的额外费用。
  2. 执行成本,用于执行MOVE指令。
  3. 读取成本,用于从持久存储读取数据。
  4. 写入成本,用于将数据写入持久存储。

最终交易费用可以用消耗的燃料费总量乘以燃料费单价来计算。例如,如果一笔交易消耗670个燃料费单位,用户指定的燃料费单价为每单位100 Octa,那么最终交易费用为670 * 100 = 67000 Octa = 0.00067 APT。

如果交易执行过程中耗尽燃料费,发送方将根据最大燃料费量收取费用,该交易所做的所有更改都将被恢复。

建立燃料费计划表

1. 基本配置

燃料费计划中有几个组成部分与单个操作的细节无关,包括交易大小和最大燃料费单位(不同于用户在交易中指定的最大燃料费量)。

2. 交易规模

大多数交易规模可能在千字节数量级。然而,MOVE模块的发布很容易就有几千字节,而框架大约有100 KB。大多数用户模块大小一般在4KB到40KB之间。最初将交易规模值设置为32KB,但根据社区反应要求提供更多空间以简化应用开发,因此将交易规模调整为64KB。

非常大规模的交易会导致整个网络带宽成本提高,可能对性能产生负面影响。如果滥用,内存池会被鼓励忽略规模更大的交易,因此我们的方法是在最大规模交易的大小和可访问性之间取得平衡。

3. 最大燃料费单位

燃料费计划中的最大燃料费单位定义了一个交易最多可以执行多少操作。注意!这不同于用户在交易中指定的最大燃料费量。

燃料费计划的最大燃料费单位直接影响到一个交易可以执行多长时间,设置过高可能会导致对区块链产生负面性能影响交易。例如,用户可能忘记在while循环中有一个增量,从而导致无限循环,这是一个常见错误。即使进行最大的框架升级,仍然不到燃料费计划的最大燃料费单位(设定为1,000,000)的90%。

4. 执行

为评估执行成本,构建了基准框架,并在执行该框架时使用Valgrind来分析MOVE VM。其输出是一组带注释的源代码,告诉每行代码产生了多少机器指令。

在上述分析帮助下,粗略估计了所有MOVE指令和本机函数的相对成本。然而,这个方法与内联函数存在一些问题:它们不会自动包含在调用者的计数中。我们还看到,这只发生在分析某些MOVE指令时,可以通过将数字相加来解决这个问题。

随后,通过考虑增强系统稳健性和安全性的编码范例,团队得出了最终执行的机器指令数量。这个数字依次与存储和最大燃料费单位进行权衡,以确定它们在燃料费计划中的当前值。

5. 存储

每当访问存储在持久存储中的账本状态项或数据时,节点都会向存储设备发出读取或写入。每秒的数据访问总数取决于存储设备的带宽和IOPS容量。与燃料费调度计算部分的CPU周期类似,数据访问是区块链用户在系统负载时通过费用市场竞争的瞬时稀缺性,此外,写入数据的磁盘占用成本在链上是永久的。团队通过考虑这些成本来设计存储燃料费计划。

访问和存储任何状态项都会产生与验证整个区块链状态的数据结构相关的成本。此成本与不同状态项的基数有关($2^{256}$)。还有一个成本与每个项目的大小成正比。要对一个状态项进行操作,费用为(下一节中描述的例外情况除外):

存储燃料费 = item_fee + (byte_fee * bytes)

读、创建和写

对状态项的任何访问都属于以下三种类型之一:读、创建或写。访问按项目费和字节费收费,如上面的等式所示。

读操作是最常见的操作,它只受瞬时资源稀缺的限制。因此,读取费用是根据磁盘IOPS(项目费用)和参考硬件规范的带宽容量进行校准的。

create是在状态存储中添加一个新项。因此,create增加了身份验证数据结构,使一切都变得更昂贵,因此成本最高。创建费用是根据网络拥有的参考磁盘空间进行校准的。因此,用项目(item_fee)和字节(byte_fee)填满磁盘需要大量的燃料费。

写操作更新状态存储中的现有项。因此,写操作不会在身份验证数据结构中产生额外的开销。然而,通过修改现有的条目到更大的字节,仍然可以破坏磁盘。因此,我们对更新项中的字节收取与创建时相同的费用。

应该注意的是,与存储相关的成本是基于每一笔交易进行评估的:即使多次读取/写入相同的资源,也只需要支付一次费用。

基于上述考虑,我们定义了6个燃料费参数,它们构成了燃料费总费用的组成部分。见以下:

per_item_read:根据IOPs进行校正 per_byte_read:根据实际带宽校准 per_item_create:根据目标总项目进行校准 per_byte_create:根据目标总大小进行校准-每个项目包含的第一个1KB per_item_write:与per_item_read相同 per_byte_write:与per_byte_create相同

稳定的燃料费单位成本

无论以APT或法定货币的市场价值计算执行操作的成本如何,每个操作和交易本身都需要相对于存储和执行成本的固定单位成本。固定的燃料费单位成本有助于保持燃料费计划不变,并与APT的自由市场价值脱钩。此外,正确选择燃料费单位的精确位数有助于保持燃料费计划不变。考虑到这一点,团队以大约3位数的精度来表示燃料费单位。因此,转账交易的成本大约是700个燃料费单位。

社区参与

即使对燃料费计划投入了大量精力,但是它还远远不够完善。作为一个社区项目,社区成员可以选择:

  1. 根据经验,找出燃料费计划不合理的地方
  2. 说出对燃料费计划的担忧,并参与社区讨论
  3. 就与燃料费相关的治理提案进行投票

如何调整燃料费成本?

燃料费计划作为链上配置被存储,但是可以通过治理提案进行更改,并且可以无缝添加新指令或原生功能。

燃料费计划被设计为可扩展的,允许通过治理提案对其进行升级。随着不断改进MOVE VM并纳入用户反馈,燃料费参数可以随着时间的推移进行调整。

有时,燃料费公式可能需要超出链上配置的复杂更改。这些燃料费公式通常用Rust编码,并通过链上燃料费特征标志来区分。要升级这些公式,必须使用新公式更新节点软件,并以不同的燃料费特征标志进行区分。然后必须发布节点软件并为节点运营商大量采用,最后,必须发布并批准治理提案才能使用新的燃料费版本。

未来的工作

这是MOVE的第一个可行的燃料费框架。它需要对MOVE VM和Core进行大量修改。我们希望这项工作为今后的工作铺平道路:

1) 降低执行成本,拥有一个真实的燃料费模型表明编译器和虚拟机在哪里有效率,团队可以改进其中的大部分以降低执行成本。

2) 多维燃料费计算,允许用户为执行和存储指定单独的预算。这样,用户就不必为因为代码编写不佳的应用程序花费过长的执行时间,支付高昂的燃料费价格。它还将允许对区块链端交易的最大燃料费价格进行更细粒度的定义。

3) 缓解臃肿状态,目前没有简单的方法来缩小状态集,除了合约(或用户)显式删除事物。用户付钱删除数据可能会带来套利机会,用户在便宜的时候创建存储,在昂贵的时候删除它。推迟了解决这一挑战,这可能会削弱开发人员删除链上数据的动力。该团队正在探索每个项目TTL的概念,该概念将在TTL到期时删除未访问的状态项目。

此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 6
  • 分享
评论
0/400
wrekt_but_learningvip
· 20小时前
复杂燃料费诶 累死了
回复0
闪电站岗人vip
· 07-15 20:58
move又割韭菜
回复0
ZK佛系玩家vip
· 07-15 20:56
这gas费就是个黑洞
回复0
InfraVibesvip
· 07-15 20:55
太花里胡哨了吧 咋计算的先说清楚啊
回复0
GmGnSleepervip
· 07-15 20:52
move大法好啊
回复0
GasFeeCriervip
· 07-15 20:40
move果然还是收费的
回复0
交易,随时随地
qrCode
扫码下载 Gate APP
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)