以太坊维持其安全性和去中心化的一种方式,虽然未被充分讨论,但仍然非常重要,那就是它的多客户端理念。以太坊并没有设置每个人都默认运行的”参考客户端”。相反,它有一个由协作团队管理的客户端规格,这个规格目前是用易于人类阅读但速度相对较慢的Python 编写的。同时,还有多个团队在实现这个规格(也称为“客户端”),这是用户实际运行的。
每个以太坊节点运行一个共识客户端和一个执行客户端。截至目前,没有共识或执行客户端占网络的 2/3 以上。如果该类别中份额少于 1/3 的客户端存在错误,网络将继续正常运行。如果在其类别中占有 1/3 到 2/3 份额的客户端(例如 Prysm、Lighthouse 或 Geth)存在错误,链将继续添加区块,但会停止最终确定区块,从而为开发人员提供干预时间。
一个被讨论较少,但仍然非常重要的,即将在以太坊链验证方式上发生的主要转变是 ZK-EVMs 的崛起。SNARKs 证明 EVM 执行已经开发了多年,这项技术正在被称为 ZK rollups 的二层协议积极使用。一些 ZK rollups 如今正在主网上活跃,还有更多 即将 上线。但从长期来看,ZK-EVMs 不仅仅会被用于 rollups;我们希望使用它们来验证一层的执行(参见:the Verge)。
一旦发生这种情况,ZK-EVM 实际上成为第三种类型的以太坊客户端,对于网络安全来说与今天的执行客户端和共识客户端一样重要。这自然会提出一个问题:ZK-EVM 将如何与多客户端理念交互?其中一个困难的部分已经完成:我们已经有多个正在积极开发的 ZK-EVM 实现。但其他困难的部分仍然存在:我们如何真正创建一个“多客户端”生态系统,用于 ZK 证明以太坊区块的正确性?这个问题引发了一些有趣的技术挑战 - 当然还有是否值得进行权衡的悬而未决的问题。
Ethereum的多客户端理念是一种去中心化,就像@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274">一般去中心化,人们可以关注建筑去中心化的技术优势或者政治去中心化的社会优势。最终,多客户端理念由两者激发并服务于两者。
技术去中心化的主要好处很简单:它降低了一个软件中的一个错误导致整个网络灾难性崩溃的风险。一个历史情况典型地表现了这个风险,那就是2010年比特币溢出bug。当时,比特币客户端代码没有检查交易的输出总和不会溢出(通过求和至 264−1的最大整数以上,将其归零),于是有人做了一个完全这样的交易,给自己分配了数十亿比特币。这个bug在几小时内被发现,一个修复方案被迅速推出并在网络上快速部署,但是如果当时已经有一个成熟的生态系统,那些硬币就会被交易所、桥接和其他结构接受,攻击者可能会赚走大量的钱。如果当时有五个不同的比特币客户端,那它们都有同样的bug的可能性就非常小,所以会立即出现分裂,buggy的一方可能会输掉。
使用多客户端方法来最小化灾难性bug的风险是有一个权衡的:相反,你会得到共识失败的bug。也就是说,如果你有两个客户端,那么客户端对某个协议规则有微妙的不同解释就有风险,而这两种解释都是合理的,不会导致盗窃资金,但不同意会导致链分裂。曾经在Ethereum的历史上发生过一次严重的分裂(还有其他更小的分裂,其中很小一部分运行旧版本代码的网络分叉)。坚持单一客户端方法的人将共识失败视为不应该有多个实现的理由:如果只有一个客户端,那么这个客户端不会与自己产生分歧。他们对客户数量如何转化为风险的模型可能看起来像这样:
我当然不同意这种分析。我不同意的关键在于 (i) 2010 年式的灾难性错误也很重要,并且 (ii)你实际上永远不会只有一个客户端。后一点在 2013 年的比特币分叉事件中表现得淋漓尽致:由于两个不同版本的比特币客户端之间存在分歧,导致链条分裂,其中一个版本意外地对单个区块中可修改对象的数量设置了限制,而这一限制并没有记录在案。因此,理论上的一个客户端在实践中往往是两个客户端,而理论上的五个客户端在实践中可能是六个或七个客户端—所以我们应该冒着风险曲线右侧的风险,至少拥有几个不同的客户端。
垄断客户端开发商拥有很大的政治权力。如果客户端开发人员提出更改,而用户不同意,理论上 他们可以拒绝下载更新版本,或者创建一个没有它的分叉,但是在实践中,用户通常很难做到这一点。如果令人不快的协议更改与必要的安全更新捆绑在一起怎么办?如果主力团队威胁说如果不按他们的意愿就退出怎么办?或者,更温和的是,如果垄断客户团队最终成为唯一拥有最丰富协议专业知识的群体,从而使生态系统的其他成员处于不利地位来判断客户团队提出的技术论点,从而使客户团队面临有很大的空间来推动自己的特定目标和价值观,这可能与更广泛的社区不匹配?
对协议政治的担忧,尤其是在 2013-14 年比特币 OP_RETURN 大战 的背景下,一些参与者公开支持歧视链的特定用途,这是以太坊早期采用多客户端理念的一个重要因素,其目的是让一小部分人更难做出这类决定。以太坊生态系统特有的担忧—即避免权力集中在以太坊基金会内部—为这一方向提供了进一步的支持。2018 年,基金会做出决定,有意不实施以太坊 PoS 协议(即现在所谓的 “共识客户端”),将这一任务完全交给外部团队。
如今,ZK-EVM 被用于汇总(rollup)中。这通过允许昂贵的EVM执行仅在链下进行几次,而所有其他人只需验证在链上发布的证明EVM执行已正确计算的SNARKs,从而增加了扩展性。它还允许一些数据(特别是签名)不被包含在链上,节省了燃气成本。这为我们提供了大量的可扩展性好处,而可扩展计算的ZK-EVMs和可扩展数据的DAS(@vbuterin/sharding_proposal#ELI5-data-availability-sampling">data availability sampling)的结合可能让我们能够进行非常远的扩展。
然而,今天的以太坊网络也有一个不同的问题,这是任何数量的第二层扩展都无法自行解决的:第一层很难验证,以至于并不是很多用户运行自己的节点。相反,大多数用户只是信任第三方提供商。轻客户端如Helios和Succinct正在采取步骤解决这个问题,但轻客户端远非完全验证节点:轻客户端只验证被称为sync committee的验证器的随机子集的签名,并且不验证链实际上遵循协议规则。为了让我们进入一个用户实际上可以验证链遵循规则的世界,我们将不得不做一些不同的事情。
随着时间的推移,我们可以将第 1 层每个区块的 Gas 目标从 1500 万减少到 100 万,足以让一个区块包含一个 SNARK 和一些存款和取款操作,但仅此而已,从而迫使几乎所有用户活动移动到第 2 层协议。这样的设计仍然可以支持在每个块中提交许多汇总:我们可以使用由定制构建者运行的链下聚合协议,将来自多个第 2 层协议的 SNARK 收集在一起,并将它们组合成一个 SNARK。在这样一个世界里,仅有的 第 1 层的功能是成为第 2 层协议的交换所,验证它们的证明,偶尔促进它们之间的大额资金转移。
这种方法可行,但它有几个重要的缺点:
因此,尝试找到一种使用 ZK-SNARK 来验证第 1 层本身的方法似乎更合理。
类型 1(完全等同于以太坊)的 ZK-EVM 可用来验证(第 1 层)以太坊区块的 EVM 执行。我们可以编写更多的 SNARK 代码来验证区块的共识方。这将是一个具有挑战性的工程问题:如今,ZK-EVM 验证以太坊区块需要几分钟到几小时的时间,而实时生成证明将需要以下一种或多种方法:(i) 改进以太坊本身,删除不支持 SNARK 的组件;(ii) 使用专用硬件提高效率;(iii) 通过更多并行化改进架构。但是,没有任何基本的技术原因可以解释为什么不能做到这一点—因此,我预计,即使需要很多年,也一定能做到。
在这里,我们看到了与多客户端范例的交叉点:如果我们使用 ZK-EVM 验证第 1 层,我们该使用哪种 ZK-EVM?
我认为有三个选项:
对我来说,(3)似乎是理想的,至少直到并且除非我们的技术进步到我们可以正式证明 所有 ZK-EVM 实现都是彼此等效的,此时我们可以选择最有效的一个。 (1) 将牺牲多客户端范式的好处,(2) 将消除开发新客户端的可能性并导致更加集中的生态系统。 (3) 有挑战,但这些挑战似乎比其他两个选项的挑战要小,至少目前是这样。
实现(3)不会太难:我们可以为每种类型的证明建立一个 p2p 子网络,使用一种类型证明的客户端可以监听相应的子网络,直到收到验证者认为有效的证明为止。
(3) 的两个主要挑战可能如下:
在设计单槽终局性协议时,可以通过小心谨慎来解决延迟问题。单槽终结协议可能需要每个槽两轮以上的共识,因此可以要求第一轮包括区块,只要求节点在第三轮(或最后一轮)签名前验证证明。这样就能确保在发布区块的截止日期与预期可获得证明的时间之间始终有一个相当长的时间窗口。
数据效率问题必须通过设立单独的协议来收集验证相关的数据来解决。对于签名,我们可以使用BLS聚合,ERC-4337已经支持。另一个主要的验证相关数据类别是ZK-SNARKs用于隐私。幸运的是,它们经常倾向于有自己的聚合协议。
同样值得一提的是,验证第 1 层的SNARK有一个重要的好处:链上 EVM 执行不再需要由每个节点验证,这使得可以大大增加 EVM 执行量。这可能是通过大大增加第1层的燃气限制,或者通过引入被尊崇的rollups,或者两者都有。
要使开放的多客户端 ZK-EVM 生态系统运转良好,需要做大量的工作。但好消息是,这些工作中的大部分都正在进行或即将进行:
有了这些技术,未来看起来非常美好。以太坊区块将比今天更小,任何人都可以在笔记本电脑甚至手机上或浏览器扩展内运行完全验证的节点,而这一切都将在保留以太坊多客户端理念优势的同时实现。
从长远来看,当然,任何事情都有可能发生。或许,人工智能将为形式验证提供超级动力,使其能够轻松证明 ZK-EVM 实现等价,并找出导致它们之间差异的所有错误。这样一个项目甚至可能是现在就可以开始着手的实际项目。如果这种基于正式验证的方法取得成功,就需要建立不同的机制,以确保协议继续保持政治去中心化;也许到那时,协议将被视为 “完整的”,不可更改性规范也会变得更强。但即使这是一个更长远的未来,开放的多客户端 ZK-EVM 世界似乎也是一个自然的踏脚石,无论如何都有可能实现。
从近期来看,这仍然是一个漫长的旅程。ZK-EVM已经出现,但要使ZK-EVM在第1层真正可行,还需要它们成为类型 1,并使其证明速度足够快,以便可以实时发生。如果有足够的并行化,这是可行的,但仍然需要做很多工作才能实现。共识的变化,例如提高 KECCAK、SHA256 和其他哈希函数预编译的 Gas 成本,也将是该图景的重要组成部分。尽管如此,过渡的第一步可能会比我们预期的更快:一旦我们切换到 Verkle 树和无状态客户端,客户端就会开始逐步使用 ZK-EVM,而向 “开放式多 ZK-EVM” 世界的过渡可能会自行开始。
Partilhar
以太坊维持其安全性和去中心化的一种方式,虽然未被充分讨论,但仍然非常重要,那就是它的多客户端理念。以太坊并没有设置每个人都默认运行的”参考客户端”。相反,它有一个由协作团队管理的客户端规格,这个规格目前是用易于人类阅读但速度相对较慢的Python 编写的。同时,还有多个团队在实现这个规格(也称为“客户端”),这是用户实际运行的。
每个以太坊节点运行一个共识客户端和一个执行客户端。截至目前,没有共识或执行客户端占网络的 2/3 以上。如果该类别中份额少于 1/3 的客户端存在错误,网络将继续正常运行。如果在其类别中占有 1/3 到 2/3 份额的客户端(例如 Prysm、Lighthouse 或 Geth)存在错误,链将继续添加区块,但会停止最终确定区块,从而为开发人员提供干预时间。
一个被讨论较少,但仍然非常重要的,即将在以太坊链验证方式上发生的主要转变是 ZK-EVMs 的崛起。SNARKs 证明 EVM 执行已经开发了多年,这项技术正在被称为 ZK rollups 的二层协议积极使用。一些 ZK rollups 如今正在主网上活跃,还有更多 即将 上线。但从长期来看,ZK-EVMs 不仅仅会被用于 rollups;我们希望使用它们来验证一层的执行(参见:the Verge)。
一旦发生这种情况,ZK-EVM 实际上成为第三种类型的以太坊客户端,对于网络安全来说与今天的执行客户端和共识客户端一样重要。这自然会提出一个问题:ZK-EVM 将如何与多客户端理念交互?其中一个困难的部分已经完成:我们已经有多个正在积极开发的 ZK-EVM 实现。但其他困难的部分仍然存在:我们如何真正创建一个“多客户端”生态系统,用于 ZK 证明以太坊区块的正确性?这个问题引发了一些有趣的技术挑战 - 当然还有是否值得进行权衡的悬而未决的问题。
Ethereum的多客户端理念是一种去中心化,就像@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274">一般去中心化,人们可以关注建筑去中心化的技术优势或者政治去中心化的社会优势。最终,多客户端理念由两者激发并服务于两者。
技术去中心化的主要好处很简单:它降低了一个软件中的一个错误导致整个网络灾难性崩溃的风险。一个历史情况典型地表现了这个风险,那就是2010年比特币溢出bug。当时,比特币客户端代码没有检查交易的输出总和不会溢出(通过求和至 264−1的最大整数以上,将其归零),于是有人做了一个完全这样的交易,给自己分配了数十亿比特币。这个bug在几小时内被发现,一个修复方案被迅速推出并在网络上快速部署,但是如果当时已经有一个成熟的生态系统,那些硬币就会被交易所、桥接和其他结构接受,攻击者可能会赚走大量的钱。如果当时有五个不同的比特币客户端,那它们都有同样的bug的可能性就非常小,所以会立即出现分裂,buggy的一方可能会输掉。
使用多客户端方法来最小化灾难性bug的风险是有一个权衡的:相反,你会得到共识失败的bug。也就是说,如果你有两个客户端,那么客户端对某个协议规则有微妙的不同解释就有风险,而这两种解释都是合理的,不会导致盗窃资金,但不同意会导致链分裂。曾经在Ethereum的历史上发生过一次严重的分裂(还有其他更小的分裂,其中很小一部分运行旧版本代码的网络分叉)。坚持单一客户端方法的人将共识失败视为不应该有多个实现的理由:如果只有一个客户端,那么这个客户端不会与自己产生分歧。他们对客户数量如何转化为风险的模型可能看起来像这样:
我当然不同意这种分析。我不同意的关键在于 (i) 2010 年式的灾难性错误也很重要,并且 (ii)你实际上永远不会只有一个客户端。后一点在 2013 年的比特币分叉事件中表现得淋漓尽致:由于两个不同版本的比特币客户端之间存在分歧,导致链条分裂,其中一个版本意外地对单个区块中可修改对象的数量设置了限制,而这一限制并没有记录在案。因此,理论上的一个客户端在实践中往往是两个客户端,而理论上的五个客户端在实践中可能是六个或七个客户端—所以我们应该冒着风险曲线右侧的风险,至少拥有几个不同的客户端。
垄断客户端开发商拥有很大的政治权力。如果客户端开发人员提出更改,而用户不同意,理论上 他们可以拒绝下载更新版本,或者创建一个没有它的分叉,但是在实践中,用户通常很难做到这一点。如果令人不快的协议更改与必要的安全更新捆绑在一起怎么办?如果主力团队威胁说如果不按他们的意愿就退出怎么办?或者,更温和的是,如果垄断客户团队最终成为唯一拥有最丰富协议专业知识的群体,从而使生态系统的其他成员处于不利地位来判断客户团队提出的技术论点,从而使客户团队面临有很大的空间来推动自己的特定目标和价值观,这可能与更广泛的社区不匹配?
对协议政治的担忧,尤其是在 2013-14 年比特币 OP_RETURN 大战 的背景下,一些参与者公开支持歧视链的特定用途,这是以太坊早期采用多客户端理念的一个重要因素,其目的是让一小部分人更难做出这类决定。以太坊生态系统特有的担忧—即避免权力集中在以太坊基金会内部—为这一方向提供了进一步的支持。2018 年,基金会做出决定,有意不实施以太坊 PoS 协议(即现在所谓的 “共识客户端”),将这一任务完全交给外部团队。
如今,ZK-EVM 被用于汇总(rollup)中。这通过允许昂贵的EVM执行仅在链下进行几次,而所有其他人只需验证在链上发布的证明EVM执行已正确计算的SNARKs,从而增加了扩展性。它还允许一些数据(特别是签名)不被包含在链上,节省了燃气成本。这为我们提供了大量的可扩展性好处,而可扩展计算的ZK-EVMs和可扩展数据的DAS(@vbuterin/sharding_proposal#ELI5-data-availability-sampling">data availability sampling)的结合可能让我们能够进行非常远的扩展。
然而,今天的以太坊网络也有一个不同的问题,这是任何数量的第二层扩展都无法自行解决的:第一层很难验证,以至于并不是很多用户运行自己的节点。相反,大多数用户只是信任第三方提供商。轻客户端如Helios和Succinct正在采取步骤解决这个问题,但轻客户端远非完全验证节点:轻客户端只验证被称为sync committee的验证器的随机子集的签名,并且不验证链实际上遵循协议规则。为了让我们进入一个用户实际上可以验证链遵循规则的世界,我们将不得不做一些不同的事情。
随着时间的推移,我们可以将第 1 层每个区块的 Gas 目标从 1500 万减少到 100 万,足以让一个区块包含一个 SNARK 和一些存款和取款操作,但仅此而已,从而迫使几乎所有用户活动移动到第 2 层协议。这样的设计仍然可以支持在每个块中提交许多汇总:我们可以使用由定制构建者运行的链下聚合协议,将来自多个第 2 层协议的 SNARK 收集在一起,并将它们组合成一个 SNARK。在这样一个世界里,仅有的 第 1 层的功能是成为第 2 层协议的交换所,验证它们的证明,偶尔促进它们之间的大额资金转移。
这种方法可行,但它有几个重要的缺点:
因此,尝试找到一种使用 ZK-SNARK 来验证第 1 层本身的方法似乎更合理。
类型 1(完全等同于以太坊)的 ZK-EVM 可用来验证(第 1 层)以太坊区块的 EVM 执行。我们可以编写更多的 SNARK 代码来验证区块的共识方。这将是一个具有挑战性的工程问题:如今,ZK-EVM 验证以太坊区块需要几分钟到几小时的时间,而实时生成证明将需要以下一种或多种方法:(i) 改进以太坊本身,删除不支持 SNARK 的组件;(ii) 使用专用硬件提高效率;(iii) 通过更多并行化改进架构。但是,没有任何基本的技术原因可以解释为什么不能做到这一点—因此,我预计,即使需要很多年,也一定能做到。
在这里,我们看到了与多客户端范例的交叉点:如果我们使用 ZK-EVM 验证第 1 层,我们该使用哪种 ZK-EVM?
我认为有三个选项:
对我来说,(3)似乎是理想的,至少直到并且除非我们的技术进步到我们可以正式证明 所有 ZK-EVM 实现都是彼此等效的,此时我们可以选择最有效的一个。 (1) 将牺牲多客户端范式的好处,(2) 将消除开发新客户端的可能性并导致更加集中的生态系统。 (3) 有挑战,但这些挑战似乎比其他两个选项的挑战要小,至少目前是这样。
实现(3)不会太难:我们可以为每种类型的证明建立一个 p2p 子网络,使用一种类型证明的客户端可以监听相应的子网络,直到收到验证者认为有效的证明为止。
(3) 的两个主要挑战可能如下:
在设计单槽终局性协议时,可以通过小心谨慎来解决延迟问题。单槽终结协议可能需要每个槽两轮以上的共识,因此可以要求第一轮包括区块,只要求节点在第三轮(或最后一轮)签名前验证证明。这样就能确保在发布区块的截止日期与预期可获得证明的时间之间始终有一个相当长的时间窗口。
数据效率问题必须通过设立单独的协议来收集验证相关的数据来解决。对于签名,我们可以使用BLS聚合,ERC-4337已经支持。另一个主要的验证相关数据类别是ZK-SNARKs用于隐私。幸运的是,它们经常倾向于有自己的聚合协议。
同样值得一提的是,验证第 1 层的SNARK有一个重要的好处:链上 EVM 执行不再需要由每个节点验证,这使得可以大大增加 EVM 执行量。这可能是通过大大增加第1层的燃气限制,或者通过引入被尊崇的rollups,或者两者都有。
要使开放的多客户端 ZK-EVM 生态系统运转良好,需要做大量的工作。但好消息是,这些工作中的大部分都正在进行或即将进行:
有了这些技术,未来看起来非常美好。以太坊区块将比今天更小,任何人都可以在笔记本电脑甚至手机上或浏览器扩展内运行完全验证的节点,而这一切都将在保留以太坊多客户端理念优势的同时实现。
从长远来看,当然,任何事情都有可能发生。或许,人工智能将为形式验证提供超级动力,使其能够轻松证明 ZK-EVM 实现等价,并找出导致它们之间差异的所有错误。这样一个项目甚至可能是现在就可以开始着手的实际项目。如果这种基于正式验证的方法取得成功,就需要建立不同的机制,以确保协议继续保持政治去中心化;也许到那时,协议将被视为 “完整的”,不可更改性规范也会变得更强。但即使这是一个更长远的未来,开放的多客户端 ZK-EVM 世界似乎也是一个自然的踏脚石,无论如何都有可能实现。
从近期来看,这仍然是一个漫长的旅程。ZK-EVM已经出现,但要使ZK-EVM在第1层真正可行,还需要它们成为类型 1,并使其证明速度足够快,以便可以实时发生。如果有足够的并行化,这是可行的,但仍然需要做很多工作才能实现。共识的变化,例如提高 KECCAK、SHA256 和其他哈希函数预编译的 Gas 成本,也将是该图景的重要组成部分。尽管如此,过渡的第一步可能会比我们预期的更快:一旦我们切换到 Verkle 树和无状态客户端,客户端就会开始逐步使用 ZK-EVM,而向 “开放式多 ZK-EVM” 世界的过渡可能会自行开始。