共识机制

共识与一致性的区别:

  • 共识(Consensus),很多时候会见到与一致性(Consistency)术语放在一起讨论。严谨地讲,两者的含义并不完全相同。 一致性的含义比共识宽泛,在不同场景(基于事务的数据库、分布式系统等)下意义不同。
  • 具体到分布式系统场景下,一致性指的是多个副本对外呈现的状态。如顺序一致性(Sequential
    Consistency)、线性一致性(Linearizability
    Consistency),描述了多节点对数据状态的共同维护能力。而共识,则特指在分布式系统中多个节点之间对某个事情(例如多个事务请求,先执行谁?)达成一致看法的过程。因此,达成某种共识并不意味着就保障了一致性。
  • 实践中,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。
  • 共识算法解决的是分布式系统对某个提案(Proposal),大部分节点达成一致意见的过程。
  • 系统中多个节点最关键地是对多个事件的顺序进行共识,即排序。

共识机制

所谓共识,简单理解就是指大家都达成一致的意思。
区块链系统中,每个节点必须要做的事情就是让自己的账本跟其他节点的账本保持一致。
共识算法其实就是一个规则,每个节点都按照这个规则去确认各自的数据。
一、拜占庭容错技术(Byzantine Fault Tolerance,BFT)
是一类分布式计算领域的容错技术。
发生故障节点被称为拜占庭节点,而正常的节点即为非拜占庭节点。
拜占庭容错系统是一个拥有n台节点的系统,整个系统对于每一个请求,满足以下条件:
  1)所有非拜占庭节点使用相同的输入信息,产生同样的结果;
  2)如果输入的信息正确,那么所有非拜占庭节点必须接收这个信息,并计算相应的结果。
  拜占庭系统普遍采用的假设条件包括:
  1)拜占庭节点的行为可以是任意的,拜占庭节点之间可以共谋;
  2)节点之间的错误是不相关的;
  3)节点之间通过异步网络连接,网络中的消息可能丢失、乱序并延时到达,但大部分协议假设消息在有限的时间里能传达到目的地;
  4)服务器之间传递的信息,第三方可以嗅探到,但是不能篡改、伪造信息的内容和验证信息的完整性。

二、实用拜占庭容错系统(PBFT)
实用拜占庭容错系统(PBFT)降低了拜占庭协议的运行复杂度,从指数级别降低到多项式级别(Polynomial),使拜占庭协议在分布式系统中应用成为可能。

PBFT要求共同维护一个状态,所有节点采取的行动一致。
共识机制
整个协议的基本过程如下:
1)客户端发送请求,**主节点的服务操作。
2)当主节点接收请求后,启动三阶段的协议以向各从节点广播请求。
[2.1]序号分配阶段,主节点给请求赋值一个***n,广播序号分配消息和客户端的请求消息m,并将构造PRE-PREPARE消息给各从节点;
[2.2]交互阶段,从节点接收PRE-PREPARE消息,向其他服务节点广播PREPARE消息;
[2.3]序号确认阶段,各节点对视图内的请求和次序进行验证后,广播COMMIT消息,执行收到的客户端的请求并给客户端以响应。
3)客户端等待来自不同节点的响应,若有m+1个响应相同,则该响应即为运算的结果。

三、Raft协议
Raft阶段主要分为两个,首先是leader选举过程,然后在选举出来的leader基础上进行正常操作,比如日志复制、记账等。

在Raft中,每个结点会处于下面三种状态中的一种:
1.follower:所有结点都以follower的状态开始。如果没收到leader消息则会变成candidate状态
2.candidate:会向其他结点“拉选票”,如果得到大部分的票则成为leader。这个过程就叫做Leader选举(Leader Election)
3.leader:所有对系统的修改都会先经过leader。每个修改都会写一条日志(log entry)。leader收到修改请求后的过程如下,这个过程叫做日志复制(Log Replication):
(1)复制日志到所有follower结点(replicate entry)
(2)大部分结点响应时才提交日志
(3)通知所有follower结点日志已提交
(4)所有follower也提交日志
(5)现在整个系统处于一致的状态

四、工作量证明(Proof of Work,PoW)
PoW就是一份确认工作端做过一定量工作的证明。PoW系统的主要特征是计算的不对称性。工作端需要做一定难度的工作得出一个结果,验证方却很容易通过结果来检查工作端是不是做了相应的工作。
工作量证明最常用的技术原理是散列函数。由于输入哈希h()的任意值n,会对应到一个h(n)结果,而n只要变动一个比特,就会引起雪崩效应,所以几乎无法从h(n)反推回n,因此借由指定查找h(n)的特征,让用户进行大量的穷举运算,就可以达成工作量证明。
工作量证明的步骤如下
1.构建区块,把将要写入区块交易信息组成交易列表,通过Merkle树算法把交易列表信息生成Merkle根哈希。
2.把Merkle根哈希、难度值等相关字段组装成区块头,把区块头80字节数据作为工作量证明的数据输入。
3.不停地变更区块头的随机数,即nonce的数值,变更后不断采用SHA256运算。与目标值做对比,如果小于目标值,则解题成功,工作量证明完成。

五、股权证明(Proof of Stake ,POS)
PoS类似于财产储存在银行,这种模式会根据你持有数字货币的量和时间,分配给你相应的利息。

就是一个根据你持有货币的量和时间,给你发利息的一个制度。

**点点币(Peercoin)**是首先采用权益证明的货币,点点币在SHA256的哈希运算的难度方面引入了币龄的概念,使得难度与交易输入的币龄成反比。

**币龄:**例如,一个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个PoS区块,你的币龄就会被清空为0。你每被清空365币龄,你将会从区块中获得0.05个币的利息(假定利息可理解为年利率5%),那么在这个案例中,利息 = 3000 * 5% / 365 = 0.41个币。

权益证明必须采用某种方法定义任意区块链中的下一合法区块,依据账户结余来选择将导致中心化,例如单个首富成员可能会拥有长久的优势。为此,人们还设计了其他不同的方法来选择下一合法区块。

PoS机制虽然考虑到了PoW的不足,但依据权益结余来选择,会导致首富账户的权力更大,有可能支配记账权。股份授权证明机制(Delegated Proof of Stake,DPoS)的出现正是基于解决PoW机制和PoS机制的这类不足。

六、委任权益证明(Delegated Proof of Stake,DPOS)
比特股(Bitshare)是一类采用DPoS机制的密码货币,它期望通过引入一个技术民主层来减少中心化的负面影响。

比特股引入了见证人这个概念,见证人可以生成区块,每一个持有比特股的人都可以投票选举见证人。得到总同意票数中的前N个(N通常定义为101)候选者可以当选为见证人,当选见证人的个数(N)需满足:至少一半的参与投票者相信N已经充分地去中心化。

见证人的候选名单每个维护周期(1天)更新一次。见证人然后随机排列,每个见证人按序有2秒的权限时间生成区块,若见证人在给定的时间片不能生成区块,区块生成权限交给下一个时间片对应的见证人。DPoS的这种设计使得区块的生成更为快速,也更加节能。

DPoS背后的理性逻辑
1.使权益所有者能够通过投票决定记账人
2.最大化权益所有者的红利
3.最小化保证网络安全的消耗
4.最大化网络的性能
5.最小化运行网络的成本

七、Ripple共识算法
Ripple是一种基于互联网的开源支付协议,可以实现去中心化的货币兑换、支付与清算功能。
在Ripple的网络中,交易由客户端(应用)发起,经过追踪节点(tracking node)或验证节点(validating node)把交易广播到整个网络中。追踪节点的主要功能是分发交易信息以及响应客户端的账本请求。验证节点除包含追踪节点的所有功能外,还能够通过共识协议,在账本中增加新的账本实例数据。
  
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的共识算法中,参与投票节点的身份是事先知道的,因此,算法的效率比PoW等匿名共识算法要高效,交易的确认时间只需几秒钟。当然,这点也决定了该共识算法只适合于权限链(Permissioned chain)的场景。Ripple共识算法的拜占庭容错(BFT)能力为(n-1)/5,即可以容忍整个网络中20%的节点出现拜占庭错误而不影响正确的共识。