跳到主要内容

共识机制与算法

什么是共识机制共识算法

共识是一种让区块链各个节点上的数据保持一致的方法。而各种不同的共识算法,就是为了达到此目的而采用的不同技术方法。“共识机制”的根本目的在于确保区块链各节点上的数据是一致的

在不信任其他人的情况下,如何让网络中的每个参与者都能对一个关于谁拥有什么的普遍“真理”取得共识呢?所有的传统支付系统所依赖的信用模型都有一个提供清算服务的中央权威机构,对每一笔交易进行验证并进行清算处理。区块链不是由中央机构创建的,而是由网络中的每个节点独立组装而成。通过某种方式,网络上的每个节点,对在不安全的网络连接上传输的信息,可以达成一个共同的结论,并且能装配一份与别人完全相同的公共账本。

由于共识算法的存在,各方之间就不需要预先建立信任,因此可以在没有中心化权威机构的情况下创建、实施并评估决策。最终结果就是在没有中介机构的情况下完成各类交易,无论是人对人、人对机器,还是机器对机器。

在一个分布式系统中,所有的进程都有一个初始值。在这种情况下,共识问题(Consensus Problem)就是要寻找一个算法和协议,使得该协议满足以下三个属性: 1)一致性(Agreement):所有的非缺陷进程都必须同意同一个值。 2)正确性(Validity):所有非缺陷的进程所同意的值必须来自非故障进程所提议的值。 3)可结束性(Termination):每个非缺陷的进程必须最终确定一个值。 通常也把满足一致性和正确性称为安全性(Safety),而满足可结束性称为活性(Liveness)。 根据Fischer-Lynch-Paterson的理论(见5.1.3节),在异步通信的分布式系统中,只要有一个拜占庭缺陷的进程,就不可能找到一个共识算法可同时满足上述要求的一致性、正确性和可结束性,也就是说,不能同时满足安全性和活性。

其中的“信任问题”就是解决“拜占庭将军问题”。拜占庭将军问题是区块链平台的共识机制需要解决的一个核心问题。学习共识算法首先要理解拜占庭将军问题。

PBFT:Practical Byzantine Fault Tolerance拜占庭容错算法

在战争的时候,拜占庭军队内所有将军必须达成对于作战计划的共识之后,才可以去攻打敌人的阵营。但是,在军队内很可能存在有叛徒和敌军的间谍扰乱信息传递和军队秩序。这时候,在假设有成员谋反的情况下,其余忠诚的将军如何在不受叛徒的影响下达成共识一致行动成为一个需要解决的问题,这就是拜占庭将军问题。

拜占庭将军问题是对现实世界的模型化,引申到网络当中就是假设由于硬件错误、网络拥塞或断开以及遭到恶意攻击,计算机和网络可能出现不可预料的行为。为了在这种情况下仍然能够达成共识,参与者们必须处理这些失效问题,而解决办法就是共识机。Miguel Castro 和Barbara Liskov在1999年提出实用拜占庭容错算法(PBFT,Practical Byzantine Fault Tolerance),这一算法成为关于该问题最早的解决方案。PBFT是一种状态机副本复制算法,即服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制。每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。应用PBFT算法的各节点相对自治,可以自行采用最可信的结果。这一方案可以最小延迟处理大量的直接点对点(或分布式)信息。这意味着程序员可建立安全和适应性强的私人分布式网络。到目前为止,PBFT算法仍然是最受业界认可的共识机制实现方法。

PoW:Proof of Work,工作量证明机制

工作量证明机制即对于工作量的证明,是生成要加入到区块链中的一笔新的交易信息(即新区块)时必须满足的要求。在基于工作量证明机制构建的区块链中,节点通过计算随机哈希散列的数值解争夺记账权,求得正确的数值解以生成区块的能力是节点算力的具体表现。工作量证明机制具有完全去中心化的优点,在以工作量证明机制为共识的区块链中,节点可以自由进出。大家所熟知的比特币网络就应用工作量证明机制来生成新的区块,并产生新的比特币作为矿工奖励。工作量证明算法解决了对中心化权威机构的需求。这种算法的技术创新点在于,它不要求成员资格,不需要中心化权威机构。所以,工作量证明算法可用于公有链或称无授权链,这类区块链的参与者不必相互认识或信任。这种共识算法要求参与者通过解决复杂计算问题去验证区块。验证过程使用密码学来 完成,这意味着参与者必须找到一个不等式的解,而这需要相当大的算力和能耗。在找到一个解之后,系统立刻就能知道,这个解是否正确。这类似于填字游戏。游戏难度很高,但你一旦完成,马上就可以知道它是否正确。一旦参与者解出方程,这个解就会发布给整个网络。

哈希算法利用任意长度的数据作为输入,生成一个固定长度的确定结果,即输入数据的数字指纹。对于任意特定的输入,结果总是相同的,只要实现了相同哈希算法,都可以轻易计算并验证。加密哈希算法的关键特性是对于两个不同的输入,几乎不可能生成相同的指纹。作为推论,给定一个数字指纹,除了不断尝试各种输入,没有其他办法可以构造一个数据,使其哈希值与给定指纹相同。

工作量证明是一种应对服务与资源滥用,或是拒绝服务攻击的经济对策。一般要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以耗用的时间、设备与能源作为担保成本,来确保服务与资源是被真正的需求使用。这一概念最早由辛西娅·德沃克和莫尼·瑙尔于1993年发表的学术论文中提出,被用于经济领域统计。“工作量证明”一词由马库斯·雅各布森与阿里·尤尔斯在1999年计算机反垃圾邮件系统实现中提出。现在,工作量证明成为以比特币为代表的加密货币或区块链的主流共识机制。

PoS:Proof of Stake,权益证明机制

权益证明(又称持有量证明)是2012年出现的共识机制。与要求验证者执行一定量的计算工作的工作量证明不同,权益证明要求一组验证者轮流对下一个区块进行提议和投票,每个验证者的投票权重取决于其持有权益证明的多少。权益证明的显著优势在于具备安全性,降低集中化的风险以及提升能效.

权益证明机制的运作方式是,当创造一个新区块时,矿工需要创建一个“币权”交易,交易会按照预先设定的比例把一些币发送给矿工本身。权益证明机制根据每个节点拥有代币的比例和时间,依据算法等比例地降低节点的挖矿难度,从而加快了寻找随机数的速度。 PoS也称股权证明,类似于财产储存在银行,这种模式会根据你持有的加密数字货币的量和时间,分配给你相应的利息。能否获得记账权也取决于权益持有量的多少,谁持有的币越多,谁有越大的可能性获得记账权。 简单来说,PoS就是一个根据你持有币的量和时间给你发利息的一个制度,在PoS机制中,有一个名词叫币龄,每个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个PoS区块,你的币龄就会被清空为0。你每被清空365币龄,你将会从区块中获得0.05个币的利息(假定利息可理解为年利率5%),那么在这个案例中,利息=3000×5%/365=0.41个币

DPoS:Delegated Proof of Stake,股份授权证明机制

股份授权证明机制是一种新的保障网络安全的共识机制。它在尝试解决传统的PoW机制和PoS机制问题的同时,还能通过实施科技式的民主抵消中心化所带来的负面效应。

股份授权证明机制与董事会投票类似,该机制拥有一个内置的实时股权人投票系统,就像系统随时都在召开一个永不散场的股东大会,所有股东都在这里投票决定公司决策。基于DPoS机制建立的区块链的去中心化依赖于一定数量的代表,而非全体用户。在这样的区块链中,全体节点投票选举出一定数量的节点代表,由他们来代理全体节点确认区块、维持系统有序运行。同时,区块链中的全体节点具有随时罢免和任命代表的权力。如果必要,全体节点可以通过投票让现任节点代表失去代表资格,重新选举新的代表,实现实时的民主。

燃烧证明机制(Proof of Burn)

开发者证明机制(Proof of Developer)

重要性证明机制(Proof of Important)

Ripple共识算法

Ripple的网络结构 Ripple(瑞波)是一种基于互联网的开源支付协议,可以实现部分去中心化的货币兑换、支付与清算功能。在Ripple的网络中,交易由客户端(应用)发起,经过追踪节点(tracking node)或验证节点(validating node)把交易广播到整个网络中。追踪节点的主要功能是分发交易信息以及响应客户端的账本请求。验证节点除包含追踪节点的所有功能外,还能够通过共识协议,在账本中增加新的账本实例数据

Ripple共识算法 Ripple的共识达成发生在验证节点之间,每个验证节点都预先配置了一份可信任节点名单,称为UNL(Unique Node List)。在名单上的节点可对交易达成进行投票。每隔几秒,Ripple网络将进行如下共识过程。 1)每个验证节点会不断收到从网络发送过来的交易,通过与本地账本数据验证后,不合法的交易直接丢弃,合法的交易将汇总成交易候选集(candidate set)。交易候选集里面还包括之前共识过程无法确认而遗留下来的交易。

2)每个验证节点把自己的交易候选集作为提案发送给其他验证节点。 3)验证节点在收到其他节点发来的提案后,如果不是来自UNL上的节点,则忽略该提案。如果是来自UNL上的节点,就会对比提案中的交易和本地的交易候选集。如果有相同的交易,该交易就获得一票。在一定时间内,当交易获得超过50%的票数时,则该交易进入下一轮。没有超过50%的交易,将留待下一次共识过程去确认。 4)验证节点把超过50%票数的交易作为提案发给其他节点,同时提高所需票数的阈值到60%,重复步骤3、4,直到阈值达到80%。 5)验证节点把经过80%UNL节点确认的交易正式写入本地的账本数据中,称为最后关闭账本(Last Closed Ledger),即账本最后(最新)的状态。 Ripple共识算法的独特之处在于它不是在全网一次性达成共识,而是在UNL子网中达成共识。在Ripple的共识算法中,UNL参与投票节点的身份是事先知道的,因此,算法的效率比PoW等匿名共识算法要高效,交易的确认时间只需几秒。当然,这一点也决定了该共识算法只适合于许可链(Permissioned chain)的场景。同时,Ripple共识算法假设拜占庭节点数少于所有节点数的20%,需要任意两个UNL间重合的节点数至少占最大UNL节点数的20%。另外UNL中的任意一个节点串通作恶概率需要小于20%。 Ripple共识算法的拜占庭容错(BFT)能力为(n-1)/5,即可以容忍整个网络中20%的节点出现拜占庭错误而不影响正确共识。

密码学