我在第2讲“区块链到底是怎么运行的”一文中,提到了“打包Transaction”和“广播交易”这两个概念,因为概述的原因,当时只带着你走了一遍过程。其实,以上谈到的两个内容正是区块链最核心的技术内容之一:共识机制。

区块链发展至今,已经形成了各种不同类型的共识机制,在今天的文章中,我们就展开聊一聊区块链共识机制到底是什么,以及区块链的共识过程到底是怎样的。

# 分布式系统的经典问题: 拜占庭将军问题

拜占庭将军问题其实是虚构出来的一个故事,是为了方便通俗地介绍分布式系统所面临的难题。这里我仅作一个简短的说明,你可以在中文社区找到更丰富的通俗解释材料。

为了避免重复,我们换一种表述形式,还是以上一次的村子为例,假设随着村子和人口的发展,大村子演变成了十一个小村子并分散在各地,各地的通信只能靠信鸽进行。

大家约定了每年都会举办一个相亲大会,至于谁能举办,每年轮流从两个备选村子,A村和B村中选择一个,然后大家投票,票数多者可以赢得举办权。

由于地图很大,任何一个村子的投票都无法靠一只信鸽传输到每个村子,必须靠一个中继村子代为传输,这也就意味着有中继村子可以读到其他村子的投票信息。

那么,如何防止下面两个问题的出现呢?

  1. 投票者的“精分”,这里所谓的“精分”是指某个村子的投票行为不一致,发送给第一个村子的投票消息为“投票给A”,而发送给第二个村子的投票消息却为“投票给B”。
  2. 中继村子作弊,即篡改上一村的投票消息。

上面讨论的问题我们可以认为是简化的 “拜占庭将军问题”(完整的拜占庭将军问题还有将军-副官模型,如果感兴趣的话,你可以自行阅读)。

我们回头再看区块链。区块链本质上也是分布式系统的一种,其共识机制也是为了上述问题而提出的解决方案。

# 什么是区块链共识机制?

共识机制是区块链是核心的组成要素之一,它决定了区块链的业务吞吐量、交易速度、不可篡改性、准入门槛等等,是最为关键的技术要素之一。

要理解区块链共识机制,首先就需要理解区块链共识机制到底解决了什么问题。

共识机制主要解决了两个问题:

  1. 谁有权利;
  2. 作弊问题。

上一次我们构造了一个中心化记账的场景,在这个场景下,记账问题其实可以简化为大家信任中心记账者即可。

然而在分布式记账的场景下,问题更为复杂。首先,大家面临的最大问题是谁有权利记账,其次是如何避免记账者作弊。毕竟,谁都有权利记账,也就意味着谁都有可能作弊。

以上两部分共同构成了区块链共识机制。

另外补充一点,在比特币社区,“共识”(consensus)这个词已经跳出了技术的范畴。通常人们在表述一个比特币上的问题时,共识的内涵还包括比特币的使用者、开发者、矿工来达成社区共识的部分,所以“共识”这个词在区块链领域还有些“民主”的味道,不单单是技术领域的“共识”。

# 最经典的入门型共识机制:PoW工作量证明

PoW (Proof of Work)工作量证明可以解决上述的两个问题,

在上一篇文章中,其实我们已经悄悄讲解了一点PoW共识机制,你还记得上文提到的“24点”那个游戏吗?“24点”其实是尽可能随机地选取系统中任意的节点来规避作弊者,这个方案的实践其实就是PoW共识机制。

产生记账者的随机性其实来自于谁最先计算出24点的答案,这个问题可以简化成谁拥有的计算资源更多,谁就拥有整个系统的最大概率的记账权。一旦这个概率超过一半以上,那么这个系统就有一定的中心化风险。

如何理解上面一段话呢?

举个例子,李四家发明了一种算盘,可以快速计算24点答案,比起其他人掰手指头,李四家总是有很大的概率拿下记账权,换句话说,也就是李四和全村其他所有人竞争,相当于算盘对全村其他人手指头的竞争。

如果算盘足够强大,就能有一半的概率获得记账权,那么李四个人的诚实性,就成为了系统的唯一破绽。

比如李四在第一次记账时篡改部分交易,第二次还是他记账,还继续篡改交易,那么两次修改如果自洽的话,是可以形成假账的,这就是所谓的中心化风险。

所以在PoW这种机制中,计算资源(又称算力)是决定记账权的唯一因素。与之对应的,便是计算难度。

计算难度又称作挖矿难度,计算难度是区块链为了控制产生答案的速度,比如平均10分钟就有一个答案产生,平均2分钟一个答案产生。

在上述场景中,因为李四有了算盘,强大的计算资源突然加入以后,肯定会让整个系统的产生答案的速度变快很多,作为系统本身会自适应,将难度提升,降低答案产生的速度。

上面介绍了这么多,其实是想引出另外一个问题,PoW到底是如何避免作弊者的呢?答案就是计算资源(算力)。

设想,如果一个作弊者想篡改信封里面的交易,首先得获得记账权,也就是装信封的权利。

而影响记账权的唯一因素只有计算资源(算力)的大小,如果想篡改交易,只能投入大量的计算资源与整个系统中其他所有人进行对抗,这是十分困难的,尤其在整个系统有一定基础计算资源(算力)的情况下。

PoW中一个有趣的设计是激励机制,在PoW共识机制下,我们假设所有参与者都是理性的,理性的意思就是单纯逐利,不考虑家庭、爱好等其他因素。有了理性的前提,PoW共识机制会给每个诚实的记账者予以奖励,这个设计可以抗击作弊收益的问题。

怎么进行抗击的呢?整个过程是这样的,理性的人如果作弊、篡改账本肯定需要投入成本,也就是计算资源,收益是篡改账本获得的收益减去投入成本,这个收益往往小于诚实计算所获得的收益。所以,作弊者在作弊过程中投入的计算资源过大,反而得不偿失。

# PoW工作量证明的补充:解决双花攻击

上面给出了一个结论,我们说作弊的收益往往小于诚实计算的收益。这一点其实对应到区块链领域有个著名的问题:双花攻击(double-spending) 。

双花攻击是指一个代币被花费了两次,这在任意的区块链系统中是不被允许的。如果避免了双花问题,基本就能避免上述作弊中收益过大的问题,因为攻击者首先要窃取到你的私钥,同时又能控制了你的计算资源(算力)。

为了方便分析,我们回到上一篇中广播交易的那一节。那一节中我介绍了广播的内容分为两种,第一种是Transaction,第二种是区块,也就是信封。

第一种又被称为未确认的Transaction,第二种信封中所有的交易被称作已确认的Transaction。

所有记账节点都会遵循以下两条规则:

规则一:一个代币如果已经被花费,那么会被标记成已花费,如果再次接收到这个代币被花费的请求,那么记账节点会拒绝打包这笔交易;

规则二:如果同时接收到两个信封,这两个信封中装的两笔交易出现了一个代币被花费了两次的情况,这种情况也就是我们所说的分叉(Fork),那么选择挖矿难度比较大的那个信封。

规则一避免了未确认的交易出现双花,规则二基本避免已经确认的交易中(信封中)的双花问题。

假设作弊者的计算资源(算力)占整个系统的30%,那么连续两次获得记账权的概率是9%,看起来作弊的可能性还是挺高的,如果是连续6次获得记账权呢?概率直降到万分之七。

在比特币中,这个6也就是6次确认,表示连续6个块过去了,如果我的交易没有被双花的话,那么它被篡改的可能性将越来越小,最后变得几乎不可能被篡改。这也是区块链不可被篡改说法的由来。

试想,如果任何作弊者花了大量的成本获取了系统30%的计算资源(算力),最后只有万分之七的概率获得篡改的可能性,比起作弊,还不如诚实记账的收益高。

# 总结

好了,今天带你了解了区块链的共识机制,也顺便浅谈了拜占庭将军问题,介绍了区块链的入门共识机制PoW,它其实也是目前区块链领域使用最广泛,应用最成熟的共识机制。

最后,还涉及了一部分PoW工作量证明的补充:解决双花攻击。由于篇幅所限,我们将在技术篇详细讲解PoW、PoS、DPoS等共识机制。

那么,亲爱的读者,你觉得PoW共识机制和其他分布式一致性算法有什么不同吗?欢迎给我留言,一起讨论。

感谢你的收听,我们下期再见。