You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 08 | 共识(下):区块链领域的两类常用算法
你好,我是自游。
在上一讲中,我们通过对拜占庭将军问题的描述及推演,引出了分布式共识的基础知识,也论证了区块链共识的必要性。而这一讲,我将为你梳理区块链中常用到的共识算法。
说起对区块链共识最初的认知我们几乎都能想到比特币中的PoW也就是工作量证明算法。
其实它只是众多区块链共识算法中的一个虽然现在区块链领域中有很多种类的共识算法但总的来说可以分为两类一类是联盟链中用到的拜占庭容错算法而另一类就是公链中用到的类似于PoW、PoS之类的算法而我更愿意将它们统称为激励共识算法。
因为是两类共识,理解起来肯定有差异,但是我们却可以从上一讲故事里提取共识的基础要点来进行对比分析。我大致总结了三个要点。
**1.由谁来生产区块?**因为区块链是去中心化网络,节点间权利与义务是对等的,因此在任意一个时刻,任何节点都可以生产区块。但是以谁的为准呢?这是我们在理解区块链共识时需要首先搞清楚的问题。
2.**什么时刻可以达成共识?**分布式共识其实也蕴含一个前提,那就是需要在有限的时间内达成各节点间区块一致。如果共识过程无限期,那么共识本身就不成立了。
3.**有多少节点参与了共识?**通过对拜占庭将军问题的解析我们知道共识的达成跟叛徒的数量息息相关不同的共识对于叛徒的容忍程度是不一样的我们常听到的少数服从多数51%攻击等等说的就是这一点。
只要按照以上这三点思考和推演,我们理解共识就会显得比较容易。接下来,我就带你分别梳理一番。
## 拜占庭容错共识
所谓拜占庭容错共识,其实就是直接超脱于拜占庭将军问题的工程实践。
在[上一讲](https://time.geekbang.org/column/article/403977)的描述中我们其实已经通过图例说明了达成一次共识需要哪些步骤保证拜占庭容错共识就是将这些步骤通过缜密论证推理后形成的实践。而其中最著名的成果就是《实用拜占庭容错》算法简称PBFT。
这个算法解释起来很深奥但是如果我们只看示意图其实与我前面画的A将军共识示意图并没有什么太大的不同都遵循相同的逻辑。只不过我们只是故事的推演而PBFT却能实实在在用在真实场景中。
![](https://static001.geekbang.org/resource/image/8e/ae/8ee91655cf2925d677de759fe7405fae.png?wh=933x539 "PBFT示意图来源于PBFT论文")
从图中我们可以看到一个request被提交到0节点再通过0节点发送给其他参与方节点随之展开共识后续的流程。在PBFT中节点被赋予主节点与从节点这两个角色request都从主节点发起一次共识有且只有一个request存在。图中的0就是request的发起者所以0是主节点。
如果从区块链角度来看0就是区块的生产者且针对当前区块的共识并不存在潜在的竞争区块也就是说在拜占庭容错共识中主节点具有绝对的话语权。
当然,为了防止主节点作恶,节点角色是可以动态进行切换的,其他节点通过共识的结果可以推断出主节点是否是诚实节点,一旦主节点不是,则可以发起投票剥夺主节点的权利,这样就保证了系统的正常运行。
我们再从时间的角度来分析一下共识的流程从图中可以发现PBFT将共识信息的流转划分成3步每一步都包含着多次的信息广播通信。通信虽然需要时间但是只要能走完整个流程就代表着共识可以达成而且一旦达成就不再改变可以说拜占庭容错共识是**强一致共识协议**。
你可能对此有点疑问,如果遇上节点间网络通信中断,那共识不就不能够在有限时间内完成了吗?这个问题,如果我们换个角度来看,其实非常容易理解。
网络中断的节点其实可以算做一种作恶节点虽然它的恶并不是有意的但确实阻碍了共识的达成。而依据上一讲的结论只要这个共识网络中作恶节点的数量并未超过总节点数的1/3共识依旧可以达成。就比如图中的节点3可以看作是因为网络问题它并未响应任何其他节点的请求但因为其他节点都是诚实节点少数服从多数这次的共识依旧成立。
另一方面我们已经知道一次共识的达成PBFT需要进行多次的网络通信而图中还仅表示的是只有4个节点的情形如果将节点数进一步扩展通信的要求就会指数级增加因此它并不适用于有大量节点参与的场景。
这个问题也并不仅仅是PBFT才存在而是任何类BFT的共识算法都要面临的共同问题虽然它们或多或少都在PBFT的基础上作出了改进但面临像比特币以太坊这类拥有大量节点的公链网络时基本都束手无策。
所以BFT类的共识算法主要是链圈在推动大多是用在联盟链中因为联盟链主要参与对象是企业有准入机制的存在一条链的参与方不会很多也很少存在动态增删节点的情形可以说**联盟链与拜占庭容错共识是天生一对**。
## 激励共识
然而,如果我们将目光转向公链网络,就会发现事情变得有些棘手了。比特币、以太坊等公链与联盟链除了拥有一致的区块链基本思想,其他方面可谓千差万别。
所谓公链,就代表着这是一个公开的、任何人、任何机构都可以**随时随地**参与的区块链网络。随时意味着网络中的节点可以任意的上线或者下线,不受任何约束。而随地意味着你可以在世界的任何地方启动节点,不管你是在珠穆朗玛峰,还是在亚马逊丛林,只要有网络,就没有人可以限制你的加入。
那在这样苛刻的分布式系统中该如何保持节点间数据的一致呢我以PoW工作量证明算法为例为你解析这类算法。
因为公链网络是公开的,没有任何人可以干涉别的节点,所以任意一个节点的动作都可以看作是网络的缩影,那任意一个节点可以生产区块也就意味着网络中所有节点都可以。那同一时刻肯定存在多个候选区块,这给共识的达成造成了不小的困难。
那中本聪干脆这样规定,虽然每个节点都可以独立的将自己一段时间内搜集到的交易打包成区块,但是你创建的区块必须满足一定的条件,否则就算区块被全网广播了,也是一个错误的区块,其他节点会拒绝接受,也就是说无法达成共识。
而这个条件就是利用哈希算法计算区块哈希使得区块哈希以N个0开头N的多少取决于当前网络区块增长的速度是一个动态调整的值。这样一来**PoW就限制了一段时间内网络中区块提案的个数。**
当然虽然增加了难度但并不能保证在一个公开的网络中不会有多个节点同时计算出满足约束条件的区块并向外扩散。而且就算区块创建的时间有先后顺序的差别但网络扩散是无序随机广播的谁也保证不了谁会被先收到极有可能一些节点收到了满足条件的区块A而另一些节点收到满足条件的区块B那到底以谁的为准呢
这时候骚操作来了,区块链是区块通过区块哈希前后关联形成的链式结构,中本聪规定,**比特币网络允许有多条区块链存在,但只认同节点能接收到的最长的那条区块链是全网络共识的链**,其余短的区块链都是无效链。
这也就意味着,节点当前所累积的最长链可能并不是最终的结果,在某个时刻它可能收到比节点本地存储更长的链,此时节点就应该切换区块链,否则有很大概率它所维系的区块链并不是全网络共识的结果。
通过以上分析可以发现在PoW共识中并不存在对某一区块共识结果的实时确认因为随时都有可能被其他更长链上的竞争区块替换掉。
通过这两条规定,比特币巧妙解决了如何在分布式系统中达成共识的问题。与拜占庭容错共识相比,在无节点角色区分的情况下降低了区块提案的个数,同时将一致性从强一致性放宽到最终一致性,虽然效率有所下降,但却达到了相同的效果。
这里我们还可以顺便从共识的角度,分析一下怎样保证比特币的不可篡改特性。作恶者如果想篡改区块,其目标就是要计算出满足条件的替代区块,并使得该区块所在的链成为全网中最长的区块链。
而区块哈希的计算几乎没有捷径可走,必须老老实实计算,这就要求作恶者必须拥有占比全网总的计算资源的绝大部分,才能有机会将自己篡改的区块链变成全网路中最长的链,因为你在篡改的同时,被大多数节点认可的最长的链,它也在不断地向前延伸。
此消彼长,归根到底,**对比特币网络的篡改实质是对计算资源算力的争夺谁拥有更多的计算资源谁的话语权就大这也就是我们通常听到的51%攻击。**
而其他激励共识算法也遵循相同的道理比如PoS权益证明算法谁拥有更多的权益就更有机会去争夺下一个区块的提案权。再比如DPoS委托权益证明算法个人的力量是有限的但是如果把很多人手中的权益集中起来就可以以一种联合代表的形式参与到对区块的共识当中。与PoW相比无非是减少了对计算资源的浪费但本质并无差别。
最后我还想谈谈激励共识算法中的激励。公链是公开的网络可以看作是一个小型的社会所有的参与方都是基于一个共同的目标参与到社会的建设中但这必须需要付出一定的成本比如PoW共识的成本就是对计算资源的消耗、对电能的消耗。
如果没有激励,参与者的成本无从分担,就无法保证区块链生态的平稳发展。通过激励机制,使得各参与节点能摒弃信任中介,建立一种无组织、自协作的新型生产关系网络,并以此来吸引更多节点加入,共同维持区块链的正常运转。
## 总结
区块链中对共识的实现是有差异的,但是其底层逻辑是一致的。在联盟链的实现中,共识基本遵循了拜占庭容错共识算法的思路,这也与联盟链的应用场景有关。
而公链网络因其开放特性,并不十分契合拜占庭容错共识,但却创新性地引入了基于激励的共识算法系列。这不仅体现了对拜占庭容错共识的简化,还革命性地引入了社会治理思想,通过调动节点的参与积极性,共同推动区块链网络的繁荣。
自此我通过5讲内容讲解了区块链中最常用到的四种基础技术区块链节点把将一段时间内通过点对点网络收集到的交易集合通过区块这种形式打包在一起并前后通过区块哈希进行关联形成一条由哈希构成的链式结构通过达成区块的共识在去中心网络中保持各节点状态一致。
![](https://static001.geekbang.org/resource/image/77/71/7737d02bd414d3811532ff8yy6540071.jpg?wh=1500x1798)
## 讨论
你能否通过这4讲的内容将区块链的三大特性与四种技术基础之间的对应关系用你个人的理解通俗地概括出来呢
## 扩展阅读
* [实用拜占庭容错共识算法](http://pmg.csail.mit.edu/papers/osdi99.pdf)是理论付诸实践的一次伟大尝试,建议你抽空啃一啃这篇论文,对你了解共识算法有很大帮助。
* [工作量证明](https://bbs.huaweicloud.com/blogs/100427)与[权益证明](https://ethfans.org/posts/Proof-of-Stake-FAQ-new-2018-3-15)是公链网络中最常用到的共识算法,其他算法都是在其基础上衍生而来,通过这两篇文章你可以了解更多的知识。
* 关于区块链中的激励问题,我推荐你阅读中国人民银行数字货币研究所所长姚前写的[这篇文章](http://www.thfr.com.cn/post.php?id=79959)。
欢迎你在留言区跟我互动,主动思考、积极交流会让你更有收获。如果这一讲对你有帮助,也欢迎你把今天的内容分享给自己的朋友、同事。