当前的以太坊1.0链最大的问题在于其状态大小。约为 10-100 GB (具体取决于其存储方式),对于许多节点来说,将其保存在工作内存中是不切实际的,因此会选择慢速固定存储。然而,硬盘速度过慢难以与以太坊区块保持同步 (或是从创世区块开始同步),因此必须使用更加昂贵的 SSD。这么说吧,当前的状态大小还不是最大的问题,而是状态的增长成本相对较低,并且会一直增长,即时我们提高状态增长的成本,也无法使状态占用者为网络实际受到的影响付费,而该影响是永恒存在的。
来源 | dankradfeist.de
当前的以太坊1.0链最大的问题在于其状态大小。约为 10-100 GB (具体取决于其存储方式),对于许多节点来说,将其保存在工作内存中是不切实际的,因此会选择慢速固定存储。然而,硬盘速度过慢难以与以太坊区块保持同步 (或是从创世区块开始同步),因此必须使用更加昂贵的 SSD。这么说吧,当前的状态大小还不是最大的问题,而是状态的增长成本相对较低,并且会一直增长,即时我们提高状态增长的成本,也无法使状态占用者为网络实际受到的影响付费,而该影响是永恒存在的。
目前出现的解决方案主要围绕两个方向:
在“无状态性”方向中,又有不同的概念值得探索:
Vitalik 在这篇文章中提出了如何将这些概念梳理成一个通用的框架,并且表示了部分无状态性和状态租金非常相似,因为两者在对活跃状态进行修改时都需要进行某种形式的支付,以及一份重新激活陈旧状态的证明。
如果你是 Eth1 的用户,那么你可能觉得只保留 1 GB 或者甚至是 100 MB 的活跃状态的部分无状态性是一项巨大成就,那为什么还要这么费劲地实现完全的无状态性?我认为完整 (弱) 无状态性释放了巨大的潜能,而这是部分无状态性无法做到的,因此我们要竭尽全力实现完全无状态性。
Eth1 在过去一直被诟病其对硬件的要求非常高,虽然这些斥责并不都是公平的 (经过挑选后的中等消费级硬件也可以运行 Eth1 节点),但我们需要重视这些事实,尤其是希望在不损害去中心化的前提下对以太坊进行扩容。对于 Eth2 来说,我们树立了非常宏大的目标:能够在低成本的硬件上运行 Eth2 节点和验证者,甚至是树莓派或智能手机。
这条通向扩容性的路径并不轻松。其他项目 (例如 EOS 和 Solana) 则需要更高性能的硬件和网络连接。但我认为要保障去中心化,降低共识节点以及 P2P 节点的门槛是必要的。
在 Eth2 中,共识节点是验证者。Eth1 和 Eth2 的共识节点存在非常重要的区别:
解除区块提议者与共识的关联开启了一个重要的设计空间。信标链从验证者集中随机选择区块提议者,而对于分片链,则不必如此:
在这两种情况中,弱状态验证意味着所有其他的验证者 (不生产区块或决定区块内容的验证者) 并不需要状态。这一点与 Eth1 截然不同:在 Eth1 中,对形成共识的节点 (即矿工) 的要求非常高,因此使他们保留完整状态似乎没有问题。但是在 Eth2 中,我们可能会大幅降低参与门槛,并且我们应该利用这一点来保障去中心化和安全性。
还有一点重要的反对观点可能是,如果区块提议的成本过高,那么去中心化也会受到损害,即使我们降低了验证者和 P2P 节点的门槛。但事情并非如此,“提议者”和“验证者”之间存在重要的差异:
这也是为什么相较验证者,我并不那么担心提高提议者的硬件要求。如果我们保持正常验证者的要求较低,那么提议者需要 128GB RAM 的 PC 来存储大型状态也没有问题。我担心的是,如果一台能够满足这些要求的 PC 价格为 10 万美元,但如果我们将其控制在 5 千美元以下,一旦发现审查,如果社区没有迅速引入更多提议者来做出反应是不合理的。
最后,还有一些其他的原因导致区块提议者可能需要更好的硬件设备,并且在获取 MEV 时也更有优势。
此处我使用“提议者”来指代打包区块的角色,这与正式签名并验证的角色并不一定是一致的,在 rollups 中他们可能是“序列器” (sequencer)。简单起见,我在此处将其称作提议者,因为如果仅向系统中引入一个只负责提议区块的新角色,我认为系统不会因此受到根本上的破坏。
本文至此我还没有论证过为什么无状态性如此有力,在可执行信标链提案中,将状态从 10 GB 缩减到 1 GB 或 100 MB 似乎能为验证者节省许多开销,那我们为什么还需要无状态性?
如果我们顺势走下去,可执行的 Eth1 区块可以成为一个分片。而在可执行信标链的提案中,所有的验证者都必须保持运行完整的 Eth1 执行 (否则会面临签署无效区块的风险)。而分片不应具备这一属性,分片中签署一个区块只需要一个委员会 (因此是验证者中的1/1024),并且其他人不需要信任该委员会的绝大部分验证者是诚实的^不诚实的委员会作恶可能会影响整个网络,并导致严重的延迟,但是引入无法无效/不可用的区块,只要有一个诚实验证者在委员会尝试作恶时吹哨。而这只有在 Eth1 具备无状态性时才有可能:
因此在 Eth1 具备完整无状态性的前提下,Eth1 可以成为一个分片 (花费更少的资源来维护,例如1/100)。同时,只有这样我们才能在数据分片之外引入更多的执行分片。
那么如果我们进入完全无状态却引入了 10 MB 的缓存呢? 或是1 MB?即使只想检查一个区块,也可以轻松下载,因为你已被分配到一个委员会,或者作为欺诈证明收到了该缓存?
你可以执行此操作,但是我们可以明显看到,如果大多数验证者仅验证单个区块,则不太可能是最佳的。假设我们的目标是 1 MB 的区块,此外我们还有 1 MB 的缓存,这意味着每当验证者想要验证一个区块时,他们都必须下载 2 MB 的数据 (包括区块和缓存)。他们必须每次都下载缓存,除非他们下载所有区块以保持最新的缓存,这正是我们要避免的事情。
这意味着,以 1 MB 大小的区块和 1 MB 的缓存相同的代价,我们可以将缓存设置为 0 并允许区块大小增加到 2 MB。
很明显 2 MB 的区块至少与 1 MB 的区块 + 1 MB 的缓存一样有效。原因是,如果这是我们认为的最佳选择,那么 2 MB 的区块可能只包含 1 MB 的缓存,我们只需在每个区块上提交缓存,然后在下一个区块中重新引入完整的缓存即可。这可能不是区块中那 1 MB 的最佳用途,但是你可以这样做。额外的 1 MB 可以被更好地利用,以允许引入更多的见证 (witness)。
我认为总的来说,力争完整 (弱) 无状态性的声音压倒了部分无状态性或状态租金方案。这对用户的影响会更小:他们根本不必考虑状态。他们唯一要做的就是添加见证 (以便 P2P 网络能够验证有效交易)。创建见证的成本非常低,以至于可以想象到会有许多相关服务。 实际上大多数钱包已经依赖外部服务,不需要用户运行自己的节点。获取见证也只是一个微小的功能4。
部分无状态性或状态租金,在完全弱无状态性的道路中增加了极大的用户体验障碍。但考虑到仅使用二进制默克尔树尝试实现无状态是非常困难的,并且要允许默克尔树证明需要对 gas 进行改动 ,而这会损害用户体验^想要自己运行节点的用户仍让能够借助外部服务来获取见证。这种操作是免信任的,因为在知道最近的状态根的前提下,见证就是它们自身的证明。
因此在我看来,我们现在应该往 verkle tries 的方向努力。这使得我们可以具有小于 1 MB 的可管理的证明,并且只有由 EIP-2929 提出的适度 gas 费用以及针对代码块收费。其缺点很容易得到控制,对用户几乎没有实际影响:
总的来说,verkle tries 可以解决接下来五年的状态问题。现在我们将能够实现完全 (弱) 无状态性,而对用户和智能合约开发者几乎没有影响。我们将能够提升 gas 上限 (因为验证变得更快) 和更多的执行分片,所有这些几乎都不会对安全性和去中心化产生影响。
最难啃的硬骨头是让每个人都理解 KZG 承诺和 verkle tries 的工作方式。由于 Eth2 将使用 KZG 承诺来保证数据的可用性,大多数以太坊开发者都需要进行相关工作。
ECN的翻译工作旨在为中国以太坊社区传递优质资讯和学习资源,文章版权归原作者所有,转载须注明原文出处以及ethereum.cn,若需长期转载,请联系eth@ecn.co进行授权。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!