我们先从常见的拜占庭将军问题中理解一下什么是共识。
拜占庭将军问题
拜占庭位于如今的土耳其的伊斯坦布尔,是东罗马帝国的首都。由于当时拜占庭罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信差传消息。在战争的时候,拜占庭军队内所有将军和副官必须达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,在军队内有可能存在叛徒和敌军的间谍,左右将军们的决定又扰乱整体军队的秩序。将军们采用投票的策略来决定是进攻还是撤退,也就是说如果多数人决定进攻,就冲上去,如果多数人决定撤退,就撤退(比如10位将军中,有6位选择进攻,那么就进攻)。
这时候,在已知有成员谋反的情况下(或者是有奸细的情况下,他们乱投票,或者擅自修改军令),其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜占庭问题就此形成。
拜占庭将军问题是一个协议问题,拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,并且将军中存在叛徒。叛徒可以任意行动以达到以下目标:欺骗某些将军采取进攻行动;促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。如果叛徒达到了这些目的之一,则任何攻击行动的结果都是注定要失败的,只有完全达成一致的努力才能获得胜利。
所以,拜占庭将军是一个分布式系统中的共识问题,也是一个分布式容错系统的问题。拜占庭将军问题不是说要让将军达成进攻的决定,而是让所有忠诚将军达成共识,要么全都进攻,要么全都撤退,不至于被敌方各个攻破。
目前拜占庭将军问题也有很多经典解法,常见的有实用拜占庭容错系统(PBFT)和Raft。PBFT的解法前提是需要n ≥ 3t+1,其中t是故障节点个数(也就是谋反将军的个数),n是总节点个数(也就是所有将军的总数)。这些方式虽然能达成共识,也各有优点,但是都有不同的假设条件,自带局限性。
目前在区块链系统中,PBFT和Raft是联盟链和私有链上常用的共识算法,而在公有链上,常用的是POW,POS,DPOS等共识算法。
区块链的共识
我们平时支付的时候使用支付宝刷一下就行了,其实并没有进行实际货币的转移,而是支付宝在它的数据库里记了一笔账。现在的货币系统其实是一个记账货币,而记账的主体是国家央行或者支付宝等第三方机构,这是一种中心化记账形式。而中心化记账虽然很效率高,但是也面临着各种问题,比如中心化节点引发的单点失败,万一一颗流星正好掉到了阿里巴巴的数据库机房上;再比如操作人员造假,万一阿里巴巴的数据库管理员哪天心情不好,然后先删库再跑路。当然这些事件的可能性都很小,但是黑天鹅事情要么不发生,要发生就可能是毁灭性的打击。所以,对这种可能存在的小概率事情,解决方案一般以预防为主,比如备份数据,多建几个分布式节点,对人员进行SOP培训,还有一种解决方案,就是使用更可靠,更安全的系统。
区块链的去中心化记账,从技术上解决了上面提到的中心化记账的弱点。因为它没有中心节点,通过计算机算法、密码学、经济学,结合智能合约,点对点传输,不可篡改。区块链的每个区块相当于账本页,每个区块中记录的是相应的交易内容。但是,去中心化记账行为的一个很重要的问题,就是各个节点账本的一致性。
从去中心化账本系统看,每个加入这个系统的节点都需要保存一份完整的账本,但是却不能有两个节点同时记账,因为节点处于不同的环境,接收到的交易信息不一致,如果同时记账的话,就会导致账本的不一致。所以,需要通过共识机制来:
POW:Proof of Work,工作量证明
比特币系统设计了以每个节点的计算能力,即“算力”来竞争记账权的机制。简单说,POW就是一份确定工作端做过一定量工作的证明。举个例子来说,就是我去面试的时候,招聘网站上写的该岗位需要本科以上学历。那我怎么证明我是本科毕业生呢?把本科毕业证show给面试官看就可以了,就是这么简单。但是我要怎么得到这个毕业证呢?需要上4年的大学,在此之前还要上高中,初中,小学,上大学时还不能天天玩乐,还要上课,考试,考试还不能挂科,这是一个艰辛的过程。对面试官而言,一张毕业证就足以证明我上过大学,而且还不笨。
所以,POW方式的主要特点就是计算的不对称性。工作端需要做一定难度的工作才能得到一个结果,但验证方却很容易通过结果来检查工作端是不是做了相应的工作。具体做法是通过对一个区块链头部中的父区块哈希,Merkle树根和nonce值三个字段进行哈希运算,如果结果小于目标值,则计算成功,如果大于目标值,则改变nonce值,重复运算,直到结果小于目标值为止。
怎么理解pow的工作方和验证方呢?再举个例子。
工作方:假设输入值是 blockchain1,对它进行哈希运算,寻找结果前3位为0的哈希值,那么计算过程是:
blockchain1 -> ef7797e13d3a75526946a3bcf00daec9fc9c9c4d51ddc7cc5df888f74dd434d1
blockchain2 -> db0b9c1cb5e9c680dfff7482f1a8efad0e786f41b6b89a758fb26d9e223e0a10
......
blockchain515 -> 0063e58fb6e3789fcb5eb64d05d7a9b909c5e9e1b60b18cb566a3326c1fd54c
......
blockchain2688 -> 0005f2ee930eafef21d06545c0058ddfcf2ac9dfa542b745021f51ceb9e9f43c
可以看出,经过2688次运算才能找到前三位为0的哈希值。随着0个数的增加,那么计算难度是成指数级增加的。
验证方:验证方拿到工作方得到数值blockchain2688,只需要一次计算就可以知道工作方的工作有没有做出来。
对于pow,如果要寻找特定字符串后面的随机nonce,满足前n位均为0的SHA256值,需要进行多次哈希值的运算。一般来说,由于哈希值的伪随机性,要寻找3个前导0的哈希值,预期大概要进行2的12次方次尝试,这个数学期望的计算次数,就是所谓的“工作量”。整个工作量证明活动,就是我们常说的“挖矿”所做的工作。
在上面的例子中,实际的比特币系统中有几个比较关键的地方,比如nonce值是怎么改变的,目标值的0的个数是怎么确定的等,可以参考比特币挖矿一文。
比特币网络中的任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币网络出的POW问题。这道题有三个关键要素:
比特币系统中使用的工作量证明函数是SHA256,SHA是安全哈希算法(Secure Hash Algorithm)的缩写,是一种密码哈希函数家族,SHA256是其中的一种,输出256位的哈希算法。比特币的区块是由区块头和该区块所包含的交易列表组成,区块中包含了一个指向前一区块的哈希指针,使得记录了不同交易的单个区块被关联起来,形成区块链。难度值是比特币系统中的节点在生成区块时的重要参考指标,它决定了节点大概需要多少次哈希运算才能产生一个哈法的区块,难度值会随着全网算力的变化进行调整,将产生区块的速率保持在10分钟一个。
因此,POW成功的决定因素就是算力大小,如果你的算力是n,全网算力是m,那么你在一次工作量证明,也就是一次挖矿活动中能够成功的概率是n/m ,经过 m/n 次挖矿中可以成功一次。比如我的笔记本算法大概是1GH/s,现在全网算力是21EH/s,那么我大概需要进行200亿次工作量证明,每次大概10分钟,有生之年肯定是挖不出来一个的。
POS:Proof of Stake,权益证明
现在我们知道如何对比特币进行挖矿了,那就是需要购买挖矿设备和支付电耗,以此来获取新币作为挖矿的奖励。这基本上是一个很消耗资源的过程。而且有两个明显的弊端,一方面,pow的前提是,节点和算力是均匀分布的,因为中本聪当初的设计是通过CPU挖矿,这样节点数和算力值可以大致匹配,但是随着GPU,FPGA直到矿机,使得节点数和算力值渐渐失配。另一方面,pow实在太浪费了,比特币网络每秒可完成数百万亿次SHA256计算,这些计算除了使得恶意攻击者不能轻易打垮比特币网络外,好像并没有更多的实际价值。当然相对于它所带来的好处,这点浪费也许只是很小的代价。
但浪费总归是不好的,有没有办法把挖矿设备和能耗这一环节去掉呢?毕竟这个过程只是要选出一个记账的节点,有没有其他方式可以实现呢?于是,人们提出了一些工作量证明的替代者,其中有一种就叫做POS。
权益认证是由Quantum Mechanic 2011年在比特币论坛讲座上提出来的,然后由PPC(点点币)和NXT(未来币)以不同的思路实现。POW就是根据计算能力随机,POS根据拥有财产随机。这就是这两个共识机制的本质。但是,另一个问题是,POW是一个在比特币出现之前就有了的东西,而因为比特币的成功,POW基本上特指比特币的POW。但相反,POS是个新东西,目前并没有成熟的POS应用,所以,当提到POS的时候,并不是指某一个算法,而是一类,而且,这类算法目前各有优劣。并且,目前为止,没有一个算法的可靠性通过了实践的检验。所以,要对比POW和POS的优劣,我只能以POS这一大类为例。我们现在常说的POS,其实都在说PPCoin的POS,也就是最早的POS,那个东西是有根本缺陷的,例如币龄攻击(save-up attack),都仅仅是对PPC使用,而并不是POS的问题。
Quantum Mechanic提出POS概念的时候,说了下面这段话:
I'm wondering if as bitcoins become more widely distributed, whether a transition from a proof of work based system to a proof of stake one might hAppen. What I mean by proof of stake is that instead of your "vote" on the accepted transaction history being weighted by the share of computing resources you bring to the network, it's weighted by the number of bitcoins you can prove you own, using your private keys.
他的意思就是说,节点记账权的获得与节点持有的币的数量,也就是权益有关。两者成反比关系,持有币数越多,获得记账权就越容易。这种决定由谁记账的方式,去掉了POW中需要大量计算的过程,但是依然需要进行哈希运算来获取记账权。
在POW中,一个用户可能会拿1000美元来购买矿机并加入到网络中挖矿,从而得到奖励,在POS中,用户会拿1000美元来买等价的代币,并把这些代币当作押金放入POS机制中,这样就有机会产生新区块而得到奖励。
简单来说,就是这个系统中会存在一个持币人的集合,他们把一定的代币放pos机制中,于是他们就变成了验证者,拥有了验证交易和产生区块的权利。然后pos算法就会在这个集合中随机选取一个节点,给他权利产生下一个区块。如果在一定时间里,这个节点没有产生一个区块,则选出第二个节点代替之。在这个过程中,被选中的概率和他们投入的代币量有关,比如一个节点投入了10000代币,那么他被选择的概率,是投入1000代币节点的10倍。
点点币(PPC)
PPC是最先采用权益证明算法的数字资产,它在Quantum Mechanic提出的权益证明思想的基础上,引入了币龄的概念。币龄是币的数量和币所拥有的天数的乘积。
简单来说,就是一个根据你持有货币的量和时间,给你发利息的一个制度,在PPC的POS模式下,每个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个POS区块,你的币龄就会被清空为0。你每被清空365币龄,你将会从区块中获得0.05个币的利息(假定利息可理解为年利率5%,点点币PPCoin是1%年利率),那么在这个案例中,利息 = 3000 * 5% / 365 = 0.41个币,这下就很有意思了,持币有利息。
PPC其实是权益证明和工作量证明的一种结合体,因为它也需要挖矿。为了挖到区块,点点币的矿工也需要像比特币矿工那样去进行一个SHA256的解谜运算,只不过,这个解谜运算的难度会随着他们想消耗多少币龄而调整。当一些币龄被消耗后,找到有效区块会变得十分容易。这个运算解谜的效果主要是要保证,在两个矿工尝试消耗同样大小币龄的情况下,这个过程仍然是随机的。
对于POS而言,除了PPC,还有其他不同形式的设计。在这些设计中,一定数量的币被消耗用于使运算解谜变得极为简单,这使得解谜运算不再是挖矿过程中最主要的挑战。
POW和POS
两者最直接的区别是,POW依赖算力,而POS依赖持有币数。所以要想拥有记账权,POW得买矿机,POS得买代币。
工作量证明资源消耗大,可监管性差,共识机制强,需要全网算力共同参与效率低。优点也很明显就是完全去中心化和节点自由进出。权益证明一定程度缩短了达成共识时间,但还是需要挖矿,只是不需要消耗大量的能源。两种方案都没有从本质上极大解决成本降低效率提升这个用户痛点。只是优化方案,所以在这2种方式的逻辑里面做项目必然有被替代的情况出现。比如说更优化的方案,或是彻底解决痛点的新机制出现。
DPOS:Delegated Proof of Stake,委任权益证明
POW和POS虽然都能解决记账一致性的共识问题,但是POW太依赖算力,一是浪费资源,一是某些矿池巨大的算力俨然成为了一个中心。而POS依据权益结余来选择,会导致首富账户的权力更大,有可能支配记账权。于是,又有人提出了DPOS算法。本质上来讲,DPOS是对POS的一种改进,就像PPC是对POS的一种改进一样,只不过PPC是一种具体的数字资产,而DPOS是一种思想。
比特股(BitShare)
BitShare是一种采用了DPOS机制的数字资产,它提出了见证人(也就是代理人,或者说代表)的概念,期望通过引入一个技术民主层来减少中心化的负面影响。类似董事会投票,持币者投出一定数量的节点,进行代理验证和记账。
BitShare的DPOS工作原理是:每个持有比特股的节点都相当于一个股东,都有投票选出代表的权利,每个股东将其投票权授予一名代表。获得票数最多的前N个(N通常是101)代表来生成区块。当选成代理人需满足,至少一半的股东参与了投票。
代理人的候选名单每个维护周期(1天)更新一次。代理人随机排列,每个代理人按需有2秒的时间来生成区块。如果在规定时间内不能生成区块,则交由下一个时间片的代理人完成。
DPOS充分利用了持股人的投票,以公平公正的方式达成共识。他们选出的N个代理人,可以视为N个矿池,这N个矿池的权利是完全相等的。持股人可以随时通过投票更换这些代理人,只要他们提供的算力不稳定,计算机宕机或者试图作恶等。
DPOS的优点是可以大幅度缩小参与验证和记账节点的数量,可以达到秒级的共识验证,但是缺点是整个共识机制还是依赖于代币,而很多商业应用是不需要代币的。
除了POW,POS,DPOS这三种主流共识机制外,实际区块链应用中衍生出了许多变种机制。这些机制各有优劣,比如POW在安全性和公平性上比较有优势,也依靠其先发优势已经形成了成熟的挖矿产业链,但是其对能源的消耗令人诟病。新兴的机制比如POS,DPOS等则更为环保和高效,但是在安全性和公平性方面比不上POW。