以太坊发展了这么多年,现在已经比较强大,成为了很多 Dapp 的基础。但有一些事情,以太坊一直在琢磨着要干(比如把 PoW 共识改成 PoS 共识)但不断推迟的拖了好久,直到这几年 eth2.0 这个词又被提出。那么什么是 eth2.0 呢?我们这篇文章就简单了解一下。
在阅读这篇文章前,你需要对 PoW 、PoS 有一个基本的了解;对以太坊也需要有一个大体的概念,类似于「以太坊可以执行智能合约」这样的,但细节知识是不需要的。
什么是 eth2.0
简单来说, eth2.0
是以太坊的一系列重大升级,注意并不是「某次升级」,而是「一系列升级」,因为这个所谓的 2.0 版本涉及到多次升级,时间也很长(到现在已经开始将近两年了,后面还有好几年的规划)。
既然提到 2.0 ,就不得不提一下 「1.0」 。一般提到 eth1.0 都是与 eth2.0 这个词相对的,指的就是当前的(2022/8)、未进行 eth2.0 升级的以太坊。
就是这么简单,这个概念,其实有点像朝代更替:现在是以太坊「大明」,2.0 就是「大清」了。从这个角度看,其实我觉得叫 2.0 不是太准确,以太坊创始人 Vitalik 给这个升级起了一个代号叫 Serenity
,我觉得这种方式更好一些。不过显然,Serenity
这个词没有 eth2.0 好理解。
为什么要升级
既然是「重大升级」,那就得问问「为什么」。现在的以太坊不好吗?嗯,确实有些地方不太好。
现在的以太坊以经是非常多的 Dapp 的基础了,以太坊为这些 Dapp 提供了区块链世界最底层的逻辑支撑。但这个「底层逻辑」仍然是不完美的、有问题的,比如:
- 效率不高
- 花费可能越来越高
- 不环保
- 有中心化的风险
首先,我们都知道,以太坊现在用的 PoW 共识是效率比较低的,因为一方面出块需要一定的难度,这需要时间去计算(当然,难度是设计者定义的,但如果难度太小那谁能很快的出块,可以想像链上就会有很多分叉,难以达成共识);另一方面 PoW 的区块「确认」也需要一定时间,并不某个区块出来了,它里面包含的交易就可以 100% 确认了。这些都会对效率产生非常大的影响。想像一下如果我们在使用「微信」这些 App 的时候,一条消息要很久(半个多小时?)才能确认发出去了,你是不可能喜欢用的。所谓的「Dapp」也是给人用的,给人用就得高效:技术极客可以为了去中心化,忍受一些效率方面的损失;但如果是普通用户,可能就没那么「通情达理」了。所以以太坊的效率,最终会严重制约以太坊生态的发展(甚至区块链的发展?)
另外,以太坊自身有效率瓶颈,同时越来越多的 Dapp 都将它作为底层支撑,这必然会导致交易越来越「拥堵」。什么意思呢?想像一下高速收费站的场景:收费站的效率本来就不高,而随着越来越多的车等待通过,肯定会越来越堵。但以太坊有一个比收费站「神奇」的功能:交得钱(Gas)越多,通过(交易被打包到区块中)得越快。可以想像大家为了「快速通过」,会产生费用竞价,导致使用以太坊的费用越来越高,直到有人无法承受而退出。这显然是不利于以太坊生态发展的。
再者,以太坊目前使用 PoW 共识,这种共识拼的是算力,而这种计算从共识之外的角度看,其实是「无用的」:它们并不真的计算什么,只是为了满足共识条件而已。所以使用这种共识挖矿,会浪费大量的电力。这显然是不环保的。很多人会觉得「环保」这个主题太高大上,跟我们这些程序员扯不上关系。但我不这么觉得,环保这个事是典型的「难以立刻奏效,所以对当前影响不大,但长远来看必然产生巨大影响」的事,如果到了「影响巨大」的时候再去关心,可能已经来不及了。
还有就是,由于 PoW 共识拼的是算力,所以「谁算力强谁说了算」。从比特币诞生至今,使用 PoW 的主流区块链已无法在普通 PC 上挖到矿了,算力几乎都集中到了专门用于挖矿的机器上来,即「矿机」;而这些矿机又基本都集中在一些「矿场」中,那么以这个趋势发展下去,以太坊的出块权可能越来越向拥有这些矿机的「矿场主」集中了,如果真的这样,以太坊的核心逻辑之一「去中心化」将不复存在。
所以,以太坊要想继续蓬勃发展,这些问题都必须解决掉,这才出现了 eth2.0
,即通过升级解决这些问题,从而可以保证以太坊的安全性和可持续发展,同时让以太坊更可扩展。
有哪些内容
网上的很多文章将 eth2.0
分为几个阶段,但其实阶段不重要,重要的是理解 eth2.0
要干什么事。所以按照我自己的理解,eth2.0
的升级内容主要包括以下几块事情:
- 将共识机制从 PoW 为 PoS
Sharding
机制Layer 2
机制
其中使用 PoS 作为共识机制是确定了的,并且已经快要发生了(根据官网的说明,在 2022 年第三或四季度将完成共识机制的替换)。而后面两项 Sharding
和 Layer 2
则还在讨论和试验中(至于这俩具体是什么意思,我们后面会介绍)。
其实只要把共识修改为 PoS ,就可以解决或缓解前面我们提到的很多问题:PoS 的出块效率可以比 PoW 高,并且 PoS 不拼算力,也解决了环保和中心化趋势的问题。而 Sharding
和 Layer 2
,则是为了进一步提升以太坊的效率和可扩展性。效率提高了,Gas 消耗也就可以降下来了。
(可是为啥不一开始就用 PoS 或 DPoS 呢?根据我查到的资料,PoS 在以太坊诞生之前就有好几个区块链使用了;DPoS 也在以太坊诞生前被提出。我自己没有查到有人说明这个问题,我猜想在以太坊提出(2013年)和诞生(2015年)的时间里,尤其是提出时,比特币的 PoW 太深入人心,大家都习惯于这一共识,而 PoS 虽然最早在 2011 年就被提出,但并未被有效验证过;再加上在那个阶段大家可能会觉得 PoW 除了耗点资源也没什么缺点,虽然效率慢些也不是不能接受,所以就使用了 PoW。当然这都是我自己的胡乱猜想,我就这么一说,您就这么一看,如果准确的信息欢迎指教)
以太坊社区的升级指南将升级过程划分了几个阶段,并且区分了「稳定的」和「未确定的」计划。其中稳定的计划目前有三个阶段:
Phase0
: 从无到有创建和运行 Beacon Chain。Altair
硬分叉:增加 Beacon Chain 对 committees 的同步支持(所谓 committees,是指在进行 PoS 共识投票时,由 validator 组成的一个 128 人的小组)Bellatrix
升级: 即The Merge
,以太坊正式使用 PoS 出块,PoW 停止工作。
其余的一些计划都还在讨论和试验中,这里就不一一列举了。
(虽说阶段不重要,但这里还是要提一下,很多文章中将 eth2.0
的升级划分了三个或四个阶段,即所谓的 phase
,如 phase0
、 phase1
等。但这些文章可能写得比较早,划分得已经不正确了,比如很多将 phase1
中的计划定义为增加 Sharding 机制,但实际上这个机制目前还在讨论中,并没有确定要怎么搞)
Beacon Chain
eth2.0
做的第一件事是把共识机制替换成 PoS (其实这事以太坊在很早很早之前就提出来了,一直拖拖到现在)。以太坊实现共识替换的方式不是直接硬分叉,而是引入一条新的链叫信标链(Beacon Chain
)。
Beacon Chain
是一条实现了 PoS 共识的新的区块链,通过向当前以太坊中的指定合约质押 32 个 ETH ,你就可以成为 Beacon 链的 Validator ,参与 Beacon 链的出块和验证。
使用 Beacon 链替换当前以太坊共识的方法是,在所有运行以太坊怕客户端上,需要同时运行着以太坊原来的客户端和 Beacon 链的客户端,这两个客户端程序通过 Engine API 通信。在某一时刻(具体哪一时刻以后的文章再聊吧),原以太坊客户端不再出块,而 Beacon Chain 的 PoS 机制开始运行并出块,由此完成了共识的替换。
注意,上面这一段关于替换的描述非常简单,忽略了非常多的细节。但目前这些细节不重要,我先把这个替掉方式简单描述出来,就是为了让读者能快速感知到 Beacon 链是个什么东西,它是如何完成它的使命的。(我自己在了解 Beacon 链的时候,就觉得非常别扭。很多文章,无论是官方的还是非官方的,都只会说 Beacon 链是一个独立的链,实现了 PoS 共识,在与主链(原以太坊链)合并前是并行运行的,并不会相互影响。但 Beacon 链到底是个啥,都说得很含糊。这感觉就像别人向你介绍空中加油机时,只说「这也是一架飞机,它能飞,可以给别的飞机在半空中加油,并不会影响被加油飞机的飞行」,却对「如何实现空中加油」只字不提。)
其实用 Beacon 链替换当前以太坊共识还是有点复杂的。首先,Beacon Chain 已经于 2020 年 12 月 1 日开始运行了,但在 The Merge 发生之前,它的运行都非常简单:虽然它也生成区块并链接成链,但区块中只记录维持 PoS 正常运行的 Validator 的相关信息,其它的以太坊中的数据如 Transaction 、智能合约、State 等,这个阶段的 Beacon 链是一概不管的。这个阶段,其实是对 Beacon 链的一个广泛的测试。
等到 Beacon 链测试得差不多了,difficulty bomb 「爆炸」了,就是合并的时候了。合并后,Beacon 区块中就包含了所有以太坊的数据。我从网上找了一张图,可以很清晰的展示什么是合并(图的原作者是 Danny Ryan):
(所谓 difficulty bomb
,即 Terminal Total Difficulty
(TTD),是以太坊的出块难度的计算方式计算出的值,这个计算方式的特点是,一旦超过某个高度,PoW 出块的难度将会变得非常大。这是以太坊很早前为了将 PoW 转成 PoS 作的准备,但由于转换工作一拖再拖,这个「炸弹」的高度也是一变再变,最近的两次升级 Gray Glacier 和 Arrow Glacier ,都只是为了修改这个「炸弹」的「爆炸时间」而已。你也可以看一下我之前文章里对这个计算方式的说明)
另外,以太坊社区自己并没有实现 Beacon 链,而是提出了一个关于 Beacon 链的实现指南,其他的团队通过这份指南实现了一些客户端。
Beacon 链中还有其它一些概念,比如 slot & epoch 、checkpoint 、randao 等,我们就不在这篇文章里介绍了,以后再说吧。
Sharding
Sharding
这个词,中文可以翻译成「分片」,它本来是一个数据库方面的概念。在数据库领域中,将一个非常大的表拆成多个较小的表,就叫「分片」。在拆分时,数据库中的每一行会按一定的规则进行分配,比如将 id 列的值和某个数求余,得到的余数是几,就分配到第几个表中。
在以太坊中, Sharding
的概念和数据库中的类似,也是将以太坊的数据按某一规则,分成不同的子数据;这样就可以让某个节点只处理某一个或几个子数据,而其它结点可以处理其它子数据。
很显然,Sharding
方案的提出,是为了解决单台计算机的性能限制。目前以太坊所有数据都在一起,那么网络中每台机器都要拥有完整的数据、处理所有请求(交易和智能合约),这对机器的要求是相对较高的(较大的存储空间、较快的网络和计算速度)。把数据拆分以后,一个结点可以选择只处理一部分数据,这样就相对轻快多了。
但目前 Sharding
机制好像不太受以太坊社区的重视了,因为我发现官网的介绍比较少,并且指南中显示的状态是 outdated
。
其实我自己的观点,是不太喜欢分片这个方案的。在中心式的数据库领域,这个方案是比较有效的,甚至可以做得很复杂(变成了集群)。但在区块链领域,虽然它可以一定程序上减少运行以太坊客户端的机器的负载(只存储和收发较少的部分数据即可),但这仍然是「扬汤止沸」:一方面,随着以太坊的发展,单个分片上仍然可能出现负载比较大的现象,难道一直分片下去吗?另一方面,即使可以一直分片下去(上万个分片….),但如果要处理分片间的交易,一个客户端结点可能就不仅要处理一个分支上的数据了,这仍会让客户端的机器的负载不断增加(当然肯定有方案可以让客户端只处理一个分片数据,比如当有跨分片交易时,让负责那个分片的结点协助处理,这其实就是「跨链」嘛。这让我想到了一个场景:以太坊把跨链做好(以太坊自己跨自己),每当一条链满载了,就有一帮人招呼起来:来来来,我们一起组个新链…..久而久之,想让旧链(可能保存的是几年前的数据了,交易已经不活跃了)依旧正常在线,只能靠自觉了)
Layer 2
Layer 2
和 Sharding 一样,也是为了增加以太坊的效率而提出来的,但这个方案的思路不是在以太坊自身上做文章,而是在以太坊之上,创建一个「第二层世界」,这个第二层的世界用于首先处理用户请求,由于它底层使用以太坊来确实安全性和去中心化,所以它自身可以不必太强调这两样特性,这样一来就可以大大加快交易或知能合约的处理速度。这个想法很像计算机世界里「加一层」的思路:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
其实 Layer 2
这个词,是一些解决方案的统称,但目前这些方案还不成熟,很多的项目都在试验阶段。以太坊关于 Layer 2
的官方文档提出以下一些解决方案:
Rollups
State channels
Sidechains
Plasma
Validium
这些解决方案我目前也不是很了解,只是看过文档里的一些介绍,所以暂时不再这里乱说了,感兴趣的读者可以自己去看一下文档。
虽然但是,这里还是简单介绍一下 Rollups
吧。根据以太坊官网的描述,Rollups
是以太坊社区目前比较看好的方案(Rollups are currently the preferred layer 2 solution for scaling Ethereum.)。所谓的 Rollups
,就是把很多的 Transaction 在 Layer 2
这一层进行处理,然后将 Transaction 数据、处理结果、相关证明一起提交到以太坊主链上(即所谓的「捆绑」)。
需要特别说明一下的是,Rollups
对 Transaction 的处理、包括智合约的执行是「离链的」(off-chain),所以将数据和结果提交到以太坊链上时,需要有一个「证明」可以让别人验证处理的正确性。根据证明的方式,又可以分成两种方案:
从名字就可以看出,optimistic-rollups
比较「乐观」,先假定数据都是对的;而 zero-knowledge rollups
则运用零知识证明的方案,证明自己提交的数据是正确的。
我自己目前对这两类 rollups 及证明算法也是一知半解,所以这里就不说了(省得说错),等以后的文章再去深入介绍吧。
总结
这篇文章里,我们简单介绍了什么是 eth2.0 ,以及具体有哪些内容。所谓 eth2.0 其实就是以太坊的一系列重大升级,首先是使用 PoS 共识替换掉现在的 PoW ,然后探索 Sharding
和 Layer 2
这样的机制,以求大大增加以太坊的效率。目前所有的公链虽然去中心化有所保证,但效率仍然不能满足大吞吐量的商业使用,比起目前中心化的解决方案更是差很多;并且无论是否应用 Sharding
,以太坊数据库只会越来越大,这显然是个「灰犀牛」;所以如果以太坊能探索出一条解决此问题的路来,那对区块链领域来说真的是天大的好事了,我们拭目以待。
限于作者水平,文章中难免有错误的地方,如果发现感谢您能不吝指正。