[TOC]

AIP-59 - 存储 IO Gas 调整

一、概述

本提案旨在通过精细调整存储读写操作的 Gas 计费逻辑,使得收费体系更为公正,进而更准确地反映由不同交易负载引起的系统资源消耗情况。我们的目标是:

  1. 按照状态读取数据量的 4KB (即“页”)区间来计费。
  2. 调整每次读取费用与读取大小(以“页”为单位)的相对权重。
  3. 删除每个状态写操作所提供的免费字节配额。
  4. 降低每字节写入的相对成本。

1. 目标

使得交易涉及的 IO 费用更准确地反映其总体 IO 延迟,特别是那些负载各异的交易。实现这一目标的方法是让收取的费用更真实地代表了实际的资源消耗。

2. 不在范围内

我们限定这项提案仅涉及 IO 计算资源消耗,不涉及“存储费用”。 其中,“ Gas ”主要指交易成本中与时间或处理延时相关的部分,而“存储费用”则指代交易所占用的存储空间的成本。

二、动机

当前的 IO Gas 成本并未能准确地反映出各种工作负载所引起的延时影响。

在数据读取方面,从存储状态中读取大小为 50 字节的数据与读取 2KB 的数据在效果上基本相同,而读取 500 字节与 20KB 的数据之间则存在显著差异。在大部分的系统中,以及软件架构的不同层级中,一旦数据超过 4KB,可能就意味着需要额外的内存页、缓存空间,或者需要进行额外的文件系统随机 IO 操作。

同时,从状态中读取一个 8KB 的数据项,其成本并不是读取 4KB 数据项的两倍,这是因为每次进行状态读取都会有一个基础成本。成本的主要部分与数据项通过稀疏默克尔树 (Sparse Merkle Tree) 认证的过程相关联,而这个认证过程的成本与树当前的高度呈比例关系,树高度又与状态中数据项总数的对数有关。这就是为什么随着状态的扩大,我们需要对每次读取操作的 Gas 成本进行适当调整的原因。

在数据写入方面,写操作的免费额度是在存储费用机制出台前设计的,旨在遏制大量数据写入而让简单交易的成本保持低廉。随着存储费用机制的引入,其已经接管了以低成本阻止磁盘空间被快速填充的任务(它取代了原有的存储用量计价曲线,以及 AIP-38 撤销了的每个写操作的免费额度),因此我们现在可以废除免费额度。在免费额度的影响下,相对于大数据项交易所产生的延迟影响来说,一个写入多个小数据项的交易并不昂贵,这并没有真实反映出两者在耗费的时间大致相同的情况下,应承担的成本差异。

三、影响

在我们对 gas 消耗的规则进行微调,适当调节 IO Gas 成本和计算 Gas 成本之间的权重,并对整个费用体系进行调整之后,主网上常见的简单交易所需要的成本将会保持大致相同。

四、替代方案

五、规范

读取气体仍由以下两个气体参数控制:

  • storage_io_per_state_slot_read:进行微调。
  • storage_io_per_state_byte_read:在收费时,状态读取的大小四舍五入到4KB边界,然后按照这个大小对每个字节收费。

在写入方面:

  • free_write_bytes_quota:忽略
  • storage_io_per_state_byte_write:由于现在不再受免费配额的限制,因此大幅降低。

读取和写入之间的相对权重,以及 IO 和计算之间的相对权重都进行了微调。最终的数字将作为 AIP-58 的一部分发布。

六、参考实现

https://github.com/aptos-labs/aptos-core/pull/11300

七、测试(可选)

Gas 校准。

八、风险和缺点

在启动新逻辑前后,现有交易接口的定价波动会得到调整。这种 Gas 校准将确保我们经常看到的正常交易成本不会有太大的波动。

我们目前不太担心,因为网络上的 Gas 价格非常低,几乎可以忽略不计。

九、未来潜力

十、时间表

1. 建议的实施时间表

2023年12月

2. 建议的开发者平台支持时间表

现有的 gas 估算机械仍将有效运行,依赖这一机制的生态系统会在模拟之后自动发起估算 Gas 准确的交易(txn)。因此,我们不认为平台需要做出任何改动。

3. 建议的部署时间表

v1.9,2024年初

十一、安全考虑

十二、未决问题(可选)