深入探讨以太坊 PoS 共识机制中的投票协议
2023-04-27 09:19
以太坊上海升级共学
2023-04-27 09:19
订阅此专栏
收藏此文章
以太坊网络中的验证者是如何进行投票的?


演讲:Patrick McCorry,Infura 研究员

整理:aididiaojp.eth,Foresight News

本文根据上海升级共学系列活动中 Patrick McCorry 的视频演讲内容整理


大家好,我是 Patrick McCorry,今天我们探讨的是以太坊 PoS 机制中的投票协议,在开始之前,我想强调以太坊合并是一项工程壮举。

 


以太坊合并真正令人兴奋的是它允许大量的验证者能够活跃地参与决策过程中,协议目前有超过 56 万个验证者。如果你在 20 年前告诉某个研究共识协议的人,我们可以设计出一个超过 50 万名参与者的系统,他们会认为你疯了,但今天我们做到了。

 

只要你有一台普通的计算机,你就可以参与这个协议,这种去中心化的程度鼓舞人心。协议需要关心验证者,帮助他们积极地参与协议,而验证者的唯一的工作就是提供交易排序服务。

 


验证者选择用户的交易,进行排列,并将它们打包成一个区块,然后将其发布到网络,最后所有验证者共同决定全部交易的总顺序。因此,所有的验证者都可以获得区块的副本,按顺序执行交易,然后计算数据库的副本。现在让我们深入了解以太坊中投票协议的工作原理。

 

Epochs 和 Slots

 

Epoch 和 Slot 在验证者参与权益证明协议过程中扮演时间表的角色。一个 Epoch 代表了权益证明协议的一个完整的回合,每个 Epoch 都有 32 个 Slots,每个 Slot 持续 12 秒。每个 Epoch 持续约 6.4 分钟,分为 32 个 Slot,每个 Slot 12 秒。

 


每个 Slot 都有一个验证者委员会。该委员会共同努力,并在该时段内提出一个区块。每隔 12 秒,委员会就会提出一个区块。一个 Epoch 代表协议的一个回合,每个验证者在每个 Epoch 中正好被分配到一个 Slot。

 


在上一个 Epoch 结束时,我们将从区块链中获取一个随机信标,我们今天不会谈论它是如何工作的,我们需要知道的是所有的验证者将根据随机信标的输出完成分配。一个 Epoch 分配 50 万个验证者,每个 Slots 将有大约 17000 个验证者。所有 Slot 中验证者委员会的规模大致相同,并且会提前两个 Epoch 完成分配,也就是说我们能够提前 12 分钟知道对于 M+1 和 M+2 之后的确切的时间表验证者,验证者们也有充足的时间查找他们被分配的 Slot。验证者要么进行提案区块,或者对一个提案区块进行投票。你可以积极地证明你参与了协议,这也是获得奖励的方式,每次投票时,你都会因此获得相应的奖励。

 


一个 Slot 实际上也是一个非常严格的时间表。在一个委员会中,有一个区块提议者,其余委员会成员将根据提议的区块进行投票。在前 4 秒区块提议者提出一个区块,在接下来的 4 秒内,每个验证者都可以为提议区块进行投票,然后在最后 4 秒左右,所有委员会成员的投票会被聚合在一起,并发送给下一个 Slot 的区块提议者。Epoch、Slot 和验证者委员会时间表的意义在于产生一个真正的规范链。

 


验证者如何进行投票?

 

那么验证者在对什么进行投票?投票协议如何运作?我们知道投票协议将决定哪条链是真正的区块链。

 


当协议运行时,可能会出现分叉区块。在左边的图片中,我们可以看到一个顶部区块和一个底部区块竞争,这时验证者需要投票来决定接受哪个区块。他们做出这个决定的方式是使用分叉选择规则,在右侧的图片中,验证者挑选了最长的顶部区块,较短的底部区块被拒绝。

 


一个验证者实际上同时参与 2 个投票协议,分别是最长链(Longest Chain)协议和检查点(Checkpoint)协议。



在最长链投票中,每 12 秒会有一个新的区块。左图中的验证者正在为这些区块投票,随着时间的推移,我们确信这个区块已经完成投票,但它可能会被逆转。检查点对于以太坊来说是非常独特的,它的目标是在每一个 Epoch 中,我们都应该尝试从前两个 Epoch 选择一个历史区块,并决定是否将其作为不可逆的检查点。用户的体验就是:12 分钟之后,可以绝对保证交易不会被撤销。先让我们看一下最长链表决的工作原理:在最长链表决中,每个区块都是由一个 Slot 提出,当区块被提出时,委员会成员将遵循三个规则。

 


第一,他们是否及时接收到了区块,Slot 有严格的时间表,他们必须在规定时间内投票。如果没有收到某一个区块的提案,就无法为它投票。在这种情况下,验证者最终会为前一个区块进行投票,他们要么为得到最多投票的下一个区块投票,要么为提议者投票,获得最多投票的区块最终被保留。最后有一个特殊的规则叫做区块提议增强。如果一个区块在 Slot 中被提议,我们会给他一些额外的投票,这是三个分叉选择规则之一,即我们应该总是投票给获得最多投票的区块链。



第二个规则是验证者有严格的时间限制,他们必须在某个截止日期之前投票。第三个规则是区块提议增强试图为最新的区块添加临时优势。即使前一个区块有更多的投票,我们应该投票给这个 Slot 的最新区块,因此获得了这种临时的优势。最新的区块并非是最终的,只是遵循最长链表决。一般的历史区块可以从最长的链转换。当最长的链成为历史区块后,他们永远不会被逆转。因此区块链的顶端是不稳定的,历史区块被永久化确认。检查点协议的重点并非是对现在的检查点投票,而是为下一个潜在检查点投票。这是一个两轮协议,我们为潜在的检查点投票,然后让它成为我们的新基点。

 


我们称之为源投票和目标投票,目标投票是选择最新的检查点候选者。我们运行投票协议,以决定下一个潜在的检查点。我们尝试决定目标投票,在这个时期内,我们将决定第 65 个区块有可能成为检查点。之前被投票支持的是潜在候选人。源投票是我们之前投票支持的潜在检查点候选者,投票协议运行一个 Epoch,在这 32 个 Slot 中,我们都在为目标投票。我们知道源之后,都在为同一个目标投票。这将在一个 Epoch 中运行,每个验证者都会投票。当一个新的 Epoch 出现时,投票协议就完成了 M+1 个 Epoch。然后我们可以通过查看结果来看接下来会发生什么。第 33 个区块是否成为下一个检查点?第 65 个区块是否成为下一个潜在检查点?我们评估的方式是查看前两个投票轮。在投票中,我们可以假设它获得了绝大多数投票,所有验证者都投票支持第 33 个区块成为下一个潜在的检查点。然后在 M+1 个 Epoch 中,我们再次可以假设所有验证者都投票支持第 65 个区块。因此投票协议连续两轮成功,那么第 33 个区块将成为检查点。在 M+2 个 Epoch 中,我们有检查点、源检查和目标检查。

 


我们正在运行投票协议,在运行成功的情况下,第 65 个区块将成为下一个检查点,第 67 个区块将成为源投票,然后第 83 个区块将成为我们可以进行下一个潜在检查点的区块。检查点的选择始终落后于 2 个或 1 个 Epoch,在这一个检查点确认之后,我们开始等待下一个潜在的检查点。这两个连续的轮次保证了验证者已经两次投票支持潜在的检查点,他们确定了潜在检查点,并且投票支持它成为检查点,这允许我们验证所有 50 万个验证者对区块链具有一致视图,并且他们都应用完全相同的选择规则。


如果验证者有不同的分叉选择规则会发生什么?如果他们得到一个提案区块,他们对其应用规则,但是有些验证者认为该区块无效,其他验证者认为该区块有效。他们对该区块存在分歧,那么分叉选择规则会发生什么?共识错误确实会发生,它们每隔几年就会发生,它们在比特币和以太坊上都发生过,并且通常会导致区块链分叉。在最好的情况下,如果少于 1/3 的验证者运行有错误的软件,则非常好,大多数验证者运行良好的软件,那么所有的事情都会继续保持一致。运行错误软件和错误的分叉选择规则并对区块链产生分歧的是少数验证者。

 


如果区块 32 已经被确认,但是区块 32 是无效的,他们却仍然投票支持它。如果有任何错误的软件,这些验证者只会受到轻微的惩罚,例如失去一部分奖励,但不会损失全部奖励。现在短期的问题是当一半的验证者投票支持一个区块,而另一半的验证者投票支持另一个区块时该如何解决。因为他们有两个不同的选择规则,没有任何一个获得多数投票,所以问题在于两个区块链都将继续存在并继续构建。



如果在第 4 个 Epoch 之后没有新的检查点,那么协议就会进入紧急模式。灰色委员会成员质疑为什么蓝色投票支持错误的区块,这不遵循规则。而蓝色委员会则说为什么他们投票支持黄色的区块,这不遵循我的规则。他们两个意见不一致,而且现在他们的分歧持续时间太长,协议会进入紧急状态,因为它无法完成区块,因为两个大的验证者集合彼此不同意,他们最终陷入争斗。在黄色的区块链中,他们认为自己是正确的,并且会惩罚验证者者。在蓝色的区块链中,他们会说他们没有投票支持我们的区块,所以他们是不活跃的。


黄色验证者现在投票给正确的区块链,但是会受到惩罚,因为他们互相争斗,触发了所谓的非活动泄漏。如果有 2 组验证者,他们存在分歧,并且他们完全同时导致 2 个不同的区块链,最终他们会踢掉其他验证者。所以如果你考虑蓝色区块链,他们最终会从他们的区块链中删除黄色验证者,这导致了所谓的活动泄漏,如果你在不活动的时候不投票给我区块链中的区块,我会惩罚你,最终你将不再有重要的投票,活动记分牌可以用于计算投票份额。



从上图中可以看到,如果你总是离线,不参与投票,惩罚的程度会直线上升,直到失去你在黄色区块链的所有份额。当然如果你在大部分时间内都在线,只会失去一些资金,但不会失去所有。现在解决这个问题的唯一方法是,如果存在两个不同的分叉,他们只是放弃了其中的一个分叉,可能会有一个永久的分裂。就像比特币分叉产生了比特币现金,以太坊分叉产生了以太坊经典。他们不同意彼此,然后他们会投票给不同的区块,最后他们会互相排斥,以不同的方式拓展下去。所以这真的很酷,因为如果我不同意你的观点,我会分叉区块链,改变规则,最终我会把你从我的区块链上踢出去。



所以作为志愿者,我必须从中挑选一个。我必须决定我想属于哪个区块,我不能两个都投。然后真正的关键是如果他们有不同的选择规则,会怎样?



如果 bug 被最终确定,那么它将永远留在区块链中,无法逆转,这时就需要人们的协调来解决这个问题。这是一个非常糟糕的情况。这就是为什么我们提倡去中心化和多样性。

 


作为一个验证者,如果我正在运行软件,我们要确保没有一组大于 1/3 的验证者在运行有问题的软件。如果只有三分之一的验证者有 bug,那么它们可以被忽略一段时间。它们不会影响系统,系统可以继续前进。所以在运行一个客户端时,因为如果所有客户端都有 bug,那么你不会触发活动泄漏,你也不会失去资金。


所以最后只剩下 4 分钟了。我来快速地回顾一下投票规则。

 

只有一个条件是所有验证者都必须满足的,那就是 slashing 条件。只要你不违反这一条规则,那么你可以随心所欲地投票。

 

如果你违反了这个条件,你将被逐出权益证明协议。



让我们来现在回顾一下投票的全过程。正常情况下,你只需为每个新区块投票。你对区块 32、64 进行投票,这是正常的投票。

 


也许你投了一票,你离线了一段时间,你回到线上,然后你投票给一对新的区块。没关系,离线是被允许的。



也许你投票给第 96 个区块,目标投票是下一个潜在的检查点,但是存在分歧,然后你可以投票给新的目标,这并没有违反规则,因为如果有分歧,来源不会改变,而是输入新目标。所以有三种投票方式是完全可以接受的。



如果目标投票失败并且无法就下一个潜在的检查点达成一致,那么当你离线后重启时,不能投同样的票。



每个 Epoch 只能投一票,这实际上是那个 Epoch 的目标投票。如果能够重复投票,就会存在远程攻击。例如你投了第 64 个区块和第 96 个区块一票。后来你想试着逆转历史,想选择一个非常古老的区块,跳过所有最近的区块进行投票。



本文分享了 Epoch 和 Slot 的概述,两种不同的投票协议,以及围绕投票的规则,你还可以探索很多其他有趣的话题。


【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

以太坊上海升级共学
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开