以太坊状态模型的不足之一是平均状态增长与最坏情况状态增长之间的巨大差异,使用 EIP-1559 对网络临时成本和永久成本分开定价是一种解决思路。

撰文:Vitalik Buterin,以太坊联合创始人
编译:白计划团队

本文系 Vitalik 在以太坊研究者论坛里提出的一个最新讨论,该讨论是继以太坊研究科学家 BarnabéMonnot 提出的关于 EIP1559 切实实施的思路进行的再次结合。

以下为原文翻译,团队对部分词汇进行了批注及少许删改。

Vitalik Buterin 最新讨论:以太坊 Gas 费的分开定价与双轨 EIP-1559

正如我在此前的《关于资源定价的立场文件》中详细讨论的那样,以太坊中的 Gas 实际上是支付三种不同的资源:

  1. 带宽(必须下载的事务数据)
  2. 计算(验证和执行交易的时间)
  3. 存储(历史记录,但更重要的是状态陈述,例如帐户余额,随机数,约代码,合约存储)

白计划批注:《关于资源定价的立场文件》是一份区块链资源定价的草案,其中 Vitalik 通过数学演算推论了相应的定价方式。

该草案内容包含:价格与数量、社会成本曲线、首次和二次拍卖、可调整收费计划、存储维护费,以及包含为什么固定费用并未得到充分利用?

带宽和计算是短暂的成本,存储不像这两个成本,它会超出短暂的限制。

在一个块的时间内,一个节点可以进行多少次计算或下载数据是有限度的,一旦该块通过,下载和验证所需的量就达到了极限。块的大部分都消失了(将来只有少数同步节点需要对其进行处理)。

而存储是持续的成本。如果一个单独的块状态增加了 100MB,该块当下可以处理好,但是一系列的块将使以太坊无法使用。状态增长的「爆发」影响可以忽略不计,但长期影响是最严重的,一旦建立的一个超大状态就永远给网络增添了负担。

不过,随着状态变为无状态(白计划注:即无状态以太坊方案),(超大)状态的长期影响会大大减少:状态不会给网络造成永久负担,它只会负担大约一年的时间,在那一年中,只有一小部分节点需要实际存储那个(超大)状态。但这种长期(一年)成本仍然是真实存在的,并且需要将其定价。

平均大小与最坏情况的存储大小

在当前(状态)协议(普遍认为是不可持续的)和状态到期的改进协议中,对状态建模的不足之一是平均状态增长与最坏情况状态增长之间的巨大差异。

考虑当前的协议。如今,该状态的总大小约为 5.5 亿个对象,约 32GB (不包括 trie 开销)。如果我们剔除上一年所有 not touched 的状态,那总量很容易下降一半以上。

现在,最坏的情况是什么?

合同代码的创建按每字节 200Gas 的费用收费,因此,如果将一个区块分成 3 个事务,每个事务创建一个合同,我们可以为 12334800Gas+3*55000Gas 来制作 3 个 20558 字节的合同,以增加合同创建的开销。

这样,在单个块中,存储大小可以增加 20600*3=61800 字节。

假设平均出块时间为 13.1 秒 1 个,每年都有 31556925/13.1=2408925 块,总的来说,状态可以按 61800*2408925=148871600381.67938 字节增长,即约 138 GB。

这个差异约为 10 倍。(白计划注:下文数据 16GB 根据上下文理解是以太坊目前一年的状态总量大小)

非常重要的是,消费者硬件 RAM 可以容纳实际大小可能是 16GB (如果不能,我们可以调整 Gas 价格或状态有效期以使其适合),而 138GB 则不能被存储。

如果我们可以使最坏的情况接近平均情况,那就太好了。

双轨 EIP-1559

解决此问题的自然方法是对临时成本和永久成本使用 EIP-1559 定价,但调整期有所不同。

对于临时成本,价格可以一次调整 10%以上。但是,对于永久性成本,将使价格调整慢得多。

如果我们采用 AMM 成本曲线机制作为基础,对于存储,我们可以考虑一条曲线,目标速率为每月 1GB,而成本的增加取决于我们比目标高出多少:

例如,每超出目标 1GB,存储成本就可能翻倍。在这种情况下,存储块价格可能需要 3 天左右的才能翻一番。如果存储增长超过 10GB,则存储成本将是正常价格的 1000 倍,在经济上无法继续存储。

有两种方法可以实现此目的:

1. 用 Gas 购买存储。 也就是说,使用 SSTORE 创建新的存储插槽,像现在一样消耗 Gas,但是消耗的 Gas 量将是可变的。这样做的缺点是,它会形成(变相)激励措施,用户宁愿在 Gas 价格较低的周末补充存储空间。

2. 用 ETH 购买存储。 交易(和调用)除了需要 Gas 外,还需要提供另一种资源(我们可以称其为 mana),该资源将采用与 Gas 相似的机制,但参数不同。这样做的缺点是使调用规则变得复杂,并且需要添加新的 CALL 操作码。

请注意,这里有一个混合选项:

3. 可以以 ETH 定价存储,但以 Gas 收费 (因此,如果基本费用上涨了 2 倍,则填充存储插槽所需的 Gas 将自动减半)。我们可以将用于扩展存储的 ETH 排除在 EIP 1559 Gas 价格更新规则甚至是区块限制范围之外。

4. 将 Gas 更全面地改造为三个概念:Gas,执行点和存储点。 1Gas=1wei; 分配 Gas 的交易只是意味着它正在将其某些 wei 转换为可用于支付资源的特殊形式。就 call 和 subcall 之间的传递方式而言,此形式的工作方式与 Gas 相同。

但是,AMM 现在管理两项成本:执行点成本和存储点成本。当执行过程处理当前消耗 N 个 Gas 的操作码时,它将花费 N 个执行点,这意味着需要 N* execution_point_cost 支付 Gas。填充存储槽需要 1 个存储点,因此需要 storage_point_cost 充入 Gas。

最后,还要注意,状态限期的路线图里有望删除退款。这是因为技术原因:存储插槽无法「变空」且资格获得退款,因此只能将它们设置为零,并且零记录必须保持该状态,直到该时期结束并且该状态可以到期为止。这大大降低了早期在存储租金尝试时遇到的复杂性问题。

特别感谢 @barnabe 在早期提出了类似的想法。