我花了很多我个人的时间来解释及解答有关以太坊 2.0 的疑问,真的非常多。有一些是对技术层面的深度解读,是为了帮助技术贡献者理解我们的研究和技术规范;但更多的是为了解答来自整个社区的、对 Eth2 的进展、方向、动机、设计决策、推迟启动等等等等事项的问题解释 Eth2 的时候,每当我想出描述不同部件的新方法、或者根据听众的特点发明出绝妙的比喻使他们恍然大悟,我都很得意。
但是,这种动态的、对话式的方法,虽然有价值,还是令社区中的许多朋友茫然不知所措。而且,我个人得一遍又一遍地回答同样的问题,甚至于,更可怕的是,6 个月之后我还会被问起一摸一样的问题!很显然,这里面存在信息沟通上的问题。信息虽然存在,但却分散在整个网络上 —— 从研究帖子、技术规范,到规范解读、公开会议、公开的交流渠道、reddit 论坛帖子,到基金会的博客。
在 Devcon 5 结束之后,我最开始尝试弥合这种信息鸿沟的办法就是撰写 “Eth2 更新速览” 系列博客。该系列博客提供了很多帮助读者理解 Eth2.0 的小片段,但我逐渐意识到,这些博客并不能帮助大家真正达到全景式的理解。虽然说这个更大的图景在音频播客、AMA(问答活动)和大会上经常被讨论,但是,文字形式的描绘,仍是有所帮助的。
所以我这就来了!本文想为我们社区 —— 以太坊社区 —— 中的所有人提供对 Eth2 发展状况的全景式解读:现在我们在开发哪些东西、可能还会开发什么、哪些东西是你要注意的。我会提供恰到好处的技术说明,帮助大家理解我们的目的、我们的愿景、项目当前的状况、还需要做的工作,尽量不让大家在数学术语和我们的行话中窒息。
这篇文章对那些已经深入理解了以太坊、但不是那么了解 Eth2 的技术专家应该也有用。
别担心,我也懂,整个项目很大,也很复杂,而且似乎你不断解决遇到的问题还是望不到尽头。希望这篇文章能帮助你更好的理解将来会到来的事情。
至于已经很了解 Eth2 的朋友,也别错过这篇文章 —— 你可以从更广阔的视角来理解我们所在的位置,以及我如何看待未来可能会有的发展。
免责声明:文本仅仅是 我个人 对以太坊 2.0 当前进展 的意见。有许多不同的声音和意见在推动着 Eth2 的不断发展和演化。本文只是我个人解读的一个快照。
Eth2 就是一个可扩展的权益证明基础设施。
如果你在过去半年内听过我的演讲,你肯定听过我这么说不止一次了。Eth2 是 为 以太坊构建的,最终也会 成为 以太坊本身。Eth2 致力于为当前的以太坊主网提供更安全和可扩展的环境,而且部署的方式不会造成分裂效果。与此同时,它还为我们的不断进步提供了一个升级过的环境。
早在以太坊启动以前,人们便清楚单一一条区块链的模式无法提供足够多的 “带宽”,因此无法成为新的去中心化互联网的骨架。以太坊相关的权益证明研究和分片研究可以一直追溯到 2014 年,也就是以太坊的早期岁月(当时以太坊还没启动)。权益证明协议和分片架构都是为了回答下列问题:给定投入一个密码经济系统的资源数量,我们是否能同时提升安全性和吞吐量、还让普通的消费级硬件能参与共识、同步区块链?我在这里不会深入讲解这些研究的历史,一言以蔽之,这些探索历经数年之久,而且许多最初的想法都被证明是错的。最终,我们的回答是掷地有声的 “可以”,而且其具象化就是 Eth2 项目。
Eth2 是一个雄心勃勃的、准备打持久战的项目,我们会分阶段推出。这些计划已经有广泛的叙述和讨论了,但我还是提出一个速览型的、不那么技术化的解读。
Phase 0 阶段会推出 Eth2 全新共识机制的核心,信标链(Beacon Chain)。信标链就是所有系统层活动发生的所在,也是系统内协作沟通的地方。Phase 0 的开发目标是让分布在全世界、围绕着数千个节点、数以十万计的共识单元(验证者)能同时参与共识。
出于 Phase 1 阶段启动之后需要给多个分片分配验证者的技术要求,我们需要信标链能处理大数量的验证者。工程上的很多复杂性都来源于这个技术要求。其它非分片的权益证明机制一般只有 100 多个或者 1000 多个验证者,但 Eth2 的设计目标是最少容纳 1 万 6 千名验证者,而且预计这个数字会在几年内达到几十万。
Phase 0 要做的是推出共识机制,而 Phase 1 则是让许多内容能够达成共识。这些内容来自分片链。你可以把一条分片链理解成跟当前的以太坊有几乎同样复杂度的一条区块链,但其运行要遵守 Eth2 的共识规则(即,要受到信标链的控制)。来自信标链的验证者会被随机分配以短期的任务:到某一分片链上构建及验证区块、为该分片链的状态、可用性以及有效性提供密码经济学承诺、最终发回到核心系统(分片链)。
当前,我们预计会在启动时推出 64 条分片链-,而届时整个网络的数据可用性会达到 1~4 MB 每秒(没错,这是个很大的数据)。
Phase 1.5 就是把以太坊主网作为一个分片整合进 Eth2 的共识机制(作为 Phase 1 阶段创造的许多分片之一,继续存在)。此后,我们所知、所热爱的以太坊区块链将不再由工作量证明挖矿算法来支撑,而是由 Eth2 验证者来构建。对于现有的应用和用户,共识机制的热切换基本上都是透明的。应用会继续存在,但开放者将拥有一个更强大的底层系统(更好的安全属性、更好的经济终结性(economic finality,指交易完成后需要付出巨大代价才能逆转,即用违反协议的巨大成本保护起来的交易确定性)、更多的 Layer-1 数据空间,可支撑 Rollup 和其它有趣应用)。
Phase 2 要为初始以太坊分片以外的其它分片添加状态和执行机制。可能采取的方法有很多,搞清楚各种形式及其细节就是当前的研究和原型设计的热点。我会在后文中进一步讨论这个问题。
所以,我们未来就要实现上述目标,而且 Phase 0 就在眼前了,但整个路线图似乎有点太长了。在整个升级过程中,我们能从 Eth2 中得到什么好处呢?
好问题。从整体上来说,升级的每一个步骤都会触及以太坊区块链更深的核心,因此会整个社区带来更大的硬性。作为一名用户,你可以在 Phase 0 阶段就参与到 PoS 出块中来,也可以坐等以太坊区块链完全整合到 Eth2 中(当然这个过程从开发者和用户的角度来看应该是无缝的)。无论你选择怎么参与、从哪个阶段开始参与,这些阶段都是重要的里程碑,而且都有显著的好处。
首要的好处之一就是我知道很多人都是以太币的死忠,迫不及待想参与到 PoS 中来。Phase 0 就是为你们这些潜在的验证者准备的(而且我们的 PoS 还是业余者友好型的)!成为 PoS 中的验证者有自身的风险,而且质押资金的周期也很长,这些可能会劝退一些参与者,所以我自己认为这个阶段既是业余爱好者的、也是以太坊长期信仰者的机会。好不容易有这样一个机会,你可以早早入局、帮助实现我们的愿景,并因为更早参与而获得更高的 ETH 奖励。
那么 Phase 1 呢?在以太坊整合到 Eth2 系统之前,我们容纳这么多数据,有什么用吗?当然有用,真高兴你这么问了!
即使不带有原生的计算能力,Layer-1 上的数据空间也是非常有用的。实际上,过去 12 个月中出现的最有前景的 Layer-2 扩展方案,叫做 “rollup” 的侧链(即包括 optimistic 型方案,也包括 ZK 型方案),正是能够随着 Layer-1 数据空间的可用性扩大而提高吞吐量的技术。Eth2 的数据层预计能提供 1~4 MB/s 的数据可用性,这就能与 rollup 技术相结合、转化成巨大的可扩展性。但因为一开始以太坊主链跟新的分片宇宙是相互脱节的,这就使得声明分片数据为何变得很困难(making claims about the eth2 shard data is hard)。这也是 EIP 2537 对以太坊主网非常重要的一个理由:在以太坊主网上有了 BLS (Eth2 所用的新的签名算法)预编译之后,我们就可以在 Solidity 合约内写出一个高效的 Eth2 轻客户端,让以太坊主链上的应用(在 Phase 1.5 到来之前就)能够声明 Eth2 上的数据。
如上文所述,Phase 1.5 是个重要里程碑;在此之前,Eth2 是为以太坊打造的;在此之后,Eth2 就会成为以太坊本身。所有的应用都会整合到升级后的 Eth2 共识机制中,既能保留我们习惯使用的功能,又能同时开启安全的权益证明算法和高可扩展的数据层新世界。在我看来这就是整个升级过程的核心;其成功意味着我们将以太坊完全锚定到了一个新的现实中,是一个历史性的时刻。
在此之后,在其它分片链上开启 状态机制/执行机制 可以逐渐带来额外的可扩展性好处。执行机制的形式可能是 EVM,也可能是一种新的虚拟机,叫做 eWASM。无论 VM 上的选择是什么,原来的以太坊所形成的 EVM 分片和其它分片都能够通过信标链来互动和沟通,形成一个多线程、分片化的系统。
看到了没?这就是一场漫长的旅程,但是一路都有鲜花伴随。
分片架构的核心部件依赖于对共识参与者(即验证者)的随机抽样,抽样组成委员会来验证协议的一个部分(例如一条分片链)。只要协议中有足够多的验证者,即使有一个最大体量的攻击者(比如说控制了全体验证者的 1/3),这个攻击者想控制一个委员会并破坏整个系统也是几乎不可能的(在概率上极其之小,要用 1 / 2^40 这么小的量级来算)。这让我们可以设计这个系统(This allows us to design the system),使得任意拥有消费级硬件(例如一台笔记本电脑或甚至是一台旧手机)的人都能成为一个验证者(因为验证者会被分配去验证系统的一个部分,而这部分的验证任务用一台普通机器的计算资源也能完成)。
这就是分片架构的神奇之处,也是其困难所在。其一,我们必须有足够多的验证者,这样随机取样才会安全:因此 Eth2 的预期验证者数量比大多数(我觉得甚至是所有)其它 PoS 协议都要多得多。这在开发过程的每一步中都产生了挑战 —— 从研究到共识机制的技术详述、到组网方法(networking),再到客户端的资源消耗和优化。每一个步骤都必须考虑到这一点:每多一个验证者,就会给系统引入多一点的负担。Eth2 客户端团队已经实现了让数十万个验证者同时参与共识的不可能任务,所以我们能安全而高效地加入许多分片了。
另一个让我们的开发异常艰难的基础设计抉择是:我们又要可扩展性,又不想牺牲去中心化。
如果你不在乎用户能不能自己验证整条链的完整性、也不在乎链上数据是不是对整个网络都可用,那要让一条区块链的处理速度上升到每秒几千笔并不困难。困难的是,我们需要一个能把系统切分成许多可验证部分的分片化共识机制。构思乃至实现这样一种共识机制,你能想象有多难了吧。
以太坊的一个信条是,以太坊 首先是一套协议。以太坊是构成协议的许多规则的抽象集合,而不是这些规则集合的某种实现。因此,以太坊社区从一开始就鼓励多种客户端实现。现在有 besu、ethereumJS、geth、nthermind、nimbus、open-ethereum、trinity 和 turbo-geth 这么多客户端软件都能同步以太坊区块链。而在 Eth2 这边,我们有 cortex、lighthouse、lodestar、nimbus、prysm、teku、和 trinity 这么多种客户端软件。
多客户端范式有很多好处:
多种客户端实现可以产生广泛的观念、算法以及架构(每一种客户端实现都会给出自己的观点和方法)。这种交叉碰撞是很有好处的,最终我们都能开发出更可靠的软件。
不同客户端软件通常有不同的设计目标。那么随着时间推移,用户和应用也会更加多样化。客户端软件多多少少会围绕着下面几个目标来开发:性能、安全性、水平可扩展性、用户体验、轻客户端、浏览器友好、资源节约性,等等等。
如果有众多的客户端软件可用于生产环境,一次重大攻击可能只会导致一种客户端软件崩溃(例如一次 DoS 攻击),而其它的客户端软件仍然完好,攻击的破坏力也就被限制住了。这就是我们在以太坊的早期、遭遇 “上海 DoS 攻击” 时出现的情况:一系列 DoS 攻击或许导致 geth 客户端或者 parity 客户端崩溃,但从未导致两者都崩溃。
每一种客户端都是通向一种编程语言社区的门户。特定语言的客户端可以作为基础,让该种语言内的实验和创新得以引入。而且,围绕着客户端的基础工具通常会借助该语言的贡献者和工具生态系统,滚雪球般地扩大。多客户端的范式加强了以太坊的吸引力。
当然,我们也要为此付出一些代价:
技术规范和测试工具都必须无懈可击,以避免主网上线后的意外分叉。如果协议只有一种实现,那么该实现就会变成协议本身。在这种情况下,任何一种共识机制上的 “bug” 都在实质上变成了协议本身。从纯粹中立的角度来看这似乎不是好事,但它会消除意外分叉的风险。作为一种解决办法,如果同步主网的客户端使用情况有一种健康的分布(例如没有超过 1/3 的全体节点/验证者在使用同一种客户端),那么全网也能够在某一种客户端出现共识问题的时候保持活性。
与单一客户端相比,N 种客户端要相互协作,会引入额外的工作,做得好可能是线性增长的负担,但有时候会是平方级增长的负担。我们可以使用一些方法来降低负担 —— 例如共识机制测试套件(还有网络测试套件)—— 但总不可能完全消除。
Phase 0 的 Eth2 客户端在过去两年中已成为了相当复杂的软件,也因此能处理数十万的验证者、数千个节点间的分布式共识过程。我们现在已经有了测试网,每一天都在向正式启动迈进。所谓行百里者半九十,事实证明确实如此。
我希望你在启动之前的这段时间里,能够走出舒适区、尝试多种客户端。它们在实现上往往各有权衡,你少不了要亲自动手,才能发现最适合你的软件。而且,要真正获得以太坊多客户端范式的好处,我们需要用户使用多种客户端(在所有类型的客户端之间创造一种健康的使用率分布)。
除此之外,协议中还内置了反串谋的激励机制。在某一种主流客户端意外出错导致使用这种客户端的验证者离线或被罚没的极端情况下,假如你的验证者也因为同种客户端表现出行动上的相关性,那么你也会被惩罚,比起只有你自己犯错、跟其他人无相关的情况要严重得多。换句话来说,这个时候运行小众的客户端会比运行大家都在用的客户端要好。
一定要想清楚 —— 如果有多种可用且安全的客户端,运行小众的客户端软件、促进全网的客户端使用率的健康分布,是你的责任。
另一点就是,不要不好意思。如果你根据文档来运行软件时出了错误,请让大家知道。哪怕是一个拼写错误,也可以发送一个修改请求。要是软件崩溃或者弹出了一个 bug,请务必务必在 github 或者客户端的 discord 频道上报告。你们是测试版的用户,有了你们的帮助,我们可以让客户端变得更好,对所有人都有好处。
我们现在正在运行小型的开发者网络,每一到两个星期重启一次。我之所以说是 “开发者网络”,是因为这些测试网首先是为客户端团队的开发者发现 bug、做优化而服务的。这些网络是公开的,我们欢迎大家加入,但请注意这些网络还不像 Goerli 或者 Rinkeby 测试网那么经久耐用。最新启动的一个测试网是 Witti 测试网(由 Afri Schoedon 发起),运行 0.11 版技术规范(如果你想参与,请看这里的参与指南)。
客户端团队现正忙着把客户端升级到 0.12 版技术规范,该版规范整合了最新的 IETF BLS 标准。实现之后,我们会将开发者网络转为 0.12 版并继续扩大网络的规模、让客户端承担越来越多的负载。当我们有 2~3 种客户端能成功同步到 0.12 的开发者网络并在高负载下运行之后,我们会做一个更开放的测试网,让社区大众能更充分地参与。我们这里的目标是创建一个能长期存在的多客户端测试网,并且尽可能模拟还未上线的主网的运行环境(让用户能练习如何运行节点并测试任何他们想测试的东西)。理想的情况是只启动一个测试网,并在维护网络运行的同时排查故障。但实际上,我们可能会根据故障的部位和严重程度而多次重启乃至另开测试网。
除了常规测试网,我们还会开放一个带有激励的 “攻击网”:由客户端团队来运行一个稳定的测试网、你们大家来尝试破坏这个网络。成功的攻击者将能获得以太坊基金会提供的 ETH 奖励。更多信息日后放出 —— 请保持关注!
虽然围绕 Eth2 的工具还非常稚嫩,但它们也在茁壮成长,令人兴奋。如上所述,工具往往都脱胎于客户端的代码库和客户端团队的开发工作,但现在越来越多人加入进来了。为了更好地理解 Eth2、与 Eth2 互动,乃至保护和强化 Eth2,我们社区需要继续开发 Eth2 工具。
已经有些团队和个人用自己开发的 Eth2 工具提供了巨大的价值,我要为他们喝彩!我也欢迎所有人来开发新工具、来开拓进取和巩固成果。
Eth2 工具是个全新的领域,是个千载难逢的挖掘痛点、提供价值并留名青史的机会。
下面列举了一些正在开展中的工作,但还有很多事情可以做!
区块浏览器:Beaconcha.in、Etherscan、Eth2stats
网络工具:Prrkl、Rumor、Pyrum、Stethoscope
钱包和 Keysotre:: ethdo、deposit cli、EIP 2335 及其它新标准
API 设计和原型绑定
罚没探测工具:Prysm “hash slinging slasher”
还有一些开放性的工具课题:
Eth2 验证者警报:在验证者表现不理想的时候提醒相关的节点运营者
验证者存款跟踪:通过跟踪验证者的保证金处理流程来帮助 Eth2 区块浏览器联通以太坊
使用带来的验证者保护措施:使用代理来跟踪验证者的消息,保证你的客户端无法发送不安全的消息
还有很多课题 —— 而且工具上的开发不限于技术规范已经提到的领域。创造力才是关键。如果你想贡献自己的力量,请跟 Eth2 客户端团队联系。
在当前的以太坊客户端(比如 Geth)中,技术所有的复杂性都是用用户层面的活动带来的 —— 交易池、区块创建、虚拟机计算、状态的存储和检索。而核心的共识机制 —— 工作量证明 —— 是协议中相对简单的部分。因此,大部分复杂性都可以经由核心协议以外的复杂硬件来处理。
另一方面,Eth2 客户端实现则完全集中在共识机制上。在权益证明机制和分片架构中,许多复杂性都是为了要实现可扩展的共识机制而内生于协议本身的。
这种区别使 Eth1 和 Eth2 客户端能形成漂亮的配对。
以太坊基金会旗下的 geth 客户端团队和 ConsenSys 公司的 TXRX 团队正在做合并两者的初步工作。其中的工作包括:(1)定义 Eth1 和 Eth2 客户端之间的通信协议;(2)为 Eth1 客户端加入可以通过通信协议来控制的共识引擎;(3)制作原型并模拟 Eth2 Phase 1 中客户端的行为,以测试耦合性。我们期望在今年夏天能见到一些具体的成果。
你可以在这个研究贴子中了解 Eth1+Eth2 客户端关系的概述;至于整合所涉及的技术范围则可见此处。
如上所述,开启跨分片执行功能的具体路径是一个仍在激烈争辩和研究中的领域。还有许多问题亟待解决。举例而言:
多少条分片链应开启执行功能?
除了 Eth1 分片之外,我们还要用 EVM 或者 eWASM 作为虚拟机吗?
如何能高效构造和处理跨分片交易?
需要在现有的 EVM 上做哪些改变才能支持跨分片交易?
执行机制和账户结构 可以/应该 是普遍可延展(generally extensible)的吗?
(以太坊基金会旗下的)eWASM 团队和(ConsenSys 公司的)Quilit 团队在过去 12 个月中做了大量研究。结论是,解决方案的领域非常广泛,虽然我们已经完全理解了这些领域的广度,当前的重点是发现简单而可靠的解决方案,使我们能测试、制作原型并真正开始讨论。由此还诞生了 eWASM 团队的 Eth1x64 计划(此处是这个项目的概述;另外还有一些讨论中的技术规范)。
将抽象的跨分片交易概念转化为可靠技术规范(用于讨论和最终的原型制作)的工作中出现了迅猛的进展。请保持关注,尤其如果你是 dApp 开发者的话。我们打算在接下来几个月里提供一些你可以理解、可以上手操作的东西,也期待你的反馈。
另一个与 Eth2 并行的研究和开发领域叫做 “无状态以太坊”。无状态以太坊研究是为了解决以太坊的状态数据规模问题,解决思路是让网络参与者无需在本地存储完整的以太坊区块链状态就能验证区块的有效性。现在的以太坊状态转换函数中隐含了需要完整的状态作为输入。而无状态以太坊的思路就是把交易要改变的状态的证据(witness)也包含在区块中。这就使得状态转变过程(也是状态验证过程)变成仅以区块自身作为输入的函数。
对于用户来说,这就意味着你可以同步区块链,甚至能监控部分你所关心的状态,但不用存储所有的状态数据。某些参与者(比如区块生产者、区块浏览器、付费的状态服务提供商)可能会存储所有状态,但大部分参与者都可以不保存所有状态。
对于 Eth2 来说,无状态性是一种重要的技术机制,保证节点和验证者可以验证和保护协议,又不至于需要背负存储所有分片的所有用户状态的负担。相反,验证者可以选择性地成为某些分片的区块生产者,同时 baseline 验证者只验证无状态区块。
无状态以太坊是对 Eth2 愿景的强有力补充,因为它能保证分片协议的基础仍然是轻量级的。另一方面,虽然我们计划无状态地运行 Eth2,但如果无状态路径最终被证明行不通,我们也还有别的办法(虽然我个人对无状态性非常有信心?)。
在这就我就不再深入解读无状态以太坊的现状了,只要知道这是一个激动人心的并行研究领域、目的是保证以太坊的长期可持续性,就好了。如果你想了解更多,请看 Griffin 的 The 1.x Files 系列博客。
Eth2 是一个大工程,为的是给以太坊提供一个更高级的、下一代的、高度可扩展且安全、去中心化的共识机制。许多团队和无数个人在日以继夜地开发,希望它变成现实。我们选择的道路是困难的,但我们已经取得了巨大的进展,也会继续取得进展。
这个新的共识机制的核心(信标链)就在眼前。
如果你是一个有抱负的验证者,现在就是时候参与了。尝试多种客户端、支持多客户端范式、帮助以太坊 2.0 在起步阶段就获得丰富的客户端多样性作为基础!
如果你是用户,或者是 dApp 开发者,请在当前的以太坊上继续开发,我们会继续为你准备更安全、更可扩展的运行环境。等时候到了,切换到 Eth2 的过程会尽可能地平滑。
感谢帮助今日之以太坊保持运行且状态良好的团队及个人;也感谢所有为以太坊在 Eth2 的未来作准备的人;感谢所有让以太坊美妙而不可思议的用户和开发者?
原文链接:
https://blog.ethereum.org/2020/06/02/the-state-of-eth2-june-2020/
作者: Danny Ryan
翻译: 阿剑