一、概述
本AIP提议将存储空间相关的 Gas 费用与执行和 I/O 操作的 Gas 费用解耦。执行和 I/O 操作的费用将继续由Gas单位价格确定,因此形成了Aptos的“费用市场”。存储空间相关的Gas费用将基于本机 token 的绝对值。这种解耦使得交易成本大幅降低,特别是对于具有大量执行和I/O依赖关系的交易。
这个 AIP 建议将与存储空间相关的 Gas 费用与执行和 I/O 操作的 Gas 费用分开。执行和 I/O 操作的费用依旧由 Gas 单价决定,由此形成了 Aptos 的“费用市场”。而与存储空间相关的费用将按照本地货币的固定数额来计算。这种分离将显著降低交易成本,特别是对于那些执行和 I/O 操作要求较高的交易而言。
二、动机
在区块链架构中,根据资源的稀缺性特性,可以将资源分为两种基本类型:
- 暂时的: CPU、IOPS 和带宽 - 这些资源会在系统不间断的在线状态下持续自动恢复。从效果上来看,资源看起来像是无限供应的,而其价格会根据市场需求的变化而波动,这意味着如果系统利用率不高,成本可以非常低廉,甚至是免费的。由于这些资源一旦购买或租赁即形成了不可挽回的沉没成本,不去使用它们基本上就等同于浪费,尽管这里要提一个附带说明,那就是电力和可能的网络流量本身仍然会产生一些成本。
- 永久的: 一旦分配,状态项就会占用磁盘空间,并对整个系统的性能产生永久性影响,除非将其删除。因此,当状态项存在于数据库中时,应该对其进行收费,并根据其在数据库中存在的时间跨度进行计费。同样,事务本身和发出的事件会占用磁盘空间,虽然不是永久性的,因为节点确实会对账本进行清理,但也应相应收费。
每个事务必须有最大的 Gas 量,以限制其执行时间和消耗的存储空间。因此,执行、IO 和空间消耗必须相互定义。所以,执行费用往往高于市场价,而存储费用则不反映其稀缺性,并且支持诸如退款等概念变得具有挑战性。
这里的建议是以本机 token 而不是 Gas 单位收取存储空间消耗,因此与用户指定的 Gas 单位价格无关。为了简化实现,用户界面不会更改,实际的费用将从用户事务中指定的最大交易费用中扣除。
1. 替代方案 - 事务中的最大存储空间
一个更系统化的方法是在事务中引入一个新字段来指定最大存储费用。虽然这提供了一种更系统化和明确的方式来指示预期结果,但它会给生态系统带来采用新事务标准的负担。目前的看法是,此类变化带来的好处有限;但是,随着时间推移,Aptos 预计会集成更多实用的新功能和特性,并在未来将此类新变化融入交易接口的其他更新中。
三、规范
1. 语言和框架
在编写Move代码时没有可见的变化,使用 SDK 和 CLI 时也没有可见的变化。但是经济学上有所改变:
2. 经济学
存储 Gas 费用的维度将保持不变,因为这些操作确实会引起运行时短暂资源消耗:
per_item_create和per_item_write将会调整。per_byte_create和per_byte_write保持不变。
随后,存储 Gas 参数的 create 和 write 变体之间的区别可以被删除。此外,所有存储 Gas 费用可以潜在地降低,因为它们不再承担抵御状态爆炸(defending against state explosion)的责任。
此外,存储空间相关的 Gas 参数将以本机 token 单位定义。在运行时,成本将以本机token 计算,并根据用户指定的Gas单位价格转换为 Gas 单位:charge_in_gas_unit = charge_in_octas / gas_unit_price
作为进一步措施,我们可以取消在 create 和 write 操作上所设置的存储 gas 参数之间的区分。在这样的变革下,所有的存储类 gas 费用都有可能进一步降低,因为它们将不再需要承担预防状态膨胀风险的职责。 此外,与存储空间相关的 gas 参数将按照本地货币单位来设定。在运行时,费用会用本地货币计算,并依据用户指定的每单位 gas 的价格转换成 gas 单位:charge_in_gas_unit = charge_in_octas / gas_unit_price
3. 配置
这些条目将被添加到全局 Gas 计划中,以指定各种消耗存储空间的操作的本机 token 成本:
storage_fee_per_state_slot_createstorage_fee_per_excess_state_bytestorage_fee_per_event_bytestorage_fee_per_transaction_byte
每个字节的费用都遵循每个事务的免费配额:
free_write_bytes_quota: (1KB) 这是现有的,现在也管辖着storage_fee_per_excess_state_byte。large_transaction_cutoff: (600 bytes) 这是现有的,现在也管辖着storage_fee_per_transaction_byte。free_event_bytes_quota: (1KB) 这是新的,它管辖着storage_fee_per_event_byte。
这些不同类别 Gas 费用的每个事务硬限制将被添加到全局 Gas 计划中,以反映网络在不同类别下具有不同数量的资源,单个事务中花费在磁盘空间分配上的合理 Gas 量可能足以支持另一个事务运行数分钟的CPU消耗操作。
max_execution_gas: 这是以Gas单位为单位的。max_io_gas_per: 这是以Gas单位为单位的,管辖存储成本的短暂方面,即IOPS和带宽。max_storage_fee: 这是以Octas为单位的,管辖了本提案中描述的新类别的费用。
4. 替代方案 - 事务中的最大存储空间
一个更系统化的方法是在事务中引入一个新字段来指定最大存储费用。虽然这提供了一种更系统化和明确的方式来指示预期结果,但它会给生态系统带来采用新事务标准的负担。目前的期望是,这种额外的摩擦提供的价值有限;然而,随着时间的推移,Aptos将会聚合更多有用的功能,并将与其他有用的事务接口更新一起采用这一功能。
四、规范
1. 语言和框架
在编写Move代码时没有可见的变化,使用SDK和CLI时也没有可见的变化。但是经济学上有所改变:
2. 经济学
存储Gas费用的维度将保持不变,因为这些操作确实会引起运行时短暂资源消耗:
per_item_create和per_item_write将会调整。per_byte_create和per_byte_write保持不变。
随后,存储Gas参数的 create 和 write 变体之间的区别可以被移除。此外,所有存储Gas费用可以潜在地降低,因为它们不再承担抵御状态爆炸(state explosion)的责任。
此外,存储空间相关的Gas参数将以本机 token 单位定义。在运行时,成本将以本机 token 计算,并根据用户指定的Gas单位价格转换为Gas单位:charge_in_gas_unit = charge_in_octas / gas_unit_price
3. 配置
这些条目将被添加到全局 Gas 计划中,以指定各种消耗存储空间的操作的本机 token 成本:
storage_fee_per_state_slot_createstorage_fee_per_excess_state_bytestorage_fee_per_event_bytestorage_fee_per_transaction_byte
每个字节的费用都遵循每个事务的免费配额:
free_write_bytes_quota: (1KB) 这是现有的,现在也管辖着storage_fee_per_excess_state_byte。large_transaction_cutoff: (600 bytes) 这是现有的,现在也管辖着storage_fee_per_transaction_byte。free_event_bytes_quota: (1KB) 这是新的,它管辖着storage_fee_per_event_byte。
这些不同类别Gas费用的每个事务硬限制将被添加到全局Gas计划中,以反映网络在不同类别下具有不同数量的资源,单个事务中花费在磁盘空间分配上的合理Gas量可能足以支持另一个事务运行数分钟的 CPU 消耗操作。
max_execution_gas: 这是以Gas单位为单位的。max_io_gas_per: 这是以Gas单位为单位的,管辖存储成本的短暂方面,即 IOPS 和带宽。max_storage_fee: 这是以 Octas 为单位的,管辖了本提案中描述的新类别的费用。
五、参考实施
| 事务类型 | 当前成本 | 新成本 | 变化 | 减少因素 |
|---|---|---|---|---|
| (每个事务的最小费用) | 15000 | 200 | -98.67% | 75.0倍 |
| 转账 | 54200 | 600 | -98.89% | 90.3倍 |
| 创建账户 | 153600 | 101600 | -33.85% | 1.5倍 |
| 创建转账 | 188000 | 101900 | -45.80% | 1.8倍 |
| 创建质押池 | 776200 | 207700 | -73.24% | 3.7倍 |
| 更换共识密钥 | 2178300 | 21800 | -99.00% | 99.9倍 |
| 加入验证器组100 | 625300 | 461100 | -26.26% | 1.4倍 |
| 添加质押 | 675700 | 461500 | -31.70% | 1.5倍 |
| 解锁质押 | 163500 | 1600 | -99.02% | 102.2倍 |
| 提取质押 | 153900 | 1600 | -98.96% | 96.2倍 |
| 离开验证器组100 | 610500 | 460900 | -24.50% | 1.3倍 |
| 创建集合 | 174100 | 100800 | -42.10% | 1.7倍 |
| 第一次创建 token | 382100 | 152400 | -60.12% | 2.5倍 |
| 铸造 token | 117100 | 1200 | -98.98% | 97.6倍 |
| 修改 token | 272200 | 52200 | -80.82% | 5.2倍 |
| 第二次修改 token | 129000 | 1300 | -98.99% | 99.2倍 |
| 添加10个新属性的修改 token | 430900 | 4300 | -99.00% | 100.2倍 |
| 修改10个现有属性的修改 token | 451100 | 4500 | -99.00% | 100.2倍 |
| 发布小型合约 | 745700 | 107400 | -85.60% | 6.9倍 |
| 升级小型合约 | 660200 | 8100 | -98.77% | 81.5倍 |
| 发布大型合约 | 10735800 | 9810700 | -8.62% | 1.1倍 |
六、风险和缺点
将存储费用作为 Gas 费用的一部分是不直观的。需要更好的工具来获得对事务成本结构的可见性。此外,文档站点需要更新以反映这些变化。
七、未来潜力
1. 删除退款(Deletion Refund )
为了激励 “状态卫生”,或者说状态空间清理,进一步的工作将使得可以退还分配存储槽的存储费用的部分或全部。由于本提案导致的分配将使用本机 token 而不是 Gas 单位收费,这在很大程度上消除了关于存储退款套利的担忧。
八、建议的部署时间表
在三月份进行测试网和主网部署。