随着以太坊网络的不断发展和成熟,不同类型节点的概念变得越来越重要。然而,现实情况是,大多数用户并不愿意付出运行节点的精力,尽管对许多人来说,硬件要求是可以实现的。在以太坊发展的“终局”中,至关重要的是用户能够在不需要深入技术知识或大量资源的情况下,验证状态完整性和数据可用性。毕竟,没有可验证性的区块链,仅仅是一个低效的数据库。
本文将探讨将塑造以太坊网络未来的三种关键节点类型:无状态节点、有状态节点和全节点/归档节点。我们将研究无状态节点如何通过零知识证明实现新块的信任验证,有状态节点如何提供快速且无信任的以太坊当前状态访问,以及全节点/归档节点如何存储从创世区块开始的完整链历史。通过理解每种节点类型的作用和权衡,我们可以朝着更去中心化、安全和可扩展的以太坊生态系统努力。
正如我们今天所看到的,大多数用户并不愿意花费太多精力去运行任何类型的节点,尽管对于比特币和以太坊来说,硬件要求对大多数重度用户而言是可实现的。这里的“重度用户”指的是在链上拥有相当数量资产的用户,可以理解为那些运行节点的成本并不是障碍的人。
主要原因可能是大多数用户根本不关心,或者不愿意花几百美元购买硬件,或者没有运行节点的技术知识。尽管比特币和以太坊在简化这一过程上已经取得了很大进展,但对于非技术用户而言,这仍然是一个相当复杂的任务。
无状态以太坊的愿景
我认为,在每个区块链的“终局”中,用户将需要验证状态完整性和数据可用性,而他们甚至不必了解这两者的具体含义。好消息是,这一愿景通过足够的工程技术(零知识技术和少量的数据可用性抽样)完全可以实现。
在这个终局中,基本上所有值得使用的钱包将拥有一个无状态节点,对于每个新加入链中的区块,该节点可以查询P2P层上的任何全节点,获取最新的区块头和零知识证明(zk-proof),以验证从前一个区块头到当前区块的状态变化是否已正确执行。此外,它还会从几个对等节点请求一些随机数据样本,以几乎100%的信心确认所有数据(包括数据块和执行区块数据)已被发布,并且提供一个零知识证明,证明网络已经达成共识并最终确定了该区块。
进行这些操作所需的带宽和计算量非常小,完全可以在手机上完成(甚至像@drakefjustin常提到的智能手表也能做到)。这种类型的节点将被归类为“无状态”节点,因为该节点可以在不需要本地存储当前状态的情况下验证新块,而是依赖不同类型的证明来验证新块。
这些证明不一定是零知识证明。我们将会在实现零知识证明进行执行验证之前,先实现无状态的执行验证。事实上,无状态执行今天已经可以做到,但目前基于Merkle-Patricia树结构的方式效率非常低,见证证明的大小过大,实用性差(参见@peter_szilagyi的推文)。
如图所示,这就是当前Merkle-Patricia树结构下,无状态执行所面临的主要问题。截图中的许多区块大小远小于100KB,而为了实现无状态验证所需的证明,往往比区块本身大50倍以上。
以太坊的MPT结构
然而,以太坊未来将升级其状态树结构,采用不同于当前Merkle-Patricia树(MPT)结构的方案。许多人可能已经听说过Verkle树,它已经在以太坊的路线图中存在多年(如果你没听说过,可以阅读我们的文章《Verkle树:为我们普通人设计的第二部分》)。Verkle树将允许创建实用的无状态客户端,因为Verkle树结构的特性可以生成非常小的见证/证明,从而大大提高无状态验证的效率。
Merkle树与Verkle树的比较
Verkle树面临的一个主要问题是它们不是量子安全的,这意味着它们充其量只是一个临时解决方案,直到状态树结构的永久解决方案成熟和/或足够高效为止。终局的解决方案可能会是一个基于STARK证明的二进制哈希树,而且很有可能会跳过Verkle树,直接采用某种形式的STARK证明二进制哈希树。(来自@VitalikButerin的相关表情包)
无状态节点的一个非常有趣的选项是,节点可以选择不完全无状态。举个例子,用户可以选择本地存储一些对自己用例相关的状态(前提是客户端支持这种功能)。
假设你将资产分布在几个地址、资产和DeFi协议中,在这种情况下,你可以将所有与自己用例相关的状态写入本地磁盘,同时仅占用极小的磁盘空间。即使跟踪多个大型DeFi协议的整个状态,也只需要几GB的存储空间。考虑到几乎所有较新的手机都配备了128GB以上的存储,这不仅是可能的,而且对于用户来说,完全可以将他们认为有用的所有状态写入手机的闪存中,变得非常实用。
关于轻客户端的快速说明:在一个无状态客户端可以高效地验证状态变更和共识的世界里,我认为传统的轻客户端(依赖诚实多数假设的客户端)可能不再有实际的使用场景。
有状态节点只保存当前和非常近期的状态,它们会修剪掉超过一定年龄的所有旧状态(参见EIP-4444提案)。当前状态是本地构建区块所必需的,而本地构建区块是无状态节点无法完成的任务。
有状态节点不应与“全节点”混淆,因为有状态节点不会保存完整的链历史记录,因为在未来,这样做将变得非常数据密集。有状态节点对于任何希望快速且无信任访问以太坊当前状态的用户都很有用,无论是用于查询状态中的数据、构建区块,还是作为质押节点使用。
即使无状态节点非常轻量且成熟,我认为在以太坊社区中,我们仍然必须保留运行有状态节点的可能性,尤其是当有状态节点可以在消费级硬件上运行时。这是因为所有无状态节点依赖于有状态节点来创建无状态验证新区块所需的见证。
访问当前状态也是判断内存池中的交易是否有效的前提,因此,确保网络上有一组去中心化的有状态节点非常重要,这些节点能够通过某种形式的包含列表设计,提供强大的审查抗性保证。
好消息是,通过状态过期机制,我们可以大大简化运行有状态节点的难度,因为那些长时间没有被交互的状态可以从节点的磁盘中修剪掉。任何想要与已过期状态交互的人,都需要带上见证(本质上是Merkle证明)将过期的状态恢复到当前状态。任何可以访问链历史的人,都可以通过无信任的方式构建这些类型的证明,将过期的状态带回当前状态。截至本文写作时,以太坊的状态已经接近300GB,直到某种形式的状态过期机制被实现之前,状态大小将继续以某种或多或少是单向增长的趋势增长。
为了本文的讨论,我将全节点和归档节点合并在一起讨论,因为普通的全节点可以利用其本地存储的信息,计算出归档节点已经写入磁盘的所有数据。它们的区别在于,全节点会修剪掉不再是最新或最近的状态。例如,你不能通过普通的全节点查询“5年前,区块Y时账户X的ETH余额是多少”,而归档节点可以在毫秒级的时间内回答这个查询。
以太坊全节点与归档节点的简易指南(作者:@0xZeeve)
也就是说,理论上可以通过全节点写入磁盘的数据(整个链的历史)来计算出这个查询的答案,但并不是所有的执行客户端都支持这一功能。我认为,认为许多用户,甚至是复杂的用户,在未来10年会运行全节点或归档节点,是不现实的。为了让这种做法成为一种可行的选择,我们将不得不将L1的吞吐量限制到一个完全不合理的水平,而实际上我们可以在L1上实现更高的吞吐量,且几乎没有任何权衡。当大多数用户能够轻松地通过零知识证明(zk-proof)验证新区块时,我认为这是一个值得追求的权衡,因为其带来的好处非常巨大。
或许我们可以开发出能够高效运行在硬盘(HDD)上的执行客户端,并使得以相对低廉的成本存储数百TB的归档状态变得可行。这将允许那些由于某些原因希望存档整个以太坊的用户实现这一目标。我知道Erigon的目标之一就是使得全归档节点能够在硬盘上运行。
最终,以太坊的未来将由构成其网络的节点所塑造。通过将无状态节点作为大多数用户最现实的选择,同时仍然保持务实态度,认识到有状态节点和全节点/归档节点在网络中强大存在的价值,我们可以在去中心化、安全性和可扩展性之间创造一个完美的平衡,从而惠及所有用户。
随着以太坊网络的不断发展和成熟,不同类型节点的概念变得越来越重要。然而,现实情况是,大多数用户并不愿意付出运行节点的精力,尽管对许多人来说,硬件要求是可以实现的。在以太坊发展的“终局”中,至关重要的是用户能够在不需要深入技术知识或大量资源的情况下,验证状态完整性和数据可用性。毕竟,没有可验证性的区块链,仅仅是一个低效的数据库。
本文将探讨将塑造以太坊网络未来的三种关键节点类型:无状态节点、有状态节点和全节点/归档节点。我们将研究无状态节点如何通过零知识证明实现新块的信任验证,有状态节点如何提供快速且无信任的以太坊当前状态访问,以及全节点/归档节点如何存储从创世区块开始的完整链历史。通过理解每种节点类型的作用和权衡,我们可以朝着更去中心化、安全和可扩展的以太坊生态系统努力。
正如我们今天所看到的,大多数用户并不愿意花费太多精力去运行任何类型的节点,尽管对于比特币和以太坊来说,硬件要求对大多数重度用户而言是可实现的。这里的“重度用户”指的是在链上拥有相当数量资产的用户,可以理解为那些运行节点的成本并不是障碍的人。
主要原因可能是大多数用户根本不关心,或者不愿意花几百美元购买硬件,或者没有运行节点的技术知识。尽管比特币和以太坊在简化这一过程上已经取得了很大进展,但对于非技术用户而言,这仍然是一个相当复杂的任务。
无状态以太坊的愿景
我认为,在每个区块链的“终局”中,用户将需要验证状态完整性和数据可用性,而他们甚至不必了解这两者的具体含义。好消息是,这一愿景通过足够的工程技术(零知识技术和少量的数据可用性抽样)完全可以实现。
在这个终局中,基本上所有值得使用的钱包将拥有一个无状态节点,对于每个新加入链中的区块,该节点可以查询P2P层上的任何全节点,获取最新的区块头和零知识证明(zk-proof),以验证从前一个区块头到当前区块的状态变化是否已正确执行。此外,它还会从几个对等节点请求一些随机数据样本,以几乎100%的信心确认所有数据(包括数据块和执行区块数据)已被发布,并且提供一个零知识证明,证明网络已经达成共识并最终确定了该区块。
进行这些操作所需的带宽和计算量非常小,完全可以在手机上完成(甚至像@drakefjustin常提到的智能手表也能做到)。这种类型的节点将被归类为“无状态”节点,因为该节点可以在不需要本地存储当前状态的情况下验证新块,而是依赖不同类型的证明来验证新块。
这些证明不一定是零知识证明。我们将会在实现零知识证明进行执行验证之前,先实现无状态的执行验证。事实上,无状态执行今天已经可以做到,但目前基于Merkle-Patricia树结构的方式效率非常低,见证证明的大小过大,实用性差(参见@peter_szilagyi的推文)。
如图所示,这就是当前Merkle-Patricia树结构下,无状态执行所面临的主要问题。截图中的许多区块大小远小于100KB,而为了实现无状态验证所需的证明,往往比区块本身大50倍以上。
以太坊的MPT结构
然而,以太坊未来将升级其状态树结构,采用不同于当前Merkle-Patricia树(MPT)结构的方案。许多人可能已经听说过Verkle树,它已经在以太坊的路线图中存在多年(如果你没听说过,可以阅读我们的文章《Verkle树:为我们普通人设计的第二部分》)。Verkle树将允许创建实用的无状态客户端,因为Verkle树结构的特性可以生成非常小的见证/证明,从而大大提高无状态验证的效率。
Merkle树与Verkle树的比较
Verkle树面临的一个主要问题是它们不是量子安全的,这意味着它们充其量只是一个临时解决方案,直到状态树结构的永久解决方案成熟和/或足够高效为止。终局的解决方案可能会是一个基于STARK证明的二进制哈希树,而且很有可能会跳过Verkle树,直接采用某种形式的STARK证明二进制哈希树。(来自@VitalikButerin的相关表情包)
无状态节点的一个非常有趣的选项是,节点可以选择不完全无状态。举个例子,用户可以选择本地存储一些对自己用例相关的状态(前提是客户端支持这种功能)。
假设你将资产分布在几个地址、资产和DeFi协议中,在这种情况下,你可以将所有与自己用例相关的状态写入本地磁盘,同时仅占用极小的磁盘空间。即使跟踪多个大型DeFi协议的整个状态,也只需要几GB的存储空间。考虑到几乎所有较新的手机都配备了128GB以上的存储,这不仅是可能的,而且对于用户来说,完全可以将他们认为有用的所有状态写入手机的闪存中,变得非常实用。
关于轻客户端的快速说明:在一个无状态客户端可以高效地验证状态变更和共识的世界里,我认为传统的轻客户端(依赖诚实多数假设的客户端)可能不再有实际的使用场景。
有状态节点只保存当前和非常近期的状态,它们会修剪掉超过一定年龄的所有旧状态(参见EIP-4444提案)。当前状态是本地构建区块所必需的,而本地构建区块是无状态节点无法完成的任务。
有状态节点不应与“全节点”混淆,因为有状态节点不会保存完整的链历史记录,因为在未来,这样做将变得非常数据密集。有状态节点对于任何希望快速且无信任访问以太坊当前状态的用户都很有用,无论是用于查询状态中的数据、构建区块,还是作为质押节点使用。
即使无状态节点非常轻量且成熟,我认为在以太坊社区中,我们仍然必须保留运行有状态节点的可能性,尤其是当有状态节点可以在消费级硬件上运行时。这是因为所有无状态节点依赖于有状态节点来创建无状态验证新区块所需的见证。
访问当前状态也是判断内存池中的交易是否有效的前提,因此,确保网络上有一组去中心化的有状态节点非常重要,这些节点能够通过某种形式的包含列表设计,提供强大的审查抗性保证。
好消息是,通过状态过期机制,我们可以大大简化运行有状态节点的难度,因为那些长时间没有被交互的状态可以从节点的磁盘中修剪掉。任何想要与已过期状态交互的人,都需要带上见证(本质上是Merkle证明)将过期的状态恢复到当前状态。任何可以访问链历史的人,都可以通过无信任的方式构建这些类型的证明,将过期的状态带回当前状态。截至本文写作时,以太坊的状态已经接近300GB,直到某种形式的状态过期机制被实现之前,状态大小将继续以某种或多或少是单向增长的趋势增长。
为了本文的讨论,我将全节点和归档节点合并在一起讨论,因为普通的全节点可以利用其本地存储的信息,计算出归档节点已经写入磁盘的所有数据。它们的区别在于,全节点会修剪掉不再是最新或最近的状态。例如,你不能通过普通的全节点查询“5年前,区块Y时账户X的ETH余额是多少”,而归档节点可以在毫秒级的时间内回答这个查询。
以太坊全节点与归档节点的简易指南(作者:@0xZeeve)
也就是说,理论上可以通过全节点写入磁盘的数据(整个链的历史)来计算出这个查询的答案,但并不是所有的执行客户端都支持这一功能。我认为,认为许多用户,甚至是复杂的用户,在未来10年会运行全节点或归档节点,是不现实的。为了让这种做法成为一种可行的选择,我们将不得不将L1的吞吐量限制到一个完全不合理的水平,而实际上我们可以在L1上实现更高的吞吐量,且几乎没有任何权衡。当大多数用户能够轻松地通过零知识证明(zk-proof)验证新区块时,我认为这是一个值得追求的权衡,因为其带来的好处非常巨大。
或许我们可以开发出能够高效运行在硬盘(HDD)上的执行客户端,并使得以相对低廉的成本存储数百TB的归档状态变得可行。这将允许那些由于某些原因希望存档整个以太坊的用户实现这一目标。我知道Erigon的目标之一就是使得全归档节点能够在硬盘上运行。
最终,以太坊的未来将由构成其网络的节点所塑造。通过将无状态节点作为大多数用户最现实的选择,同时仍然保持务实态度,认识到有状态节点和全节点/归档节点在网络中强大存在的价值,我们可以在去中心化、安全性和可扩展性之间创造一个完美的平衡,从而惠及所有用户。