购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.4 共识机制

共识在很多时候会与一致性放在一起讨论,严谨来讲,两者的含义并不相同。

一致性往往指分布式系统中多个副本对外呈现的数据的状态。如前面提到的顺序一致性、线性一致性,描述了多个节点对数据状态的维护能力。而共识则描述了分布式系统中多个节点之间,彼此对每个状态达成一致结果的过程。因此一致性描述的是结果状态,共识则是一种手段。

区块链通过全民记账来解决信任问题,但是所有节点都参与记录数据,那么最终以谁的记录为准?如何保证所有节点最终都记录一份相同的数据呢?在传统的中心化系统中,由于有权威的中心节点背书,因此可以以中心节点记录的数据为准,其他节点仅简单复制中心节点数据即可,很容易达成共识。然而在区块链这样的去中心化系统中,并不存在中心权威节点,所有节点都对等地参与到共识中来。由于参与的各个节点的自身状态和所处的网络环境不尽相同,而交易信息传递需要时间,并且消息传递本身不可靠,因此,每个节点的身份难以控制,还会出现恶意节点故意阻碍消息传递或者发送不一致的信息给不同的节点,以扰乱整个区块链系统的记账一致性,从而从中获利的情况。因此,区块链系统的记账一致性问题,或者说共识问题,是一个十分关键的问题,它关系着区块链系统的正确性和安全性。

共识机制是区块链的基础,在区块链网络中,每一个节点的地位都是相同的,都有可能产生一个区块,共识机制用来决定哪个节点产生的区块可以上链,共识协议负责维护系统中各个节点数据的一致性。在区块链中使用的共识算法有很多,大致分为如下几类,如图3-8所示。

●选举共识:通过选举一个领导者,由领导者来决定数据的记录,其他节点作为副本来保持与领导者数据的一致。常见的选举共识有Paxos、Raft等。

●证明共识:通过所有节点来解决一个数学难题,谁证明出来题目的解,谁就获得该轮的数据记录权,其他节点数据与其保持同步,但是在下一轮需要重新证明一个新的数学题。常见的证明共识有PoW、PoS等,这也是目前比特币网络和以太坊使用的共识算法。

●随机共识:通过随机时间或者其他因素来决定使用哪个节点的区块,每个节点成为胜出者的可能性相同。常见的随机共识有Algorand、PoET等。

●联盟共识:联盟共识机制的基本思路类似于“董事会决策”,即系统中每个股东节点可以将其持有的股份权益作为选票授予一个代表,由选出的代表根据一定的规则发布新的区块。常见的联盟共识有DPoS等。

●混合共识:混合共识即将多种共识混合在一起使用,兼具多种共识的优点,如以太坊一直以将共识机制转换成PoW+PoS的混合模式为目标,这样的模式解决了PoW能耗的问题,但是同时也具备了PoW高安全性的优点。

图3-8 区块链的共识算法

区块链系统是一个典型的分布式群体智能系统,其通过“民主的”、确定性的共识来达成系统中所有节点的数据一致性。“民主”在于每次每个节点都有可能获得记账权,虽然这种分散的决策权会使共识的速度变慢、效率变低,但是这样会使系统的安全性、稳定性和满意度提高。如果长期由一个指定节点进行记账,即所谓的“集中”,那么该节点的权利过于强大,虽然可以加快共识速度(所有其他节点同步它的数据即可),但是如果该节点作恶,系统会面临巨大的威胁。区块链中的共识都会遵循一个特定的量化的规则进行确定性共识,而不是进行不确定性优化,因为不确定性优化中存在不确定因素以及不可量化等问题。

本章后面将详细介绍目前主流区块链中使用的几种共识算法。

3.4.1 PoW

在公有链中,由于所有人都可以接入区块链网络,因此为了保证网络的安全与稳定,中本聪提出要有经济激励。假定节点背后的人都是有经济头脑的人,不会做成本高于收益的事情。所以在公有链上设计一套机制,使得遵守行为的收益高于违反约定的收益,那么节点就不会表现出拜占庭行为。

根据上面的想法设计出了PoW算法,即工作量证明(Proof of Work)算法,目前大部分公有链的虚拟货币,如比特币、莱特币等都是基于PoW的。在PoW算法中,要求记账节点花费一定的资源来计算出一个难题的解(挖矿过程),然后向网络中其他节点提交自身的工作量证明。要找到这个难题的解需要大量的计算资源和很长的时间,但是验证解是否符合要求却很容易,并且很容易通过调整难题中的部分参数来对难题的难度进行控制,从而将解决难题的时间控制在一个固定的范围内。在PoW中,哪个节点先找到难题解(当前时段工作量最大),该节点就可以生成数据区块,并获得生成区块的经济奖励,在比特币网络中会给生成区块的节点一定的比特币和该区块中所有交易的小费作为奖励。

简单来说,就是能获得多少货币奖励取决于挖矿贡献的有效工作。节点挖矿时间越长,机器性能越好,得到货币奖励的可能性就越大,因为工作量证明无法伪造,有很高的成本,所以只有遵循约定,才能收回成本,获得一定的奖励。

PoW的优点在于巧妙地与奖励机制结合,共同提升了网络的安全性。节点通过挖矿可以得到奖励使节点更加希望维护网络的正常运行,而任何破坏网络的行为都会耗费大量的计算资源与电力资源,从而为之付出很高的经济代价。某些节点想要在PoW的机制下作恶,必须控制网络上51%的算力并发起51%的攻击才能够实现,当网络上的节点数目巨大时,这是很难做到的。

PoW也存在一些缺点:

1)算力是计算机硬件(CPU、GPU等)提供的,计算需要耗费大量的电力,这种对能源的大量消耗与人类追求节能环保的理念相悖。

2)目前算力不仅单纯涉及CPU、GPU,而且发展到FPGA甚至ASIC矿机,而用户也从个人挖矿者发展到大的矿池,算力集中的现象越来越明显,这与去中心化的方向背道而驰。

3)例如比特币网络中,在设计时候,每个区块产生的奖励在每隔21万个区块(大约4年)后减半。随着时间的推移,当挖矿的成本高于收益时,人们对这套算法的积极性会降低,网络安全性也会大大降低。

3.4.2 PoS

PoW机制存在一些弊端,由于节点设备差异大,算力值与节点数逐渐失配,同时,PoW中寻找难题解的方式一般是寻找一个随机数,使区块的哈希值小于某个目标,这个操作会耗费大量的电力资源,除了防范攻击外,几乎没有任何价值。

所以,基于PoW进行改进的权益证明(Proof of Stake,PoS)应运而生。以太坊采用了PoS。PoS共识本质上是采用权益证明来代替PoW中基于哈希算力的工作量证明,由系统中具有最高权益而非最高算力的节点获得区块记账权。PoS根据用户持有的系统代币的数量和时间决定打包出块的概率。在PoS中,能源消耗问题得到了很好的解决,不需要专用的矿机,挖矿的多少与算力大小无关,仅仅与持币的多少与天数相关。当用户打开自己的钱包程序客户端时,就开始进行挖矿操作。

权益体现为节点对特定数量货币的所有权,称为币龄或币天数(coin days)。币龄是特定数量的币与其最后一次交易的时间长度的乘积,每次交易都将消耗掉特定数量的币龄。例如,某人在一笔交易中收到100个币后并持有30天,则获得3000币龄;而其花掉50个币后,则消耗掉1500币龄。显然,采用PoS共识机制的系统在特定时间点上的币龄总数是有限的,长期持币者更倾向于拥有更多币龄,因此币龄可视为其在PoS系统中的权益。

此外,PoW共识过程中各节点挖矿难度相同,而PoS共识过程中挖矿的难度与交易输入的币龄成反比,消耗币龄越多则挖矿难度越低。当上面的用户将这100个币用于挖矿,在发现并打包一个新的区块时,需要清空这3000币龄。在PoS中引入了利息的概念,每被清空365币龄,将会从区块中获得0.05个利息。在这个例子中,利息是3000×0.05/365=0.41个币(根据不同的实现,获得的利息不同,不一定是0.05)。

PoS的主要优点如下。

●节能。不需要大量的电力和能源来挖矿。

●更加去中心化。由于不需要对硬件有过多的要求,因此大规模的矿池也就没有意义,单个用户可以自行挖矿,而且不需要考虑单个用户获得网络上51%的货币量,这样做的成本过高。

PoS是依据权益结余来进行选择的,这样可能会导致首富的权利过大,所以PoS机制的货币信用基础不够牢固,因此许多系统采用PoW+PoS的双重共识机制,通过PoW发行货币,使用PoS维护网络稳定。

3.4.3 DPoS

股份授权证明(Delegated Proof of Stake,DPoS)机制是比特股首先引入的,目前被EOS采用。DPoS共识机制的基本思路类似于“董事会决策”,即系统中每个股东节点可以将其持有的股份权益作为选票授予一个代表,获得票数最多且愿意成为代表的前 N (通常设置为101)个节点将进入“董事会”,按照既定的时间表轮流对交易进行打包结算并签署一个新区块。每个区块被签署之前,必须先确认前一个区块已经被受信任的代表节点所签署。“董事会”的授权代表节点可以从每笔交易的手续费中获得收入,同时要成为授权代表节点必须缴纳一定量的保证金,其金额相当于生产一个区块收入的100倍。授权代表节点必须对其他股东节点负责,如果其错过签署相对应的区块,则股东将会收回选票从而将该节点“踢出”董事会。因此,授权代表节点通常必须保证99%以上的在线时间以实现盈利目标。显然,与PoW共识机制必须信任最高算力节点和PoS共识机制必须信任最高权益节点不同的是,DPoS共识机制中每个节点都能够自主决定其信任的授权节点且由这些节点轮流记账生成新区块,因而大幅减少了参与验证和记账的节点数量,可以实现快速共识验证。

3.4.4 PBFT

PBFT是Practical Byzantine Fault Tolerance的缩写,即实用拜占庭容错。该算法是Miguel Castro(卡斯特罗)和Barbara Liskov(利斯科夫)在1999年提出来的,解决了原始拜占庭容错算法效率不高的问题,使得在实际系统应用中可以解决拜占庭容错问题。

下面通过一个实例来阐述该协议的执行过程。PBFT系统通常假设故障节点数为 f 个,而这个系统的节点总数为3 f +1个。每个客户端请求需要经过5个阶段,在节点中达成一致并执行。图3-9显示了一个简化的PBFT协议通信模式,其中 C 为客户端, N 0 N 3 表示系统节点, N 0 为主节点, N 3 为故障节点,整个协议的基本过程如图3-9所示。

图3-9 PBFT执行流程实例

1.请求阶段

客户端向主节点 N 0 发送请求,并用时间戳来保证客户端请求只执行一次。

2.预准备阶段

主节点 N 0 将从网络收集到需放在新区块内的多个交易排序后,依次分配一个序号,存入列表,并将该列表向全网广播,扩散至 N 1 N 3

3.准备阶段

每个节点接收到交易列表后,根据排序模拟执行这些交易。所有交易执行完后,基于交易结果计算新区块的哈希摘要,并向全网广播。

4.序号确认

如果一个节点收到的2 f f 为可容忍的拜占庭节点数)个其他节点发来的摘要都和自己相等,就向全网广播一条commit消息。

5.响应

如果一个节点收到2 f +1条commit消息,即可提交新区块及其交易到本地的区块链和状态数据库。同时真正地执行区块中的客户端请求,将执行结果返回给客户端,当客户端收到2 f +1个一致的响应后,才能将这个响应作为正确的执行结果。

PBFT算法由于每个副本节点都需要和其他节点进行P2P的共识同步,因此随着节点的增多,性能下降得很快,但是在较少节点的情况下可以有不错的性能。PBFT主要用于联盟链或者私有链,在这种应用场景下一般要求强一致性。目前Hashgraph采用了PBFT。 2zCHezEyKcbBECRAzDMv2mw13XemodUuh1yfcaj28ja0JRCJW9M2Pp04ecZ3M7K5

点击中间区域
呼出菜单
上一章
目录
下一章
×