区块链共识算法总结(PBFT,Raft,PoW,PoS,DPoS,Ripple)
⽬录
正⽂
近⼏天对区块链中⼏种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进⾏了总结。尽量使⽤简单易懂语⾔,篇幅较⼤,想了解的可以只读每个算法介绍中前边的原理。本篇⽂章主要参考《区块链技术指南》,⾸先表⽰感谢!
---Begin---
区块链架构是⼀种分布式的架构。其部署模式有公共链、联盟链、私有链三种,对应的是去中⼼化分布式系统、部分去中⼼化分布式系统和弱中⼼分布式系统。
在分布式系统中,多个主机通过异步通信⽅式组成⽹络集群。在这样的⼀个异步系统中,需要主机之间进⾏状态复制,以保证每个主机达成⼀致的状态共识。然⽽,异步系统中,可能出现⽆法通信的故障主机,⽽主机的性能可能下降,⽹络可能拥塞,这些可能导致错误信息在系统内传播。因此需要在默认不可靠的异步⽹络中定义容错协议,以确保各主机达成安全可靠的状态共识。
所谓共识,简单理解就是指⼤家都达成⼀致的意思。其实在现实⽣活中,有很多需要达成共识的场景,⽐如开会讨论,双⽅或多⽅签订⼀份合作协议等。⽽在区块链系统中,每个节点必须要做的事情就是让⾃⼰的账本跟其他节点的账本保持⼀致。如果是在传统的软件结构中,这⼏乎就不是问题,因为有⼀个中⼼服务器存在,也就是所谓的主库,其他的从库向主库看齐就⾏了。在实际⽣活中,很多事情⼈们也都是按照这种思路来的,⽐如企业⽼板发布⼀个通知,员⼯照着做。但是区块链是⼀个分布式的对等⽹络结构,在这个结构中没有哪个节点是“⽼⼤”,⼀切都要商量着来。
所以在区块链系统中,如何让每个节点通过⼀个规则将各⾃的数据保持⼀致是⼀个很核⼼的问题,这个问题的解决⽅案就是制定⼀套共识算法,实现不同账本节点上的账本数据的⼀致性和正确性。这就需要借鉴已有的在分布式系统中实现状态共识的算法,确定⽹络中选择记账节点的机制,以及如何保障账本数据在全⽹中形成正确、⼀致的共识。
共识算法其实就是⼀个规则,每个节点都按照这个规则去确认各⾃的数据。我们暂且抛开算法的原理,先来想⼀想在⽣活中我们会如何解决这样⼀个问题:假设⼀群⼈开会,这群⼈中没有⼀个领导或者说⽼⼤,⼤家各抒⼰见,那么最后如何统⼀出⼀个决定出来呢?实际处理的时候,我们⼀般会在某⼀个时间段中选出⼀个⼈,那个⼈负责汇总⼤家的内容,然后发布完整的意见,其他⼈投票表决,每个⼈都有机会来做汇总发表,最后谁的⽀持者多就以谁的最终意见为准。这种思路其实就算是⼀种共识算法了。然⽽在实际过程中,如果⼈数不多并且数量是确定的,还好处理;如果⼈数很多且数量也不固定,那就很难通过这种⽅式投票决定了,效率太低。我们需要通过⼀种机制筛选出最有代表性的⼈,在共识算法中就是筛选出具有代表性的节点。
那如何筛选呢?其实就是设置⼀组条件,就像筛选尖⼦⽣⼀样,给⼀组指标让⼤家来完成,谁能更好地完成指标,谁就能有机会被选上。在区块链系统中,存在着多种这样的筛选⽅案,⽐如PBFT(Practical Byzantine Fault Tolerance,实⽤拜占庭容错算法)、PoW(Proof of Work,⼯作量证明)、PoS(Proof of Stake,权益证明)、DPoS(Delegate Proof of Stake,委托权益证明)、Ripple(瑞波)等,各种不同的算法,其实就是不同的游戏玩法。
⼀.拜占庭容错技术(Byzantine Fault Tolerance,BFT)
拜占庭容错技术(Byzantine Fault Tolerance,BFT)是⼀类分布式计算领域的容错技术。拜占庭假
设是对现实世界的模型化,由于硬件错误、⽹络拥塞或中断以及遭到恶意攻击等原因,计算机和⽹络可能出现不可预料的⾏为。拜占庭容错技术被设计⽤来处理这些异常⾏为,并满⾜所要解决的问题的规范要求。
拜占庭容错技术来源于(猛击!查看该问题)。
在分布式系统中,特别是在区块链⽹络环境中,也和拜占庭将军的环境类似,有运⾏正常的服务器(类似忠诚的拜占庭将军),有故障的服务器,还有破坏者的服务器(类似叛变的拜占庭将军)。共识算法的核⼼是在正常的节点间形成对⽹络状态的共识。
通常,这些发⽣故障节点被称为拜占庭节点,⽽正常的节点即为⾮拜占庭节点。
拜占庭容错系统是⼀个拥有n台节点的系统,整个系统对于每⼀个请求,满⾜以下条件:
1)所有⾮拜占庭节点使⽤相同的输⼊信息,产⽣同样的结果;
2)如果输⼊的信息正确,那么所有⾮拜占庭节点必须接收这个信息,并计算相应的结果。
拜占庭系统普遍采⽤的假设条件包括:
1)拜占庭节点的⾏为可以是任意的,拜占庭节点之间可以共谋;
2)节点之间的错误是不相关的;
3)节点之间通过异步⽹络连接,⽹络中的消息可能丢失、乱序并延时到达,但⼤部分协议假设消息在有限的时间⾥能传达到⽬的地;
4)服务器之间传递的信息,第三⽅可以嗅探到,但是不能篡改、伪造信息的内容和验证信息的完整性。
原始的拜占庭容错系统由于需要展⽰其理论上的可⾏性⽽缺乏实⽤性。另外,还需要额外的时钟同步机制⽀持,算法的复杂度也是随节点增加⽽指数级增加。
⼆.PBFT:Practical Byzantine Fault Tolerance,实⽤拜占庭容错算法。
实⽤拜占庭容错系统(PBFT)降低了拜占庭协议的运⾏复杂度,从指数级别降低到多项式级别(Polynomial),使拜占庭协议在分布式系统中应⽤成为可能。
PBFT是⼀种状态机副本复制算法,即服务作为状态机进⾏建模,状态机在分布式系统的不同节点进⾏副本复制。每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。将所有的副本组成的集合使⽤⼤写字母R表⽰,使⽤0到|R|-1的整数表⽰每⼀个副本。为了描述⽅便,通常假设故障节点数为m个,整个服务节点数为|R|=3m+1个,这⾥m是有可能失效的副本的最⼤个数。尽管可以存在多
于3m+1个副本,但是额外的副本除了降低性能之外不能提⾼可靠性。
PBFT要求共同维护⼀个状态,所有节点采取的⾏动⼀致。为此,需要运⾏三类基本协议,包括⼀致性协议、检查点协议和视图更换协议。我们主要关注⽀持系统⽇常运⾏的⼀致性协议。⼀致性协议⾄少包含若⼲个阶段:请求(request)、序号分配(pre-prepare)和响应(reply)。根据协议设计的不同,可能包含相互交互(prepare),序号确认(commit)等阶段。
PBFT协议通信模式
上图为PBFT协议通信模式,每⼀个客户端的请求需要经过5个阶段,通过采⽤两次两两交互的⽅式在服务器达成⼀致之后再执⾏客户端的请求。由于客户端不能从服务器端获得任何服务器运⾏状态的信息,PBFT中主节点是否发⽣错误只能由服务器监测。如果服务器在⼀段时间内都不能完成客户端的请求,则会触发视图更换协议。其中C为客户端,N0~N3表⽰服务节点,特别的,N0为主节点,N3为故障节点。整个协议的基本过程如下:
1)客户端发送请求,激活主节点的服务操作。
2)当主节点接收请求后,启动三阶段的协议以向各从节点⼴播请求。
[2.1]序号分配阶段,主节点给请求赋值⼀个序列号n,⼴播序号分配消息和客户端的请求消息m,并将构造PRE-PREPARE消息给各从节点;
[2.2]交互阶段,从节点接收PRE-PREPARE消息,向其他服务节点⼴播PREPARE消息;
[2.3]序号确认阶段,各节点对视图内的请求和次序进⾏验证后,⼴播COMMIT消息,执⾏收到的客户端的请求并给客户端以响应。
3)客户端等待来⾃不同节点的响应,若有m+1个响应相同,则该响应即为运算的结果。
PBFT在很多场景都有应⽤,在区块链场景中,⼀般适合于对强⼀致性有要求的私有链和联盟链场景。例如,在IBM主导的区块链超级账本项⽬中,PBFT是⼀个可选的共识协议。在Hyperledger的Fabric项⽬中,共识模块被设计成可插拔的模块,⽀持像PBFT、Raft等共识算法。
三.Raft协议。
在这些分布式系统的实⽤场景下,其假设条件不需要考虑拜占庭故障,⽽只是处理⼀般的死机故障。在这种情况下,采⽤Paxos等协议会更加⾼效。Paxos是Lamport设计的保持分布式系统⼀致性的协议。但由于Paxos⾮常复杂,⽐较难以理解,因此后来出现了各种不同的实现和变种。Raft是由Stanford提出的⼀种更易理解的⼀致性算法,意在取代⽬前⼴为使⽤的Paxos算法。⽬前,在各种主流语⾔中都有了⼀些开源实现,⽐如本⽂中将使⽤的基于JGroups的Raft协议实现。关于Raft的原理,强烈推荐(猛击!查看该视频)。
Raft最初是⼀个⽤于管理复制⽇志的共识算法,它是⼀个为真实世界应⽤建⽴的协议,主要注重协议的落地性和可理解性。Raft是在⾮拜占庭故障下达成共识的强⼀致协议。
在区块链系统中,使⽤Raft实现记账共识的过程可以描述如下:⾸先选举⼀个leader,接着赋予leader完全的权⼒管理记账。leader从客户端接收记账请求,完成记账操作,⽣成区块,并复制到其他记账节点。有了leader简化了记账操作的管理。例如,leader能够决定是否接受新的交易记录项⽽
⽆需考虑其他的记账节点,leader可能失效或与其他节点失去联系,这时,系统就会选出新的leader。
在Raft中,每个结点会处于下⾯三种状态中的⼀种:
follower:所有结点都以follower的状态开始。如果没收到leader消息则会变成candidate状态
candidate:会向其他结点“拉选票”,如果得到⼤部分的票则成为leader。这个过程就叫做Leader选举(Leader Election)
leader:所有对系统的修改都会先经过leader。每个修改都会写⼀条⽇志(log entry)。leader收到修改请求后的过程如下,这个过程叫做⽇志复制(Log Replication):复制⽇志到所有follower结点(replicate entry)
⼤部分结点响应时才提交⽇志
通知所有follower结点⽇志已提交
所有follower也提交⽇志
现在整个系统处于⼀致的状态
Raft阶段主要分为两个,⾸先是leader选举过程,然后在选举出来的leader基础上进⾏正常操作,⽐如⽇志复制、记账等。
1.Leader Election
当follower在选举超时时间内未收到leader的⼼跳消息,则转换为candidate状态。为了避免选举冲突,这个超时时间是⼀个150~300ms之间的随机数。
⼀般⽽⾔,在Raft系统中:
1)任何⼀个服务器都可以成为⼀个候选者candidate,它向其他服务器follower发出要求选举⾃⼰的请求。
2)其他服务器同意了,发出OK。注意,如果在这个过程中,有⼀个follower宕机,没有收到请求选举的要求,此时候选者可以⾃⼰选⾃⼰,只要达到N/2+1的⼤多数票,候选⼈还是可以成为leader的。
3)这样这个候选者就成为了leader领导⼈,它可以向选民也就是follower发出指令,⽐如进⾏记账。
4)以后通过⼼跳进⾏记账的通知。
5)⼀旦这个leader崩溃了,那么follower中有⼀个成为候选者,并发出邀票选举。
6)follower同意后,其成为leader,继续承担记账等指导⼯作。
2.Log Replication
Raft的记账过程按以下步骤完成:
1)假设leader领导⼈已经选出,这时客户端发出增加⼀个⽇志的要求;
2)leader要求follower遵从他的指令,都将这个新的⽇志内容追加到他们各⾃⽇志中;
3)⼤多数follower服务器将交易记录写⼊账本后,确认追加成功,发出确认成功信息;
4)在下⼀个⼼跳中,leader会通知所有follower更新确认的项⽬。
对于每个新的交易记录,重复上述过程。
在这⼀过程中,若发⽣⽹络通信故障,使得leader不能访问⼤多数follower了,那么leader只能正常更新它能访问的那些follower服务器。⽽⼤多数的服务器follower因为没有了leader,他们将重新选举⼀个候选者作为leader,然后这个leader作为代表与外界打交道,如果外界要求其添加新的交易记录,这个新的leader就按上述步骤通知⼤多数follower。当⽹络通信恢复,原先的leader就变成follower,
在失联阶段,这个⽼leader的任何更新都不能算确认,必须全部回滚,接收新的leader的新的更新。
四.POW:Proof of Work,⼯作证明。
从去中⼼化账本系统的⾓度看,每个加⼊这个系统的节点都要保存⼀份完整的账本,但每个节点却不能同时记账,因为节点处于不同的环境,接收到不同的信息,如果同时记账的话,必然会导致账本的不⼀致,造成混乱。因此,需要有共识来达成哪个节点有权记账。⽐特币区块链通过竞争记账的⽅式解决去中⼼化的记账系统的⼀致性问题, 即以每个节点的计算能⼒即“算⼒”来竞争记账权的机制。
在⽐特币系统中,⼤约每10分钟进⾏⼀轮算⼒竞赛,竞赛的胜利者,就获得⼀次记账的权⼒,并向其他节点同步新增账本信息。然⽽,在⼀个去中⼼化的系统中,谁有权判定竞争的结果呢?⽐特币系统是通过⼀个称为“⼯作量证明”(Proof of Work,PoW)的机制完成的。
简单地说,PoW就是⼀份确认⼯作端做过⼀定量⼯作的证明。PoW系统的主要特征是计算的不对称性。⼯作端需要做⼀定难度的⼯作得出⼀个结果,验证⽅却很容易通过结果来检查⼯作端是不是做了相应的⼯作。
举个例⼦,给定字符串“blockchain”,我们给出的⼯作量要求是,可以在这个字符串后⾯连接⼀个称为nonce的整数值串,对连接后的字符串进⾏SHA256哈希运算,如果得到的哈希结果(以⼗六进制的
形式表⽰)是以若⼲个0开头的,则验证通过。为了达到这个⼯作量证明的⽬标,我们需要不停地递增nonce值,对得到的新字符串进⾏SHA256哈希运算。按照这个规则,需要经过2688次计算才能找到前3位均为0的哈希值,⽽要找到前6位均为0的哈希值,则需进⾏620969次计算。
1 blockchain1 → 4bfb943cba9fb9926df93f33c17d64b378d56714e8a29c6ba8bdc9690cea8e27
2 blockchain2 → 01181212a283e760929f6b1628d903127c65e6fb5a9ad7fe94b790e699269221 ……
3 blockchain515 → 0074448bea8027bebd6333d3aa12fd11641e051911c5bab661a9b849b83958a7……
4 blockchain2688 → 0009b257eb8cf9eba179ab2be74d446fa1c59f0adfa8814260f52ae0016dd50f……
5 blockchain48851: 00000b3d96b4db1a976d3a69829aabef8bafa35ab5871e084211a16d3a4f385c……
6 blockchain6200969: 000000db7fa334aef754b51792cff6c880cd286c5f490d5cf73f658d9576d424
通过上⾯这个计算特定SHA256运算结果的⽰例,我们对PoW机制有了⼀个初步的理解。对于特定字符串后接随机nonce值所构成的串,要找到这样的nonce值,满⾜前n位均为0的SHA256值,需要多次进⾏哈希值的计算。⼀般来说,n值越⼤,需要完成的哈希计算量也越⼤。由于哈希值的伪随机特性,要寻找4个前导0的哈希值,预期⼤概要进⾏216次尝试,这个数学期望的计算次数,就是所要求的“⼯作量”。
⽐特币⽹络中任何⼀个节点,如果想⽣成⼀个新的区块并写⼊区块链,必须解出⽐特币⽹络出的PoW问题。这道题关键的3个要素是⼯作量证明函数、区块及难度值。⼯作量证明函数是这道题的计算⽅法,区块决定了这道题的输⼊数据,难度值决定了这道题所需要的计算量。
1.⼯作量证明函数及区块数据计算过程
⽐特币系统中使⽤的⼯作量证明函数就是(猛击!查看该问题)。
⽐特币区块结构如下图所⽰:
⽐特币的区块由区块头及该区块所包含的交易列表组成。区块头的⼤⼩为80字节,由4字节的版本号、32字节的上⼀个区块的哈希值、32字节的Merkle根哈希值、4字节的时间戳(当前时间)、4字节的当前难度值、4字节的随机数组成。区块包含的交易列表则附加在区块头后⾯,其中的第⼀笔交易是coinba交易,这是⼀笔为了让矿⼯获得奖励及⼿续费的特殊交易。
拥有80字节固定长度的区块头,就是⽤于⽐特币⼯作量证明的输⼊字符串。因此,为了使区块头能体现区块所包含的所有交易,在区块的构造过程中,需要将该区块要包含的交易列表,通过(猛击)
⽣成Merkle根哈希值,并以此作为交易列表的哈希值存到区块头中。其中Merkle树的算法图解如下图所⽰。
上图展⽰了⼀个具有4个交易记录的Merkle树的根哈希值的计算过程。⾸先以这4个交易作为叶⼦结点构造⼀棵完全⼆叉树,然后通过哈希值的计算,将这棵⼆叉树转化为Merkle树。
⾸先对4个交易记录:Txa~Txc,分别计算各⾃的哈希值H A~H C,然后计算两个中间节点的哈希值H AB=Hash(H A+H B)和H CD=Hash(H C+H D),最后计算出根节点的哈希值
H ABCD=Hash(H AB+H CD)。
⽽构造出来的简化的区块链结构如上图所⽰。We find that: 所有在给定时间范围需要记录的交易信息被构造成⼀个Merkle树,区块中包含了指向这个Merkle树的哈希指针,关联了与该区块相关的交易数据,同时,区块中也包含了指向前⼀区块的哈希指针,使得记录了不同交易的单个区块被关联起来,形成区块链。
2.挖矿难度
难度值是⽐特币系统中的节点在⽣成区块时的重要参考指标,它决定了节点⼤约需要经过多少次哈希运算才能产⽣⼀个合法的区块。⽐特币的区块⼤约每10分钟⽣成⼀个,如果要在不同的全⽹算⼒条件下,新区块的产⽣都基本保持这个速率,难度值必须根据全⽹算⼒的变化进⾏调整。简单地说,难度值被设定在⽆论节点计算能⼒如何,新区块产⽣速率都保持在每10分钟⼀个。
难度的调整是在每个完整节点中独⽴⾃动发⽣的。每2016个区块,所有节点都会按统⼀的公式⾃动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟,即两周,
是按每10分钟⼀个区块的产⽣速率计算出的总时长)⽐较得出的,根据实际时长与期望时长的⽐值,进⾏相应调整(或变难或变易)。也就是说,如果区块产⽣的速率⽐10分钟快则增加难度,⽐10分钟慢则降低难度。
这个公式可以总结为:新难度值=旧难度值×(过去2016个区块花费时长/20160分钟)
⼯作量证明需要有⼀个⽬标值。⽐特币⼯作量证明的⽬标值(Target)的计算公式:⽬标值=最⼤⽬标值/难度值
其中最⼤⽬标值为⼀个恒定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
⽬标值的⼤⼩与难度值成反⽐。⽐特币⼯作量证明的达成就是矿⼯计算出来的区块哈希值必须⼩于⽬标值。
3.PoW过程
⽐特币PoW的过程,可以简单理解成就是将不同的nonce值作为输⼊,尝试进⾏SHA256哈希运算,找出满⾜给定数量前导0的哈希值的过程。⽽要求的前导0的个数越多,代表难度越⼤。⽐特币节点求解⼯作量证明问题的步骤⼤致归纳如下:
1)⽣成铸币交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle树算法⽣成Merkle根哈希;
2)把Merkle根哈希及其他相关字段组装成区块头,将区块头的80字节数据作为⼯作量证明的输⼊;
3)不停地变更区块头中的随机数,即nonce的数值,并对每次变更后的区块头做双重SHA256运算(即SHA256(SHA256(Block_Header))),将结果值与当前⽹络的⽬标值做对⽐,如果⼩于⽬标值,则解题成功,⼯作量证明完成。
⽐特币的⼯作量证明,就是俗称“挖矿”所做的主要⼯作。
4.PoW能否解决拜占庭将军问题
关于⽐特币PoW共识机制能否解决拜占庭将军问题⼀直在业界有争议。2015年,Juan Garay对⽐特币的PoW共识算法进⾏了正式的分析,得出的结论是⽐特币的PoW共识算法是⼀种概率性的拜占庭协议(Probabilistic BA)。Garay对⽐特币共识协议的两个重要属性分析如下。
1)⼀致性(Agreement)
在不诚实节点总算⼒⼩于50%的情况下,同时每轮同步区块⽣成的⼏率很少的情况下,诚实的节点
具有相同的区块的概率很⾼。⽤数学的严格语⾔说应该是:当任意两个诚实节点的本地链条截取K个节点,两条剩下的链条的头区块不相同的概率随着K的增加呈指数型递减。
2)正确性(Validity)
⼤多数的区块必须由诚实节点提供。严格来说,当不诚实算⼒⾮常⼩的时候,才能使⼤多数区块由诚实节点提供。
因此可以看到,当不诚实的算⼒⼩于⽹络总算⼒的50%时,同时挖矿难度⽐较⾼,在⼤约10分钟出⼀个区块情况下,⽐特币⽹络达到⼀致性的概念会随确认区块的数⽬增多⽽呈指数型增加。但当不诚实算⼒具⼀定规模,甚⾄不⽤接近50%的时候,⽐特币的共识算法并不能保证正确性,也就是,不能保证⼤多数的区块由诚实节点来提供。
因此,我们可以看到,⽐特币的共识算法不适合于私有链和联盟链。其原因⾸先是它是⼀个最终⼀致性共识算法,不是⼀个强⼀致性共识算法。第⼆个原因是其共识效率低。提供共识效率⼜会牺牲共识协议的安全性。另外,⽐特币通过巧妙的矿⼯奖励机制来提升⽹络的安全性。矿⼯挖矿获得⽐特币奖励以及记账所得的交易费⽤使得矿⼯更希望维护⽹络的正常运⾏,⽽任何破坏⽹络的⾮诚信⾏为都会损害矿⼯⾃⾝的利益。因此,即使有些⽐特币矿池具备强⼤的算⼒,它们都没有作恶的动机,反⽽有动⼒维护⽐特币的正常运⾏,因为这和它们的切实利益相关。
PoW机制存在明显的弊端。⼀⽅⾯,PoW的前提是,节点和算⼒是均匀分布的,因为通过CPU的计算能⼒来进⾏投票,拥有钱包(节点)数和算⼒值应该是⼤致匹配的,然⽽随着⼈们将CPU挖矿逐渐升级到GPU、FPGA,直⾄ASIC矿机挖矿,节点数和算⼒值也渐渐失配。另⼀⽅⾯,PoW太浪费了。⽐特币⽹络每秒可完成数百万亿次SHA256计算,但这些计算除了使恶意攻击者不能轻易地伪装成⼏百万个节点和打垮⽐特币⽹络,并没有更多实际或科学价值。当然,相对于允许世界上任何⼀个⼈在瞬间就能通过去中⼼化和半匿名的全球货币⽹络,给其他⼈⼏乎没有⼿续费地转账所带来的巨⼤好处,它的浪费也许只算是很⼩的代价。
有鉴于此,⼈们提出了权益证明(Proof of Stake,PoS)。
五.POS:Proof of Stake,股权证明。
PoS类似于财产储存在银⾏,这种模式会根据你持有数字货币的量和时间,分配给你相应的利息。
简单来说,就是⼀个根据你持有货币的量和时间,给你发利息的⼀个制度,在股权证明PoS模式下,有⼀个名词叫币龄,每个币每天产⽣1币龄,⽐如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了⼀个PoS区块,你的币龄就会被清空为0。你每被清空365币龄,你将会从区块中获得0.05个币的利息(假定利息可理解为年利率5%),那么在这个案例中,利息 = 3000 * 5% / 365 = 0.41个币,这下就很有意思了,持币有利息。
点点币(Peercoin)是⾸先采⽤权益证明的货币,点点币在SHA256的哈希运算的难度⽅⾯引⼊了币龄的概念,使得难度与交易输⼊的币龄成反⽐。在点点币中,币龄被定义为币的数量与币所拥有的天数的乘积,这使得币龄能够反映交易时刻⽤户所拥有的货币数量。实际上,点点币的权益证明机制结合了随机化与币龄的概念,未使⽤⾄少30天的币可以参与竞争下⼀区块,越久和越⼤的币集有更⼤的可能去签名下⼀区块。
然⽽,⼀旦币的权益被⽤于签名⼀个区块,则币龄将清为零,这样必须等待⾄少30⽇才能签署另⼀区块。同时,为防⽌⾮常⽼或⾮常⼤的权益控制区块链,寻找下⼀区块的最⼤概率在90天后达到最⼤值,这⼀过程保护了⽹络,并随着时间逐渐⽣成新的币⽽⽆需消耗⼤量的计算能⼒。点点币的开发者声称这将使得恶意攻击变得困难,因为没有中⼼化的挖矿池需求,⽽且购买半数以上的币的开销似乎超过获得51%的⼯作量证明的哈希计算能⼒。
权益证明必须采⽤某种⽅法定义任意区块链中的下⼀合法区块,依据账户结余来选择将导致中⼼化,例如单个⾸富成员可能会拥有长久的优势。为此,⼈们还设计了其他不同的⽅法来选择下⼀合法区块。
PoS机制虽然考虑到了PoW的不⾜,但依据权益结余来选择,会导致⾸富账户的权⼒更⼤,有可能⽀配记账权。股份授权证明机制(Delegated Proof of Stake,DPoS)的出现正是
基于解决PoW机制和PoS机制的这类不⾜。
六.DPOS:Delegated Proof of Stake,委任权益证明
⽐特股(Bitshare)是⼀类采⽤DPoS机制的密码货币,它期望通过引⼊⼀个技术民主层来减少中⼼化的负⾯影响。
⽐特股的DPoS机制,中⽂名叫做股份授权证明机制(⼜称受托⼈机制),它的原理是让每⼀个持有⽐特股的⼈进⾏投票,由此产⽣101位代表 , 我们可以将其理解为101个超级节点或者矿池,⽽这101个超级节点彼此的权利是完全相等的。从某种⾓度来看,DPOS有点像是议会制度或⼈民代表⼤会制度。如果代表不能履⾏他们的职责(当轮到他们时,没能⽣成区块),他们会被除名,⽹络会选出新的超级节点来取代他们。DPOS的出现最主要还是因为矿机的产⽣,⼤量的算⼒在不了解也不关⼼⽐特币的⼈⾝上,类似演唱会的黄⽜,⼤量囤票⽽丝毫不关⼼演唱会的内容。
⽐特股引⼊了见证⼈这个概念,见证⼈可以⽣成区块,每⼀个持有⽐特股的⼈都可以投票选举见证⼈。得到总同意票数中的前N个(N通常定义为101)候选者可以当选为见证⼈,当选见证⼈的个数(N)需满⾜:⾄少⼀半的参与投票者相信N已经充分地去中⼼化。
见证⼈的候选名单每个维护周期(1天)更新⼀次。见证⼈然后随机排列,每个见证⼈按序有2秒的
权限时间⽣成区块,若见证⼈在给定的时间⽚不能⽣成区块,区块⽣成权限交给下⼀个时间⽚对应的见证⼈。DPoS的这种设计使得区块的⽣成更为快速,也更加节能。
DPoS充分利⽤了持股⼈的投票,以公平民主的⽅式达成共识,他们投票选出的N个见证⼈,可以视为N个矿池,⽽这N个矿池彼此的权利是完全相等的。持股⼈可以随时通过投票更换这些见证⼈(矿池),只要他们提供的算⼒不稳定,计算机宕机,或者试图利⽤⼿中的权⼒作恶。
⽐特股还设计了另外⼀类竞选,代表竞选。选出的代表拥有提出改变⽹络参数的特权,包括交易费⽤、区块⼤⼩、见证⼈费⽤和区块区间。若⼤多数代表同意所提出的改变,持股⼈有两周的审查期,这期间可以罢免代表并废⽌所提出的改变。这⼀设计确保代表技术上没有直接修改参数的权利以及所有的⽹络参数的改变最终需得到持股⼈的同意。
七.Ripple共识算法。
Ripple(瑞波)是⼀种基于互联⽹的开源⽀付协议,可以实现去中⼼化的货币兑换、⽀付与清算功能。在Ripple的⽹络中,交易由客户端(应⽤)发起,经过追踪节点(tracking node)或验证节点(validating node)把交易⼴播到整个⽹络中。追踪节点的主要功能是分发交易信息以及响应客户端的账本请求。验证节点除包含追踪节点的所有功能外,还能够通过共识协议,在账本中增加新的账本实例数据。
Ripple的共识达成发⽣在验证节点之间,每个验证节点都预先配置了⼀份可信任节点名单,称为UNL(Unique Node List)。在名单上的节点可对交易达成进⾏投票。每隔⼏
秒,Ripple⽹络将进⾏如下共识过程:
1)每个验证节点会不断收到从⽹络发送过来的交易,通过与本地账本数据验证后,不合法的交易直接丢弃,合法的交易将汇总成交易候选集(candidate t)。交易候选集⾥⾯还包括之前共识过程⽆法确认⽽遗留下来的交易。
2)每个验证节点把⾃⼰的交易候选集作为提案发送给其他验证节点。
3)验证节点在收到其他节点发来的提案后,如果不是来⾃UNL上的节点,则忽略该提案;如果是来⾃UNL上的节点,就会对⽐提案中的交易和本地的交易候选集,如果有相同的交易,该交易就获得⼀票。在⼀定时间内,当交易获得超过50%的票数时,则该交易进⼊下⼀轮。没有超过50%的交易,将留待下⼀次共识过程去确认。
4)验证节点把超过50%票数的交易作为提案发给其他节点,同时提⾼所需票数的阈值到60%,重复步骤3)、步骤4),直到阈值达到80%。
5)验证节点把经过80%UNL节点确认的交易正式写⼊本地的账本数据中,称为最后关闭账本(Last
Clod Ledger),即账本最后(最新)的状态。
Ripple共识过程节点交互⽰意图
Ripple共识算法流程
在Ripple的共识算法中,参与投票节点的⾝份是事先知道的,因此,算法的效率⽐PoW等匿名共识算法要⾼效,交易的确认时间只需⼏秒钟。当然,这点也决定了该共识算法只适合于权限链(Permissioned chain)的场景。Ripple共识算法的拜占庭容错(BFT)能⼒为(n-1)/5,即可以容忍整个⽹络中20%的节点出现拜占庭错误⽽不影响正确的共识。
以上主要是⽬前主流的共识算法。但说起哪种共识机制更好或更具替代作⽤?我认为DPOS来单独替代POW,POS或者POW+POS不太可能,毕竟存在即合理。每种算法都在特定的时间段、场景下具有各⾃的意义,⽆论是技术上,还是业务上。如果跳出技术者的⾓度,更多结合政治与经济的思考⽅式在⾥⾯,或许还会不断出现更多的共识机制。
对于算法的选择,⼀句话总结如下:
“ 在区块链⽹络中,由于应⽤场景的不同,所设计的⽬标各异,不同的区块链系统采⽤了不同的共识算法。⼀般来说,在私有链和联盟链情况下,对⼀致性、正确性有很强的要求。⼀般来说要采⽤强⼀致性的共识算法。⽽在公有链情况下,对⼀致性和正确性通常没法做到百分之百,通常采⽤最终⼀致性(Eventual Consistency)的共识算法。”
通俗点就是:共识算法的选择与应⽤场景⾼度相关,可信环境使⽤paxos 或者raft,带许可的联盟可使⽤pbft ,⾮许可链可以是pow,pos,ripple共识等,根据对⼿⽅信任度分级,⾃