1

无状态性的重要性

 3 years ago
source link: https://learnblockchain.cn/article/2312
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
无状态性的重要性 | 登链社区 | 深入浅出区块链技术

无状态性的重要性

当前的以太坊1.0链最大的问题在于其状态大小。约为 10-100 GB (具体取决于其存储方式),对于许多节点来说,将其保存在工作内存中是不切实际的,因此会选择慢速固定存储。然而,硬盘速度过慢难以与以太坊区块保持同步 (或是从创世区块开始同步),因此必须使用更加昂贵的 SSD。这么说吧,当前的状态大小还不是最大的问题,而是状态的增长成本相对较低,并且会一直增长,即时我们提高状态增长的成本,也无法使状态占用者为网络实际受到的影响付费,而该影响是永恒存在的。

来源 | dankradfeist.de

当前的以太坊1.0链最大的问题在于其状态大小。约为 10-100 GB (具体取决于其存储方式),对于许多节点来说,将其保存在工作内存中是不切实际的,因此会选择慢速固定存储。然而,硬盘速度过慢难以与以太坊区块保持同步 (或是从创世区块开始同步),因此必须使用更加昂贵的 SSD。这么说吧,当前的状态大小还不是最大的问题,而是状态的增长成本相对较低,并且会一直增长,即时我们提高状态增长的成本,也无法使状态占用者为网络实际受到的影响付费,而该影响是永恒存在的。

目前出现的解决方案主要围绕两个方向:

  • 状态租金:为了使状态保持在活动内存中,持续进行付费
  • 无状态性:区块保留所有的证明 (witness),例如默克尔证明,因此在验证区块有效性的时候不再需要状态

在“无状态性”方向中,又有不同的概念值得探索:

  • 部分无状态性:只需要对某些 (陈旧) 状态提供见证,减少验证区块所需的状态数量
  • 弱无状态性:验证区块无需状态,但是提议区块需要完整状态

Vitalik 在这篇文章中提出了如何将这些概念梳理成一个通用的框架,并且表示了部分无状态性和状态租金非常相似,因为两者在对活跃状态进行修改时都需要进行某种形式的支付,以及一份重新激活陈旧状态的证明。

如果你是 Eth1 的用户,那么你可能觉得只保留 1 GB 或者甚至是 100 MB 的活跃状态的部分无状态性是一项巨大成就,那为什么还要这么费劲地实现完全的无状态性?我认为完整 (弱) 无状态性释放了巨大的潜能,而这是部分无状态性无法做到的,因此我们要竭尽全力实现完全无状态性。

理解 Eth2 验证者

Eth1 在过去一直被诟病其对硬件的要求非常高,虽然这些斥责并不都是公平的 (经过挑选后的中等消费级硬件也可以运行 Eth1 节点),但我们需要重视这些事实,尤其是希望在不损害去中心化的前提下对以太坊进行扩容。对于 Eth2 来说,我们树立了非常宏大的目标:能够在低成本的硬件上运行 Eth2 节点和验证者,甚至是树莓派或智能手机。

这条通向扩容性的路径并不轻松。其他项目 (例如 EOS 和 Solana) 则需要更高性能的硬件和网络连接。但我认为要保障去中心化,降低共识节点以及 P2P 节点的门槛是必要的。

在 Eth2 中,共识节点是验证者。Eth1 和 Eth2 的共识节点存在非常重要的区别:

  • Eth1 的共识节点是矿工。要为区块链“投票”,你必须要生产区块。也就是说,共识节点和区块生产者是不可分割的。
  • Eth2 或是当前的第一个阶段 (信标链) 中,提议区块和形成共识是两种不同的机制:每 12 秒由一个随机择出的验证者来提议区块,而共识是通过证明 (attestation) 形成的,每个验证者在每个 epoch (每 6.4 分钟) 对区块链进行投票。现在每几分钟都有超过十万的验证者在投票形成共识。区块生产者对共识 (几乎^几乎没有影响,因为现在进行了细微优化以提高对某些平衡攻击 (balance attack) 的抵御能力,平衡攻击确实使提议者能对分叉选择产生短期影响。) 没有影响,他们只能对区块内包含的内容进行选择^确切地说,如果区块生产者开始勾结并审查大量证明,可能会产生影响,但是单个区块的生产者对共识造成的影响完全可以忽略不计。。

解除区块提议者与共识的关联开启了一个重要的设计空间。信标链从验证者集中随机选择区块提议者,而对于分片链,则不必如此:

  • 对于分片 (尤其是 Eth1 执行分片) 来说一种有趣的可能性在于,验证者能够进入生产区块的列表。这类验证者可能需要更高性能的硬件,可能也需要具有“完整”状态。
  • 另一个可能性也是我们目前正在为数据分片加以实现的,任何人都可以被选中提议区块,但是区块的具体内容不由提议者决定,不同的参与者可以通过竞价使其打包的区块被提议。

在这两种情况中,弱状态验证意味着所有其他的验证者 (不生产区块或决定区块内容的验证者) 并不需要状态。这一点与 Eth1 截然不同:在 Eth1 中,对形成共识的节点 (即矿工) 的要求非常高,因此使他们保留完整状态似乎没有问题。但是在 Eth2 中,我们可能会大幅降低参与门槛,并且我们应该利用这一点来保障去中心化和安全性。

提议者成本较高可以理解

还有一点重要的反对观点可能是,如果区块提议的成本过高,那么去中心化也会受到损害,即使我们降低了验证者和 P2P 节点的门槛。但事情并非如此,“提议者”和“验证者”之间存在重要的差异:

  • 对于验证者,我们需要绝大多数是诚实的,即所质押的 ETH 中需要超过 2/3。P2P 节点的情况可能类似,但是就我所知并不需要一定比例的 P2P 节点必须是诚实的,但是为了确保总是能收到有效的链,每个人都需要连接至少一个诚实的 P2P 节点,这个比例大概是 5%,在实践中可能更高。
  • 对于提议者,我们对于其是否诚实的要求低得多,与 Eth1 不同,Eth2 的提议者不审查过往的区块 (因为他们不投票),只能决定他们所提议的区块的内容。假设你的交易不是特别紧迫,如果 95% 的提议者尝试对其进行审查,那么第 20 个提议者仍然可以将其安全打包 (但是低延迟的抗审查制度是另一回事,在实践中更难实现)。

这也是为什么相较验证者,我并不那么担心提高提议者的硬件要求。如果我们保持正常验证者的要求较低,那么提议者需要 128GB RAM 的 PC 来存储大型状态也没有问题。我担心的是,如果一台能够满足这些要求的 PC 价格为 10 万美元,但如果我们将其控制在 5 千美元以下,一旦发现审查,如果社区没有迅速引入更多提议者来做出反应是不合理的。

最后,还有一些其他的原因导致区块提议者可能需要更好的硬件设备,并且在获取 MEV 时也更有优势。

此处我使用“提议者”来指代打包区块的角色,这与正式签名并验证的角色并不一定是一致的,在 rollups 中他们可能是“序列器” (sequencer)。简单起见,我在此处将其称作提议者,因为如果仅向系统中引入一个只负责提议区块的新角色,我认为系统不会因此受到根本上的破坏。

实现无状态的裨益

本文至此我还没有论证过为什么无状态性如此有力,在可执行信标链提案中,将状态从 10 GB 缩减到 1 GB 或 100 MB 似乎能为验证者节省许多开销,那我们为什么还需要无状态性?

如果我们顺势走下去,可执行的 Eth1 区块可以成为一个分片。而在可执行信标链的提案中,所有的验证者都必须保持运行完整的 Eth1 执行 (否则会面临签署无效区块的风险)。而分片不应具备这一属性,分片中签署一个区块只需要一个委员会 (因此是验证者中的1/1024),并且其他人不需要信任该委员会的绝大部分验证者是诚实的^不诚实的委员会作恶可能会影响整个网络,并导致严重的延迟,但是引入无法无效/不可用的区块,只要有一个诚实验证者在委员会尝试作恶时吹哨。而这只有在 Eth1 具备无状态性时才有可能:

  • 我们希望所有验证者的负载大致相等,并且没有极端的峰值。 因此长时间 (例如一个小时或一天) 派遣某个验证者成为 Eth1 委员会成员,实际上是很糟糕的:这意味着就带宽要求而言,验证者的规模仍然必须能够与完整的 Eth1 链保持一致。 此外,如果长时间使用同样的委员会 (例如通过贿赂攻击),委员会变得更具攻击性
  • 我们希望能够简单地对 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)。

二进制树还是verkle trie?

我认为总的来说,力争完整 (弱) 无状态性的声音压倒了部分无状态性或状态租金方案。这对用户的影响会更小:他们根本不必考虑状态。他们唯一要做的就是添加见证 (以便 P2P 网络能够验证有效交易)。创建见证的成本非常低,以至于可以想象到会有许多相关服务。 实际上大多数钱包已经依赖外部服务,不需要用户运行自己的节点。获取见证也只是一个微小的功能4。

部分无状态性或状态租金,在完全弱无状态性的道路中增加了极大的用户体验障碍。但考虑到仅使用二进制默克尔树尝试实现无状态是非常困难的,并且要允许默克尔树证明需要对 gas 进行改动 ,而这会损害用户体验^想要自己运行节点的用户仍让能够借助外部服务来获取见证。这种操作是免信任的,因为在知道最近的状态根的前提下,见证就是它们自身的证明。

因此在我看来,我们现在应该往 verkle tries 的方向努力。这使得我们可以具有小于 1 MB 的可管理的证明,并且只有由 EIP-2929 提出的适度 gas 费用以及针对代码块收费。其缺点很容易得到控制,对用户几乎没有实际影响:

  • 开发者需要学习新的密码学原语
  • 添加更多非抗后量子密码学。第二点听起来很可怕,但是我们已经在 Eth2 中引入了 KZG 承诺以进行数据可用性采样,并且无论如何我们都在使用基于椭圆曲线的签名。需要对合并的 Eth1 和 Eth2 链进行一些后量子升级,目前没有可实践的后量子替代方案,因此我们不能停止前进。就采用而言,未来5年极为重要。摆在前面的道路就是竭尽所能,并在 5-10 年内,当 STARK 足够强大时,我们将对所有原语进行完全的后量子升级。

总的来说,verkle tries 可以解决接下来五年的状态问题。现在我们将能够实现完全 (弱) 无状态性,而对用户和智能合约开发者几乎没有影响。我们将能够提升 gas 上限 (因为验证变得更快) 和更多的执行分片,所有这些几乎都不会对安全性和去中心化产生影响。

最难啃的硬骨头是让每个人都理解 KZG 承诺和 verkle tries 的工作方式。由于 Eth2 将使用 KZG 承诺来保证数据的可用性,大多数以太坊开发者都需要进行相关工作。

ECN的翻译工作旨在为中国以太坊社区传递优质资讯和学习资源,文章版权归原作者所有,转载须注明原文出处以及ethereum.cn,若需长期转载,请联系[email protected]进行授权。

原文链接:https://news.ethereum.cn/Eth1.x/why-stateless

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2021-03-29 10:22
  • 阅读 ( 92 )
  • 学分 ( 0 )
  • 分类:以太坊

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK