区块链共识机制

非拜占庭问题,采用帕克斯算法和RUFT算法;
拜占庭问题,采用拜占庭容错算法,进一步发展了优化PBFT算法。
PBFT算法只适用于似有链和联盟链,公有链一般采用POW算法、POS算法和DPOS算法。

一、PBFT算法

PBFT算法指实用拜占庭容错算法,长期以来拜占庭问题的解决方案过于复杂,缺乏实用性,直到1999年PBFT算法提出,才首次将拜占庭容错算法的复杂度从指数级降低到了多项式级,目前已得到了广泛应用。此算法可以保证背叛节点数不超过1/3的情况下,保证信息的传递过程无法被篡改和破坏。PBFT算法采用了例如ISA签名算法、消息验证编码和摘要等密码学技术。

PBFT算法基本过程如下:
首先通过轮换或者随机算法选出某个节点为主节点,此后只要主节点不切换则称为一个试图View,在某个试图中请求发送给主节点,主节点负责广播请求到所有其他副本节点,所有节点处理完请求将处理结果返回给客户端,客户端检查是否收到了F+1个来自不同节点的相同结果作为最终结果,这里的F是指网络中存在拜占庭故障的节点数量,F+1个是指正常的节点数量,没有故障的节点数量应该要大于网络中存在拜占庭故障的节点数量。

那主节点的广播过程包括了三个阶段的处理,预处理阶段,准备阶段和提交阶段,预处理和准备阶段确保在同一个试图内请求发送的顺序正确,准备和提交阶段则确保在不同试图之间的确认请求是保序的。

首先看预准备阶段,主节点从客户端收到了请求分配体验编号,然后发出预准备消息给各个节点,给副本节点,准备阶段,副本节点收到预准备消息后检查消息合法,如检查通过则向其他节点发送准备消息,带上自己的ID信息,同时接收来自其他节点的准备消息,收到准备消息的节点对消息同样要进行合法性检查。

验证通过,则把这个准备消息写到消息日志中,集齐了至少2F+1个验证过的消息才进入到准备状态。提交的阶段可以广播提交信息告诉某个节点提案n在试图v已经处于准备状态,如果集齐了至少2F+1个验证过的提交阶段提交信息,则说明提案通过。

拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案,并且完成最终一次性确认过程十分困难,容易受到干扰。

使用拜占庭算法的主要优点是:

第一,PBFT算法共识各个节点由业务的监管方或者参与方构成,安全性与稳定性由业务相关方来保证。

第二个它的共识时延大约在2-5秒,基本达到了商用的实时处理要求,所以它的共识效率比较高,可满足高频交易量的需求,PBFT算法的这些优点非常适合联盟链的应用场景,因此成为使用最多的联盟链共识算法。

PBFT目前也有很多的改进,主要集中在一个修改网络拓扑的要求,使用的P2P网络;第二个可以动态调整节点的数量;第三减少协议使用的消息数量,不过PBFT仍然是依靠一个节点一票,少数服从多数的方式来实现拜占庭容错,对于联盟链而言,这个前提没有问题,甚至是优点所在,但是在公有链中,由于节点数目广大,这样就会存在很大的问题。

所以我们公有链中没有采用PBFT算法,一般采用的是工作量证明机制POW,权益证明机制POS和股份授权证明机制DPoS,这样的共识算法来实现一致性。下面对于公有链中的共识机制进行介绍。

二、工作量证明机制PoW

PoW是我们最熟知的一种共识机制,它意味着工作越多收益越大,这里的工作是猜测数值,谁能最快的猜出这个唯一的数字,谁就能做信息公示,或者信息记账。这就是经常听到的挖矿。有了这样一个谁能第一个做出这样的一道题,我们就有记账的权力,那这样的一个工作过程就是寻找nonce随机数的过程。

首先对区块的交易信息做一个哈希值,这样就得到一个256位的字符串,我们把256位的字符串命名为A1,在A1的字符串后面加上nonce(随机数),这个字符串叫做A2,然后对A2字符串做hash运算得到256位的字符串A3,如果A3的前四位都是0,那么这个随机数就找对了,就可以向网络进行提交,从而如果你是第一个提交,这样一个nonce随机数,你就具有了记账的权力,这就是比如我们来看下面的一个例子。

给定一个基本的字符串“hello world”,工作量的要求是在字符串的后面添加一个叫nonce的整数值,对变更后的字符串进行SHA256运算,如果得到的哈希结果以16位进制的哈希结果是以0000开头的则验证通过,那么你如果是第一个获得这样一个nonce随机数并且在网络提交,让大家验证通过,则你就具有了记账的权力。

下面具体看一下PoW协议的进行过程,开始我们讲到的只是挖矿或者工作的一个过程,PoW协议首先第一个向所有的节点广播新的交易,然后每个节点把收到的交易放到区块链的块中,在每一轮中,一个随机选中的节点或者按照一定规则选出来的节点广播它所保有的块,其它节点在验证块中所有的交易正确无误后接受该区块,其它节点将该区块的哈希值放入下一个他们创建的区块中,表示他们承认这个区块的正确性。

刚才我们说到的这样的一个工作或者说挖矿就是选出的节点,挖矿让算力最快或者最幸运的一个节点被选中就可以广播它所保有的或计算的块,其他的节点只能验证正确的,被选中的节点就具有记账的权力,他就可以获得相应的收益。

节点们总是认为最长的链是一个合法的链,并且努力去扩大这条链,如果两个节点同时广播各自挖出的区块,其他节点以自己最先收到的区块为准开始挖矿,但同时会保留另一个区块,所以就会出现一些节点先收到A的区块,并在其上开始挖矿,同时保留着B的区块防止B的区块所在的分支,日后成为较长的分支,直到其中某个分支在下一个工作量证明中变得更长,之前那些在另一条分支上工作的节点,就会转向这条更长的链,平均每十分钟有一个节点找到一个区块,如果两个节点在同一时间找到区块,那么网络将根据后续节点来决定,确定以哪个区块构建总账,从统计学角度而言,一笔交易六个节点,也就是约1个小时后,被认为是明确确认且不可逆的,然而核心开发者认为需要120个区块,约1天的时间才能充分保护网络不受来自潜在更长的新产生的币被花掉的区块链的威胁。

那我们的在生物学上有一个原理叫做不利原理,该原理可以帮助我们解释工作量证明的过程,这个原理中当两只动物有合作的动机时,他们必须很有说服力的向对方表达善意,为了打消对方的疑虑,他们向对方表达友好时,必须附上自己的代价,使得自己背叛对方时不得不付出昂贵的代价。

换句话说表达方式本身必须是对自己不利的,那么这样一种不利原则在历史上会经常发生,比如说在中国的历史上,国家和国家之间签订盟约,为了表示自己对盟约的诚意,经常会互相送一个儿子,有时候是送太子即皇位继承人,去对方国家做人质,在这种情况下为取得信任付出的代价是君主和儿子的亲戚以及十几年的养育。

比特币的工作量证明很好的利用了不利原理解决了一个网络社会里面的问题,产生一个新区快是建立在耗时耗力的巨大代价上,所以当新区快诞生后,某个矿工要么忽视它,继续自己的新区快寻找,要么接受它,在该区块之后继续自己的挖矿。

显然前者是不明智的,因为在比特币网络里,以最长链为合法的链,这个矿工选择忽视而另取炉炤,就不得不说服足够多的其他矿工,沿着他的路线走,相反要是他选择接受,不仅不会付出额外的辛苦,而且照样可以继续进行自己更新区块的一个挖矿,不会再出现你走你的,我走我的,这样一个情况,这样就会形成全网的良性建设,比特币通过不利原理约束了节点的行为。

PoW的优点是完全的去中心化,节点可以自由的进出,但是依赖机器进行运算来获取记账权,资源的消耗相比其他的共识机制要高,可监管性弱,同时共识需要全网共同参与运算,性能的效率比较低,容错性方面可以允许节点的50%出错。从目前来看,PoW共识协议,它的缺点是挖矿会造成大量的资源浪费,而且共识达成的周期比较长,我们知道比特币的区块生成周期,是每10分钟生成一个区块,这个时间非常长,不适合我们在现实社会中很多的应用,这个速度太慢。

三、权益证明机制PoS

它是股权权益证明,它类似股权凭证和投票系统,由持有最多的人公示最终的信息,PoS已经有了很多的变种,最基本的概念就是选择生成新的区块的机会应该和股权的大小成比例,股权可以是投入的资金也可以是预先投入的其他资源,pos算法针对pow算法的缺点来改进的,pos无论什么人买了矿机下载了软件就可以参与,pos要求参与者预先放一些代币或者利益在区块链上。类似将财产储存在银行之中,那么我们来看采用PoS的数字资产,系统根据你的币龄给你分配相应的权益,币龄是你持币数量和时间的乘积。比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000。

这种模式会根据你持有数字货币的量和时间分配给你相应的利息,用户只有将一些利益放进链里,相当于一些押金,用户才会更加关注,做出的决定才会更加理性,同时也可以引入奖惩机制,使节点的运行更加可控,同时更好的防止攻击。

PoS的运作机制大致如下:

第一,加入PoS机制的都是持币人,也就是成为验证者。第二PoS算法在这些验证者里挑一个给予权力生成新的区块,挑选的顺序根据持币的币龄来进行计算,如果在一定时间内,没有生成区块,PoS则会挑选下一个验证者,给予生成新区块的权益,然后以此类推,以区块链中最长的链为准。

PoS和PoW有一个很大的区别,在PoS机制下持币是有利息的,众所周知比特币是有数量限制的,由于有比特币丢失问题,总体来说,比特币是减少的,也就是说比特币是一个通缩的系统,而在PoS模式下引入了币龄的概念,每个币每天产生一币龄。

比如你持有100个币总共持有10天,那么这个时候如果你发现了一个Pos区块,你的币龄就会被清空,没被清空365币龄,将会从区块中获得一定的利息,PoS机制下清空下不会产生通缩的清空,和PoW相比,PoS不需要为了生成新区块的情况下不需要损耗大量的电力,在一定程度上缩短了共识达成的时间,但是缺点是PoS还是需要挖矿,而且PoS中持币越多的收益越大,也就是更多的会产生财富集中,中心化的问题,更多的没有多少财富的中小投资者就会丧失记账权或者说丧失它的权力,由此提到了一个新的共识算法。

四、DPoS

是股份授权证明机制,它是PoS中财富集中的,越多财富的人获得的收益越多,它的发言权也越大,这样一个缺陷进行改进,那么也就是由股东投票选出一个董事会,董事会中的成员才有权进行代理记账,这样就不是钱越多的有越多的记账权,在这里面,股东投票是每一个人或者每一个节点都有投票记账的权力,一个节点一票来选一个董事会。

所以DPoS是PoS的一个改进,它可以确保节点的财富不会因为财富的多少而导致记账权的集中,由于DPoS采用董事会的制度,让董事会的成员进行记账,所以记账的节点数量增加,记账速度提高,采用这个共识算法后,出块的速度可以达到秒级,DPoS可以达到数千的一个数量级,可以满足现在绝大部分实行应用的一个需求。

我们来看DPoS实例是比特股,见证人生成区块,每一个持有比特股的人都可以投票选取见证人,见证人的候选名单每个维护周期(一天更新一次),见证人随机排列,每个见证人的按序有2秒钟的时间生成区块,如果在这两秒的时间内见证人不能生成区块,这个节点故障或者信息故障,那么区块生成权限会交给下一个时间段对应的见证人,DPoS充分的运用了见证人持股人的投票,这样可以用民主的方式来达成共识 。

最后来看一下几种共识机制的比较,POW这个共识机制的算法相对简单,容易实现,节点间无需交换额外的信息即可达成共识,那要破坏系统需要投入极大的成本,我们说PoW有一个51%的攻击,这是指的想要破坏PoW想达成的共识,就必须要有超过整个系统50%的算力才能实现,也就是要有51%的算力掌握在你的手上才能够破坏PoW所达成的共识所记的一个账,那这样的话,如果说系统现有的算力很高的话,超过现有系统51%的算力,这样的话,你所需要付出的代价非常大。

所以从这个角度而言,PoW的共识算法安全性非常高,当然PoW共识算法它的缺点也是很明显,第一个大量的节点要进行毫无意义的随机数的哈希碰撞计算,这种计算仅仅只是为了证明节点算力并没有任何的意义,所以浪费了能源,浪费大量的电力。

第二个,由于PoW的共识需要有大量节点的参与,区块的确认时间难以缩短,如果说你想要缩短区块确认的时间,那就会导致大量孤块的产生,整个系统的安全性难以保证。
第三个容易产生分叉,等待多个确认,就是说我们在正确的记账制度之下,有可能你记了A的节点后,A节点发出区块后,有可能B节点之后的后续节点它们增长更快,那么前面记的A节点的账相当于是一个分叉,那么在更多更长的链。速度比较慢,这样的缺点提出来的,资源消耗很小,不需要计算nonce随机数,它采用谁的币龄长,谁持有的币多就用谁来记账这样的一种方式。

当然它的缺点实现较为复杂,中间的步骤比较多容易产生安全漏洞,对于流量的压力比较大,同时还有一个钱越多的人它的收益越高,他的记账的权力越大,那么有悖于区块链中去中心化的一个理念,DPOS是在针对PoS的缺陷提出来的,它采用的是一个股份授权的机制,资源消耗少,网络资源消耗也少,共识时间少,吞吐量高,可以满足实时的交易的需求,它的实现方法相对来说比较复杂。

看一下在现代比较主流的代表币种中,比特币,达世币,莱特币,以太坊这些都采用的PoW机制,以太坊前面三个阶段采用PoW机制,在后面阶段会逐渐的转向PoS这样的一个机制,而量子链采用的是PoS,而EOS,比特股采用的是DPoS这样的一个共识机制。

下面对共识机制进行一些思考,对于分布式的拜占庭问题,FLP不可能性原理与kap定律已经告诉了我们无解,研究人员即科学家只有从其他地方来寻找求解问题的灵感,其实可以发现真实的人类世界就是以一个分布式系统,比特币的天才之处在于参与了人类的组织方式和运作方式,引入了共识机制,一个交易的成立与否,也就是分布式账本的记账权,由记账的共识机制达成的共识来决定。

共识本身就是一个典型的社会学概念,PoW可以看做是范进中举,范进用了大半辈子来学习一种无用的八股文写作,就像比特币矿工用算力来算题,算的题毫无意义,有朝一日运气好就可以有权打包所有他认可的交易,并且获得相应的奖励。

PoS是用户要预先放入一些利益,很像我们一些现实世界中的股份制,人们把真金白银兑换成股份开始创业,谁的股份多谁的话语权就更大。

DPoS像我们的董事会选举出代表,代表股东的利益,被选出的代表一般来说经验丰富,不但能快速的处理日常事物,同时也能很好的保护股东的利益,而像帕克斯算法,ruft算法,pbft算法,则很像我们生活中的队列,通过相互间的口令达成一致,每排的排头就称作leader,领导,而每排的其他人都以排头为leader目标调整自己的行动。

传统纯正的计算法对分布式系统的拜占庭问题已经无力着手了,所以在分布式系统的研究中,引入了一些社会学的理论和概念,我们可以把每个计算机节点想象成一个单元,而计算机网络就是一个个单元组成的社会,我们可以借鉴人类社会历史上的机制,激励机制来实现分布式网络的一致性,我们有理由相信互联网,或者分布式网路系统与现实的社会运作有着千丝万缕的联系。

你可能感兴趣的:(区块链共识机制)