浅析区块链共识机制
Al1ex 区块链安全 9241浏览 · 2019-02-27 01:49

前言

区块链的根本属性是去中心化,而去中心化的依托是共识机制。
在了解共识机制之前,我们可以先来了解两个有趣的古老问题:类两军问题、拜占庭将军问题。

类两军问题


如上图所示,一支白色部队在山谷里驻扎,在周围的两边上坡上驻扎着蓝色部队。白色部队比蓝色部队中的任意一支都要强大,但两支蓝色部队加在一起的战斗力要比白色部队强大。如果一支蓝色部队单独作战,那么它就会被白色部队击败;如果两支蓝色部队同时向白色部队进攻,那么蓝色部队可以获胜。两支蓝军不能够远程沟通,只能够派遣通信兵穿过由白军驻扎的沟渠去通知对面蓝军进攻的时间,而且在这个协商过程中发起通信的蓝军需要知道对面蓝军同意了攻击的时间,接收通信的蓝军也需要知道发起通信的蓝军知道自己同意了攻击时间。那么是否存在蓝军必胜的通信协议呢?这就是两军问题。
两军问题的根本问题在于通信信道的不可靠,反过来说,如果传递消息的信道是可靠的,两军问题可解。然而,并不存在这样一种信道,所以两军问题在经典情境下是不可解的,为什么呢?
倘若蓝军Army1向蓝军Army2派出了通信兵,那么Army1要想知道Army2是否收到了自己的信息,Army1必须要求Army2给自己传输一个回执,说“你的信息我已经收到了,我同意在明天12:00点准时进攻”。
然而,就算Army2已经送出了这条信息,Army2也不能确定Army1就一定会在这个时间进攻,因为Army2发出的回执Army1并不一定能够收到。所以,Army1必须再给Army2发出一个回执说“我收到了”,但是Army1也不会知道Army2是否收到了这样一个回执,所以Army1还会等待一个Army2的回执。
就这边不断的陷入了一个永无止境的“回执”循环当中,这对于两方来说都并不一定能够达成十足的确信。同时,这里我们还没有考虑到通信兵的信息有可能被篡改的情况呢。由此可见,经典情形下两军问题是不可解的,并不存在一个能使蓝军一定胜利的通信协议。

拜占庭将军问题


拜占庭帝国周围有10个小国,他们饱受拜占庭欺压,却只有同一时间有6个以上国家进攻才有可能击败拜占庭帝国,非则一定战败。然而拜占庭罗马帝国在军事行动中采取将军投票策略来决定是进攻还是撤退,即如果有多数人决定进攻,就整体确定进攻策略。但是军队中如果有奸细(将军有可能反水、传令官有可能篡改信息或误传),那么如何保证最后投票真实反映忠诚将军的的决策呢?这就是拜占庭将军问题。
该问题的难点在于古时候军队之间的通信完全信赖于人,如果军队中有奸细,无论是将军反水还是传令官误传或篡改,都会令另外9个国家收到假消息,从而造成作战失败。如果你是国王,那么你该如何判断一定会有另外5个以上的国家与你并肩作战呢?毕竟一不小心,就亡国了~~~

由于类似于以上这样的问题的存在,共识的必要性就浮现了出来!

常见的几种共识机制比较

区块链上的共识机制有多种,但任何一种都不是完美无缺的,或者说适用于所有的应用场景的。

工作量证明(POW)

什么是POW

POW,工作量证明机制,通过一个竞争机制(计算猜测一个nonce随机值,得以解决规定的哈希问题),让计算工作完成最出色的节点获得记账的权利。POW通过这种算力消耗的经济惩罚限制了恶意节点的参与,因为它需要付出大量的经济成本。而这个计算过程就是挖矿。

POW工作量证明三要素

1.工作量证明函数:在比特币中使用的是SHA-256算法函数,是密码哈希函数家族中输出为256位的哈希算法。
2.区块:区块是构成区块链的基本单位,每个区块由区块头和区块主体组成。
3.难度值:关于难度值可以直接看公式:

新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)
目标值=最大目标值/难度值

新难度值解析:撇开旧难度值,按比特币理想情况下每10分钟出块的速度,过去2016个区块的总花费时间接近20160分钟,这样,这个值永远趋于1.
目标值解析:最大目标值为一个固定数,若过去2016个区块花费时长少于20160分,那么这个系数会小,目标值将会被调大些,反之,目标值会被调小,因此,比特币的难度和出块速度将成反比列适当调整出块速度。

POW工作量证明流程


从流程图可以看出,POW工作量证明的流程主要经历以下三步:
1.生成Merkle根Hash
2.组装区块头:区块头将被作为计算出工作量证明输出的一个输入参数,因此第一步算出来的Merkle根HASH和区块头的其他部分组装成区块头。
3.计算出工作量证明的输出
i.工作量证明的输出=SHA-256(SHA-256区块头)
ii.if(工作量证明的输出<目标值),证明工作量完成
iii.if(工作量证明的输出>=目标值),变更随机数,递归i的逻辑,继续与目标值进行比对。

PoW的优点:完全去中心化、节点自由进出、容易实现、破坏系统花费的成本巨大等等。
PoW的缺点:对节点性能网络环境要求高、无法达成最终一致性、浪费能源。
使用PoW的项目有:比特币、莱特币等货币型区块链,以太坊的前三个阶段(Frontier前沿、Homestead家园、Metropolis大都会)。

权益证明(POS)

什么是POS

POS机制是署名为“Quantum Mechanic”的数字货币爱好者提出的(如下图),它的全称是proof of stake,中文名即权益证明。顾名思义,这是一种依据各人持币权益来达成共识的机制。它要求用户证明自身拥有货币的数量和时间,也就是证明你对货币的权益。与POW相比,POS的魅力之处在于它可以“屯币得利息”。

币龄概念

POS机制当中引入了币龄的概念,用户拥有的币龄是其持有币数和时间的乘积。以点点币为例,用户每持一币一天拥有一币龄,持一币十天拥有十币龄,持十币十天拥有一百币龄。
而在POS机制中,用户每获得一定量的币龄,就可以开辟新区块,持有者的币龄越大,发现新区块的几率就越大。新区块开通后,币龄也会被使用消耗,但同时系统会给与一定量货币的奖励,也就是“”屯币有利息”。

POS的实现原理及公式

要理解POS的实现原理,从POS的实现算法公式来理解更为直接:

hash(block_header)=target*coinage

币龄的计算:

coinage=币的个数*币的剩余使用时间

其中,coinage表示币龄,这意味着,币龄越大,越容易得到答案。而其中币龄的计算是通过挖矿者拥有的币乘以每个币的剩下使用时间得到,这也将意味着拥有的币越多,也越容易得到答案。这样,pos解决了pow中浪费资源的问题,同时挖矿者不可能拥有全网51%的币,所以也解决了51%攻击的问题。

POS权益证明机制的过程

1.验证者把自己的一些货币作为押金投入到POS机制中。
2.接下来,验证者就会开始验证区块(相对于POW的挖矿过程)。当他们发现一个区块可以添加到区块链时,他们会把自己持有的货币作为投注来验证它。
3.如果区块被添加到区块链中,那么验证者就会获得跟他们投注的押金成比例的奖励。

PoS的优点:资源消耗少,不需要消耗大量的电力和计算力;同时也缩短了共识达成的时间。
PoS的缺点:实现较为复杂;中间步骤较多,容易产生安全漏洞;需要时间验证;单纯采用POS机制的区块链产品需要通过IPO的方式来发行,这会导致少数人获得大量成本极低的货币。因此,一般采用POW+POS的双重混合机制,前期通过POW机制挖矿来发行货币,后期发行完货币后通过POS机制来维护网络稳定。

股份授权证明(DPOS)

什么是DPOS

DPOS是基于POW及POS的基础上,出现的一种新型的保障数字货币网络安全的共识算法。它既能解决POW在挖矿过程中产生的大量能源过耗的问题,也能避免POS权益分配下可能产生的“信任天平”偏颇的问题。

DPOS共识机制的原理

DPOS机制让每一个持币者都可以进行投票,由此产生一定数量的代表 ,或者理解为一定数量的节点或矿池,他们彼此之间的权利是完全相等的。持币者可以随时通过投票更换这些代表,以维系链上系统的“长久纯洁性”。
我们可以以我国的人大代表制度来理解DPOS共识制度的涵义。当被选出来的人大代表不能再履行人民赋予他们的职责之时,他们将会被除名,而网络将会重新选出新的代表来代替他们的位置。

DPOS共识机制的过程

DPos在共识期间分为“见证人选举”和“见证人出块”两个过程。
见证人对各个交易签名与时间进行验证。在网络中每个账户都可以为下一个见证人投票,而票数要根据区块链的资产情况来分配。
见证人选举过程:只有拥有被选举权的永久节点才能够被选举,最终只有前N名见证人可以被选举出来。这N个人都要获得50%以上的票数才能够顺利当选,除此之外,这个名单会按照固定的时间间隔进行重新选举。
见证人出块过程:见证人每生产一个块,都会获得报酬,他们的薪酬水平由其获得的投票决定。如果见证人没有生产区块,他们便没有收入,并且还有可能被投票失去见证人的身份。见证人生产区块时,每2s需要产生一个区块,如果超过了规定的时间,那么当前见证人就会失去生产权利而转交给下一个人。
网络中所有的用户均有责任监控区块链生成的过程,并且同意需要选择分叉最长的那个链进行追加。

DPoS的优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。
DPoS的缺点:整个共识机制还是依赖于代币,而很多商业应用是不需要代币的。

拜占庭容错(PBFT)

什么是PBFT

PBFT是Practical Byzantine Fault Tolerance的缩写,意为实用拜占庭容错算法。该算法是Miguel Castro (卡斯特罗)和Barbara Liskov(利斯科夫)在1999年提出来的,解决了原始拜占庭容错算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。

PBFT共识机制的原理

PBFT共识机制一共包含三个阶段:预准备(Pre-Prepare)、准备(Prepare)、确认(Commit)

具体步骤:
1.从全网节点选举出一个主节点(leader),新区块由该主节点负责生成
2.Pre-Prepare:每个节点把客户端发来的交易向全网广播,主节点0将从网络收集到需放在新区块内的多个交易排序后存入列表,并将该列表向全网广播,扩散至123
3.Prepare:每个节点收到交易列表后,根据排序模拟执行这些交易。所有交易执行完后,基于交易结果计算新区块的哈希摘要,并向全网广播,1-023,2-013,3因为宕机无法广播。
4.commit:如果一个节点收到的2f(f为可容忍的拜占庭节点数)个,其他节点发来的摘要都和自己相等,就向全网广播一条commit消息。
5.Reply:如果一个节点收到2f+1条commit消息,即可提交新区块及其交易到本地的区块链和状态数据库。

拜占庭容错能够容纳将近1/3的错误节点误差,IBM创建的Hyperledger 0.6版本就是使用了该算法作为共识算法。同时在PBFT算法下,网络通信的复杂度达到了O(n²),这也就意味着,PBFT网络节点不能太多,如果节点太多将会造成网络风暴,使得整个网络堵塞。
PBFT优点:共识效率高,可实现高频交易。
PBFT缺点:当系统只剩下33%的节点的时候,系统会停止运行。

授权拜占庭容错机制(dBFT)

什么是DBFT

2016年4月,小蚁公司发布共识算法白皮书,描述了一种通用共识机制——授权拜占庭容错(dBFT),提出了一种改进的拜占庭容错算法,使其能够适用于区块链系统。该系统由节点、委托人(谁可以批准区块)和发言人(谁提议下一个区块)组成。各种场景说明了dBFT协议有足够能力来保护网络不受恶意参与者的影响。

DBFT的改进之处

授权拜占庭容错算法在使用拜占庭容错算法的基础上,进行了以下改进:
1.将C/S架构的请求响应模式改进为适合P2P网络的对等节点模式;
2.静态的共识参与节点改进为可动态进入、退出的共识参与节点;
3.为共识参与节点的产生设计了一套基于持有权益比例的投票机制,通过投票决定共识参与节点(记账节点);

  1. 在区块链中引入数字证书,解决了投票中对记账节点真实身份的认证问题。
    授权拜占庭容错机制的优点:专业化的记账人;可以容忍任何类型的错误;记账由多人协同完成,每一个区块都有最终性,不会分叉,算法的可靠性有严格的数字证明。
    授权拜占庭容错机制的缺点:
    1.当三分之一或以上的记账人停止工作后,系统将无法提供服务;
    2.当三分之一或以上的记账人联合作恶,且其他所有的记账人被恰好分割为两个网络孤岛时,恶意记账人可以使系统出现分叉,但是会留下密码学证据。
    总而言之,授权拜占庭容错机制最核心的一点,就是最大限度地确保系统的最终性,使区块链能够适用于真正的金融应用场景。

POA

什么是POA

POA(proof ofactivity,活跃证明),它是一种POW与POS混合的共识算法。

POA共识算法简介

1.每个活跃节点不断进行HASH计算,寻找HASH值小于特定值的区块头。区块头中,包括前区块HASH值,本节点的地址,区块序号和nonce值。对比比特币区块头,我们可以发现POA区块头中少了区块中交易Merple树根值,也就是说POA区块头中不包含交易信息。
2.当节点找到满足条件的区块头后,就向全网广播这个区块头。
3.所有活跃节点收到广播,进行验证。若验证通过,则以广播中的区块头作为数据源,导出N个随机的股权所有者。具体方法是:
a.将此区块头的HASH值与区块头中的前区块HASH值串联,再与一个固定值串联,然后计算串联后数据的HASH值;
b.对上述HASH值执行跟随聪算法,找出一个幸运股权人。
c.重复步骤a,b N-1次,找到另外N-1个幸运股权人。
4.所有活跃节点判断自己是否是幸运股权人。
如果自己是前N-1个幸运股权人的一个,则用私钥对上述区块头进行签名,并将这个签名在全网广播;
如果自己是第N个幸运股权人,则构建用这个区块头来构建一个新区块。
区块中包含了自己选出的尽可能多的交易,前N-1个幸运股权人的签名,还有自己对完整区块的HASH值的签名。然后 将这个签名后的完整节点在全网广播。
5.所有活跃节点在收到完整节点之后,进行验证(例如N个签名必须正确),若验证通过则认为该节点是一个合法的新区块,将其加入区块链。如果这个区块属于最长链,则以它为前区块,转到步骤1;否则,作丢弃处理。

POA的特点

1.PoA是依靠预设好的授权节点(signers),负责产生block。
2.可以由已授权的signer选举(投票超过50%)加入新的signer。
3.即使存在恶意signer,他最多只能攻击连续块(数量是 (SIGNER_COUNT / 2) + 1) 中的1个,期间可以由其他signer投票踢出该恶意signer。
4.可指定产生block的时间。

POA中的攻击与防御

1.恶意签名者(Malicious signer)。恶意用户被添加到签名者列表中,或签名者密钥/机器遭到入侵. 解决方案是,N个授权签名人的列表,任一签名者只能对每K个block签名其中的1个。这样尽量减少损害,其余的矿工可以投票踢出恶意用户。
2.审查签名者(Censoring signer)。 如果一个签名者(或一组签名者)试图检查block中其他signer的提议(特别是投票踢出他们), 为了解决这个问题,我们将签名者的允许的挖矿频率限制在1/(N/2)。如果他不想被踢出出去, 就必须控制超过50%的signers。
3."垃圾邮件"签名者(Spamming signer)。这些signer在每个他们签名的block中都注入一个新的投票提议.由于节点需要统计所有投票以创建授权签名者列表, 久而久之之后会产生大量垃圾的无用的投票, 导致系统运行变慢.通过epoch的机制,每次进入新的epoch都会丢弃旧的投票。
4.并发块(Concurrent blocks)。 如果授权签名者的数量为N,我们允许每个签名者签名是1/K,那么在任何时候,至少N-K个签名者都可以成功签名一个block。为了避免这些block竞争( 分叉 ),每个签名者生成一个新block时都会加一点随机延时。这确保了很难发生分叉。

POI

什么是POI

PoI(Proof-of-Importance,即重要性证明),它被应用于项目NEM(新经济运动)。它和POW、POS有一个共同点就是他们都是算法,而且当应用于加密货币时都有益于维持选择区块的顺序。当我们开始考虑到注入双重支付之类的事情时,这就变得非常重要。PoI理论上解决了PoS的缺陷——"富人更富"的问题,即“拥有更多代币的人,拥有更多验证交易和获取交易费奖励的机会”这一问题。
PoI,就像一个信誉评分系统,NEM区块链上的每个账户都被分配了重要性分数。这个分数将影响个人用户如何“收获”区块链(记账获取代币奖励)。随着用户重要性得分越来越高,他们获得记账奖励的机会就越大。更高的信用分数,意味着网络更信任你,会让你验证更多的交易,获取更多的交易费。也就是说,赢得更多的记账机会。

POI优缺点

优点:低能耗、速度快、公平
缺点:缺少社区共识、账户重要性不等于设备贡献度

POP

什么是POP

POP(Proof of Participation,参与度证明),是标准链(CZR)的创新,基于账户参与度的PoP算法是POI和DPOS思想的结合产物,既能确保对设备的公平性,又拥有社区的共识。

POP优缺点

优点:低功耗、速度更快、更加安全,技能确保公平性,又拥有社区的共识

PAXOS

什么是PAXOS

PAXOS是一个分布式一致性协议,它的事件需要多个节点共同参与,一个事件完成是指多个节点上均完成了自身负责的单机事件(把这样的事件成为“分布式事件”),这样的分布式事件可以看做是多个单机子事件的复合,但是不能从两个分布式事件的先后推导出某个节点上他们的单机子事件的先后,也不能根据某个节点上两个单机子事件的先后断言他们对应的分布式事件的先后。
PAXOS算法是分布式技术大师Lamport提出的,主要目的是通过这个共识机制让参与分布式处理的每个参与者逐步达成一致意见,简单的来说就是在一个选举的过程中,让不同的选民最终做出一致性的决定。这个应用应该会很受参与与美国总统大选的欢迎。

PAXOS优缺点

优点:性能高、资源消耗低
缺点:不具备容错性

RAFT

什么是RAFT

RAFT算法是对Paxos算法的一种简单实现,包括三个角色:Leader、candiate、follower。
Raft机制可以理解成全网选出一个记账者,如果它稳定运行没有挂掉,就由这个节点记账,全网无条件接受他的记账结果,相信他是诚实的,假如这个节点挂掉了,那么大家是可以通过超时或网络探测感知,然后快速启动一轮投票,来选出一个新的记账节点,然后继续无条件的等它的记账,这样就达成了容错性。这在信任都较高、机构组成简单的联盟链或者一个机构内的私有链里,是比PBFT更加高效的一种做法,因为不需要多步的重复确认,受网络影响的可能性也小很多。

Raft优缺点

优点:强调可用性和最终一致性、效率非常高
缺点:反欺诈性只能在事后检查

投注共识

什么是投注共识

投注共识是以太坊下一代的共识机制Casper(鬼马小精灵)引入的一个全新概念,属于PoS。Casper的共识是按区块达成的,而不像PoS那样按链达成。为了防止验证人在不同的世界中提供不同的投注,我们还有一个简单严格的条款:如果你两次的投注序号一样,或者说你提交了一个无法让Casper依照合约处理的投注,你将失去所有保证金。从这一点我们可以看出,Casper与传统的PoS不同的是,Casper有惩罚机制,这样非法节点通过恶意攻击网络不仅得不到交易费,而且还面临着保证金被没收的风险。
Casper协议下的验证人需要完成出块和投注两个活动。具体如下:
出块过程:出块是一个独立于其他所有时间而发生的过程,验证人收集交易,当轮到他们的出块时间时,他们就制造一个区块,并签名,然后发送到网络上。
投注过程:目前Casper默认的验证人策略被设计为模仿传统的拜占庭容错共识:观察其他的验证人如何投注,取33%处的值,向0或1进一步移动。
客户端状态确认过程:一开始先下载所有的区块和投注,然后用上面的算法来形成自己的意见,但是不公布意见;它只是简单地按顺序在每个高度进行观察,如果一个区块的概率高于0.5就处理它,否则就跳过它。在处理所有的区块之后,所得到的状态就可以显示为区块链的“当前状态”。客户端还可以给出对于“最终确定”的主观看法:如果高度k之前的每个区块形成的意见高于99.999%或者低于0.001%,那么客户端可以认为前k个区块已经最终确定。

Pool验证池

什么是Pool验证池

Pool验证池基于传统的分布式一致性技术建立,并辅之以数据验证机制,是目前区块链中广泛使用的一种共识机制。
Pool验证池不需要依赖代币就可以工作,在成熟的分布式一致性算法(Pasox、Raft)基础之上,可以实现秒级共识验证,更适合有多方参与的多中心商业模式。不过,Pool验证池也存在一些不足,例如该共识机制能够实现的分布式程度不如PoW机制等。

Pool验证池优缺点:

优点:不需要代币也可以工作,在成熟的分布式一致性算法(Pasox、Raft)基础上,实现秒级共识验证。
缺点:去中心化程度不如Bitcoin;更适合多方参与的多中心化商业模式。

Referer:

https://www.8btc.com/article/70370
https://www.jianshu.com/p/1026fb3c566f
https://www.sohu.com/a/226497272_100137203

1 条评论
某人
表情
可输入 255