区块链的共识算法

讲到区块链的共识,有必要先讲一下拜占庭将军问题。

在古老的罗马帝国,有很多军队,但是这些军队分隔很远,将军与将军之间只能靠信差传递消息。当发生战争的时候,拜占庭军队内所有将军必须达成一致的共识,看是否有赢的机会,再决定要不要去攻打敌人的阵营。但是,在军队内可能存在叛徒或敌军的间谍,左右将军们的决定,并扰乱整体军队的秩序。将军们采用投票的策略来决定是进攻还是撤退,也就是说如果多数人决定进攻,就冲上去,如果多数人决定撤退,就撤退。

这时候,在已知有成员谋反的情况下(或者是有奸细的情况下,他们乱投票,或者擅自修改军令),其余忠诚的将军在不受叛徒的影响下如何达成一致的共识呢?这就出现了拜占庭的将军问题。

在拜占庭将军的战争中,叛徒可以任意行动以达到以下目标:欺骗某些将军采取进攻行动,实际应该撤退的;促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;迷惑某些将军,使他们无法做出决定。如果叛徒达到了这些目的之一,则任何攻击行动的结果都注定要失败的,只有完全达成一致的努力才能获得胜利。

所以,拜占庭将军是一个分布式系统中的共识问题,也是一个分布式容错系统的问题。拜占庭将军问题不是说要让将军达成进攻的决定,而是让所有忠诚将军达成共识,要么全都进攻,要么全都撤退,不至于被敌方各个攻破。

目前拜占庭将军问题的经典解法是实用性拜占庭容错系统PBFT,不过这需要满足忠诚将军的人数要远远超过叛徒或间谍的人数,抽象化的前提是满足N ≥ 3f+1,其中f是叛徒或间谍的人数,N是所有将军的人数。

那区块链在去中心化环境下,为了防止分布式账本作恶,保证分布式账本数据的可靠性,需要怎么实现共识呢?想想拜占庭将军问题,根本是通过抽象化数学化的共识算法解决的。其实,各种区块链都一样,需要通过抽象化数学化的共识算法,实现和驱动区块链的共识机制,保障区块链系统的安全性和适应性。

目前,区块链中常见的共识算法有七种:POW、POS、DPOS、POA、PBFT、RAFT、DBFT。

POW:工作量证明。在比特币系统中,得到合理的 Block Hash 需要经过大量尝试计算。这种工作量证明的形式,在我们日常生活中也十分常见。比如驾照,能拿到驾照,说明你已经进行过为期几个月甚至几年的练车和考试。

POS:权益证明。POS 是一个根据持有数字货币数量和时间来分配相应利息的制度。基于权益证明共识的区块链系统中,参与者的角色是验证者,只需要投资系统的数字货币并在特定时间内验证自己是否为下一区块创造者,即可完成下一区块的创建。

DPOS:授权权益证明。DPOS 从某种角度看,有点像议会制度或人民代表大会制度。DPOS 最早出现在比特股中,又称受托人机制,它的原理是让每一个持有比特股的人进行投票,由此产生代表,代其行使其权益 。DPOS通过信任少量的诚信节点,可以去除区块签名过程中不必要的步骤。

POA:权威证明。POA 的基本思路是选出中央权威来统一大家的状态。POA 共识机制下,每当产生交易,节点之间不再互相转发,而是统一发送到 中央权威 手中,由它来验证交易。

PBFT:实用拜占庭容错。PBFT 是一种状态机副本复制算法,状态机在分布式系统的不同节点进行副本复制。将所有的副本组成的集合使用大写字母 R 表示,使用 0 到 |R|-1 的整数表示每一个副本。其需要满足 |R| >= 3f+1,这里 f 是有可能失效的副本的最大个数。

RAFT:一致性共识算法。RAFT 算法包含三种角色,分别是:跟随者(follower),候选人(candidate)和领导者(leader)。RAFT 算法主要有两个过程:一个过程是领导者选举,另一个过程是日志复制,其中日志复制过程会分为记录日志和提交数据两个阶段。

DBFT:授权拜占庭容错。DBFT是一种通过代理投票来实现大规模节点参与共识的拜占庭容错型共识机制,在 BFT 基础上把再节点分为代理节点和普通节点,代理节点有记账权利,普通节点可以看到共识过程,并同步账本信息,但不参与记账