区块链100篇之第六篇--共识机制

共识

共识的英文是Consensus,也可以翻译成一致或一致同意。维基百科对于共识的定义是:共识是指分歧双方搁置争议,达成能够被各方所接受的陈述(即使有时只是勉强接受)的社群解决方案。简单的说就是在一个群体中就某一个问题达成共识,一致同意采取某一种策略来解决这个问题,举个例子:

  • 现在有一个班级,大家需要就什么时候拍毕业照进行投票,有两个方案,方案一是在5月1号拍毕业照,方案二是在论文答辩后拍,这时大家进行投票决定,假设结果大多数人选择了方案一,那么最终大家就需要无条件服从这个决定。这里什么时候拍毕业照是一个问题,而在决定五月初拍这是解决这个问题的一个策略,到这里对应上面共识的定义就大概能明白是什么是共识了。

这里有一点要注意的就是并不是全部的人都选择方案一,那么为什么最终结果是选择方案一而不是方案二呢,这是因为大家在此之前就已经达成了另一个共识,就是“少数服从多数”,也就是说我们是在已经有了一个共识的前提下达成另一个共识。

共识机制

上面的共识应该很容易理解,讲完共识,我们来了解什么是共识机制,共识机制又称共识算法,看一下是维基百科对共识机制的解释:

  • 由于加密货币多数采用去中心化的区块链设计,节点是各处分散且平行的,所以必须设计一套制度,来维护系统的运作顺序与公平性,统一区块链的版本,并奖励提供资源维护区块链的使用者,以及惩罚恶意的危害者。这样的制度,必须依赖某种方式来证明,是由谁取得了一个区块链的打包权(或称记账权),并且可以获取打包这一个区块的奖励;又或者是谁意图进行危害,就会获得一定的惩罚,这就是共识机制。

用自己的话说就是一套解决如何在彼此都不信任的基础(因为会存在有人捣乱的情况)上仍然可以就某一个问题达成一致的制度。为了一步步的讲解,先来看下面的一张图:

consensus-png

这张图我们暂且称左边的人为A,右边的人为B,那么思考一个问题,假如在一开始的时候他们彼此都不认识(彼此不信任),那么他们能否就自己带的是什么颜色的帽子达成共识(不能自己摘下自己的帽子来看)? 
从这张图我们可以确定一下几点:

  • A知道B的帽子是什么颜色的;
  • B知道A知道他的帽子是什么颜色的;
  • A也知道B知道自己知道他的帽子是什么颜色的;
  • ……

可以看出A其实没办法验证自己的帽子是什么颜色的,你可能会说那A可以直接问B自己是什么颜色的帽子呀,这样不就达成共识了吗,没错,A确实可以通过询问的方式来知道自己帽子的颜色,但是我上面说了他们彼此是不信任的,假如B告诉A他的帽子是绿色的,那么A得到的结论永远都是错的,所以A是永远都不能证实自己的帽子是什么颜色的。这个其实就是两个将军问题的翻版,两个将军问题已经被证实是无解的。 
我们继续这个问题往下思考,你可能会想那能不能多添加几个人,通过询问其他人自己的帽子是什么颜色的,然后以少数服从多数的原则就可以初步证实自己的帽子是什么颜色的(注意这里是初步证实不是完全证实),那么有出现一个问题,至少需要添加多少人才能满足可以进行判断的要求?如果是增加一个比如C,那么如果C告诉A他的帽子颜色是黄色的(为了简单,就先假设现在只有黄、绿两个选择),A还是无法证实自己的帽子是什么颜色的,因为他根本就不知道他们中谁在说谎;那么增加两个人呢,比如增加C、D,这个时候他们三个人中就可能会有两个人的答案是一致的,那么A就可以基本知道自己的帽子是什么颜色了。到这里你可能还会问,那如果有两个人说谎呢?这样A得到的结果还是错误的(这就是我上面为什么说是初步而不是完全证实,就是这个原因)。那这个问题要如何解决?先不急我们先捋一捋。

  • 共识机制的本质是解决信任的问题,就是在彼此都不信任的基础上达成一致的意见;
  • 在分布式系统(或者区块链)中要达成共识至少需要四个节点以上,少于四个节点是无法达成共识的。

拜占庭将军问题

在上面我提到就是如果有两个人都说谎了那该如何解决?问题的答案是解决不了,结果就是A会一直被蒙在鼓里,其实提这个问题是为了引出另一个问题,即拜占庭将军问题,看下面的故事:

  • 拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击。这10支军队在分开的包围状态下同时攻击。他们任一支军队单独进攻都毫无胜算,除非有至少6支军队(一半以上)同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵骑马相互通信来协商进攻意向及进攻时间。困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭将军们才能保证有多于6支军队在同一时间一起发起进攻,从而赢取战斗?

为了简化问题,我们先假设所有的将军是通过口头消息来传递信息的,即消息传递的信道绝无问题,因为如果还要考虑信息在传递的过程中被人修改了这种情况,那问题就要更加复杂了,这里先不讨论这个,后面打算单独写一篇关于拜占庭将军问题,再来详细讲解。

  • 问题分析

单从上面的说明可能无法理解这个问题的复杂性,我们来简单分析一下:

先看在没有叛徒情况下,假如一个将军A提一个进攻提议(如:明日下午1点进攻,你愿意加入吗?)由通信兵通信分别告诉其他的将军,如果幸运中的幸运,他收到了其他6位将军以上的同意,发起进攻。如果不幸,其他的将军也在此时发出不同的进攻提议(如:明日下午2点、3点进攻,你愿意加入吗?),由于时间上的差异,不同的将军收到(并认可)的进攻提议可能是不一样的,这是可能出现A提议有3个支持者,B提议有4个支持者,C提议有2个支持者等等。

再加一点复杂性,在有叛徒情况下,一个叛徒会向不同的将军发出不同的进攻提议(通知A明日下午1点进攻,通知B明日下午2点进攻等等),一个叛徒也会可能同意多个进攻提议(即同意下午1点进攻又同意下午2点进攻)。

叛徒发送前后不一致的进攻提议,被称为“拜占庭错误”,而能够处理拜占庭错误的这种容错性称为(Byzantine fault tolerance),简称为BFT。

到这里大概能理解拜占庭将军问题是讲什么的了,对于这个问题如果现在有n个将军和m个叛徒,只要满足n>=3m+1就能达成共识(注意前提是口头消息)。比如有2/3的成员是诚实的,算法就能达到共识。如果叛徒多于1/3,无法达到共识,这些军队无法协调他们的攻击,敌军胜利。

所以当一个分布式系统中有多余三分之一节点出现了故障时,那对这个系统是毁灭性的,当然这些是理论,现实不一定就是毁灭性的,但是一定是很糟糕的事情。

区块链的共识算法

因为区块链是一个分布式的系统,所以它一定存在拜占庭将军问题,那么就需要解决如何保证各个主机状态一致的问题,为了解决这个问题很多人都提出了自己的共识算法,最有名的当属中本聪的POW(工作量证明机制)共识算法,当然还有POS(权益证明机制)、DPOS(股权权益证明机制)、PBFT(拜占庭容错机制)以及RAFT共识算法,对于这些算法在后面都会一一讲到,这里就不讲了,今天主要是理解什么是共识机制以及在区块链中共识机制所要解决的问题。

结尾

在本篇最开始的时候我提到了少数服从多数这个共识,其实在比特币中对应的就是选择最长链,会出现这个问题是因为矿工在打包区块的时候会出现一种情况,即有两个矿工同一时刻计算出随机数获得记账权,这个时候就会出现两条链,这两条链会沿着不同的方向发展下去,那么结果就是比特币网络会变得越来越混乱,为了防止这种事情发生,比特币有一个原则就是选择最长链,即在某一时间段内比较哪条链最长(因为算力的不同就会出现在一段时间后总有一条链的长度超过另一条链的长度这种情况),然后把短的链丢弃掉,这其实也是少数服从多数的原则,准确的说应该是短链服从长链。

这种两个矿工同时挖出一个符合条件的区块的情况也叫作分叉,这就是我下一篇打算讲的比特币分叉。

原文地址:https://www.cnblogs.com/wangsea/p/9429411.html