邓铭巍,欧 嵬,杨 杰
(湖南科技学院电子与信息工程学院,湖南 永州 425199)
区块链概念诞生于2008年中本聪[1]所撰写的论文。中本聪在论文中描述了一种不依靠第三方信任机构实现双方点对点交易的在线系统。2009年比特币系统正式上线,由于其具备的去中心化、可溯源且不可篡改等特性,不仅在学术界引发了大量讨论,同时也引起了金融界的密切关注。在此后的10年里,尽管不断出现新型的加密货币系统,比特币仍然保持着市值和交易量第一的地位[2],是目前应用最成功的加密货币系统。
比特币的风靡引起了各界对区块链技术的研究热情,各种基于比特币概念而改进的区块链项目上线:在比特币基础上做硬分叉的比特币现金(BCH);可部署图灵完备的智能合约的以太坊和EOS;使用环签名和零知识验证[3]等密码学技术实现匿名交易的门罗币(XMR)[4]和大零币(Zcash)[5];使用分片技术(Sharding)提升交易吞吐量的Bitcoin-NG[6]、 ZIL等。
随着区块链技术在金融[7]、物联网[8]、供应链[9]、政务[10]等方面的广泛应用,据Gartner预测,到2025年,区块链技术将在多个行业制造高达1760亿美元的商业价值。在这种大范围的应用下,越来越多的黑客对区块链发起了攻击,暴露出区块链存在的重大安全问题。2014年,当时世界规模最大的比特币交易Mt.GoX受到交易延展性攻击(Transaction Malleability Attack),85万个比特币被盗,损失约达4.67亿美元,导致Mt.Gox最终破产。2016年6月,以太坊上的The Dao智能合约遭到延展性攻击,涉及总额300多万个以太币,约合6000多万美元,以太坊被迫进行硬分叉来弥补损失。2018年5月,比特币黄金(BTG)遭受51%算力攻击,损失高达1860万美元[11]。
目前区块链的发展仍然处于初级阶段,频发的安全问题使得某些重视安全性的应用领域对区块链技术始终存疑,同时阻碍了信息互联网向价值互联网的转变。显然,区块链的发展离不开对其安全性的研究。本文研究了目前的3种典型区块链共识机制的安全性:PBFT(Practical Byzantine Fault Tolerance)、 PoW(Proof of Work)与PoS(Proof of Stack),首先介绍3种共识机制的核心思想和算法流程,并对它们所面临的攻击方式进行分析,从一致性和敌手模型2方面对比这些攻击方式对共识机制的影响。
在传统货币体系中,第三方信任机构如中央银行充当货币发行者和账本记录者的角色,用户进行的所有交易都被存储在银行的数据库中。这不可避免地产生了诸如交易效率、信任以及隐私等多种问题。比特币的诞生带来了去中心化的货币体系,用户可以在不经过第三方的情况下直接与他人发生交易并且自主生产货币,从而直接拥有了以往属于中央银行的账本维护权和货币发行权。
随着区块链的发展,研究者为了提高区块链系统的性能,同时保证其安全性和去中心化,多种新型共识机制被提出。这些共识机制为区块链带来了不一样的运行模式和用户体验,但基本的运行流程都主要分为以下4个步骤[12]:
Step1交易发起节点向全网广播交易记录。
Step2节点收集全网交易,并对交易进行验证,通过验证的交易被记录到一个区块中。
Step3节点将打包区块广播到全网,系统通过共识算法决定本轮记账权。
Step4全网所有节点验证拥有记账权的节点所提交的区块中的交易,验证通过则添加到本地区块链中。
通过以上4步,全网所有节点可以对一个区块(即一个交易集合)产生共识,这个经过共识的区块被添加到全网所有节点本地区块链的最末端,这样就保证了每一轮结束后全网所有节点区块链(数据)的一致性。
区块链作为一种分布式系统,如何保证各个诚实节点之间所存储数据的一致性以及有效性是它首先要解决的问题[13]:
1)一致性。所有诚实节点保存的区块链的前缀部分完全相同。
2)有效性。由某诚实节点发布的信息最终将被其它所有节点记录在自己的区块链中。
现代共识机制的基础来源于Lamport[14]在1982年所提出的拜占庭将军问题。拜占庭是强大的东罗马帝国的首都,这个城市高墙耸立、固若金汤,尽管它的10个邻邦觊觎已久,但靠单个城邦无法攻下拜占庭,只有10个邻邦同时出征才能成功。如果这10个城邦的将军都齐心协力,那么攻占拜占庭不是难事,但有些将军可能是叛徒,他们可能为了达到自身的利益而发送错误的消息干扰别人,而那些诚实的将军如何在知道友军中有叛徒的情况下统一作战计划即是拜占庭将军问题的核心。
由于区块链去中心化的特点,多方间实现信息共识就成了现代的拜占庭问题——区块链中的每一个节点都是一个城邦,如何在这些互不信任的节点(城邦)间实现可信的账本(作战计划)共识?如果区块链中的每个节点都是诚实的,且它们的响应能力和处理能力都能够满足区块链的要求,那么这种共识并不难实现。但这是一种理想情况,现实中区块链中的节点可能出现各种问题[2]:
1)节点之间的网络通信是不可靠的,可能会出现任意的延迟中断和内容故障。
2)节点的处理可能是不正确的,并且节点本身随时可能宕机。
3)同步调用会让系统变得不具备可扩展性。
4)存在恶意节点故意破坏系统。
为了应对这种非理想状况的区块链环境,各种共识机制被提出,本文主要关注目前3种典型的区块链共识机制。
PBFT是一种在联盟链中使用得最多的共识算法。它假设系统中有超过3f+1个节点,f为系统中失效或恶意节点数。其核心思想是节点对同一信息的多次重复确认,从而达到全网共识。该算法依赖于一个主节点来搜集全网交易并打包成区块,之后进入PBFT算法的3个主要阶段:预准备(pre-prepare)、准备(prepare)和确认(commit)[15]。在预准备阶段,主节点向全网广播带有区块的预准备消息,全网其他节点验证该消息后向全网转发准备消息进入准备阶段;在准备阶段,全网节点对比收到的预准备消息和准备消息,若某个节点收到超过2f条与预准备消息相匹配的来自不同节点的准备消息,那么该节点转发确认消息进入确认阶段;在确认阶段,当每个节点都收到2f+1条确认消息时(可能包括它们自己的),本轮区块共识达成[16]。
PoW的核心思想是通过分布式节点的算力竞争来保证共识的一致性[17]。比特币系统的各节点(即矿工)使用各自的CPU算力相互竞争来共同解决一个求解复杂但是验证容易的Sha-256数学难题(即挖矿),成功解决该问题的节点会将其收集到的交易和答案打包成一个区块广播到全网的所有节点,这些节点负责验证该节点所提交的答案,若答案正确,则将该节点广播的区块添加到本地区块链的最后面;若答案错误,则丢弃该区块。也就是说,最快解决该难题的节点将获得下一区块的记账权。另外,为了激励节点来争夺记账权产生区块,系统会自动生成一个比特币奖励给每一轮成功获得记账权的节点。
PoW中的数学问题被设置为求解一个Sha-256算法的哈希散列值,这个哈希值的原像是节点所提交的区块头。节点需要找到一个随机数使区块头的哈希值小于或等于某个难度值[18]。由于Sha-256算法的特性,找到这个随机数最有效的方法是尝试不同随机数,因此,除非Sha-256算法被破解,否则节点只有依靠算力竞争才能获得记账权。
在PoW中,节点为解决哈希函数问题浪费了大量算力,且随着矿池(Minging Pool)的诞生,算力越来越集中[19],中心化的危险越来越大。为了解决PoW的算力浪费问题和中心化问题,PoS算法被提出[20]。
PoS的共识原理和PoW类似,都是系统中的节点为竞争唯一记账权而寻找一个随机值来产生满足目标难度的区块头哈希值。不同的是,PoW中解决该问题的概率由算力决定,算力越高,概率越大,但是在PoS中,这个概率是由币龄决定的。币龄是PoS提出的一个概念,指的是拥有货币数与货币持有时间的乘积。显然,币龄越大,节点在系统中所占有的权益就越大,这就是PoS的核心理念——记账权由区块链中经济权益最大的人掌握。为了不使自己所持有的货币贬值,他们会选择诚实记账维护系统的一致性和安全性。
节点需要消耗自己的币龄来获得记账权。这是通过一种名为coinstake的特殊交易实现的。在coinstake中,付款人和收款人都是节点自己,也就是将自己的货币发送给自己,系统根据发送货币的币龄来决定该节点寻找随机数的难度值,币龄越大,难度值越低,找到区块的概率就越大。此时,节点发送的货币的币龄会归零,节点需要为了下一次竞争记账权再次囤积币龄,否则就无法再次找到区块获得货币奖励,从而避免了“富人越富”的情况产生[21]。
由于PBFT、 PoW和PoS之间有不同的网络环境、共识难度以及区块增长速度,要对其安全性进行建模较为困难。因此,本文通过分析3种共识机制所面临的潜在攻击方式,在部分同步网络模型下,从一致性和敌手模型[22]2方面进行安全性对比。
定义1部分同步网络模型。部分同步网络模型(Partially Synchronous Network)是指网络中的消息传输存在一定的上限Δ,时延上限不能作为协议的参数使用,但是能够确保诚实用户发出的消息在Δ时间之后到达其它所有诚实用户。
定义2弱一致性。弱一致性(Weak Consistency)也被称为最终一致性(Eventual Consistency),根据出块者选举的方式,同一个时期可能有2个以上合法的出块者,在这种情况下,区块链可能出现分叉,但是经过很长一段时间之后,最终区块链的区块是确定的。
定义3强一致性。强一致性(Strong Consistency)是指区块的生成是确定性的,具有强一致性的区块链一般不会产生分叉。
定义4敌手模型。敌手模型是指对敌手能够掌握的算力或财力占比作出一定的限制,一般用f代表敌手数量,n代表网络中节点总数,利用n与f的关系来表示敌手模型。
PBFT的安全性主要建立在3个主要阶段上。具体来说,在准备阶段,如果一个节点决定接收一条准备消息,那么意味着节点收到了超过2f条相同的准备消息,而这2f条准备消息的转发前提是2f个节点都接收到了同一条预准备消息。在这种情况下,也就是说至少有f+1个节点收到了包含同一区块的预准备消息并且转发了同一准备消息(按照2f个节点中有f个失效节点的最坏情况计算)。由于全网节点总数为3f+1,即使剩下的f个节点数全部转发另一条不同的准备消息,其他节点也无法接收这条消息,从而达成区块链的一致性[10]。
PBFT的3阶段协议可以保证区块链较强的一致性,且在任一时间点,系统中只能存在一个主节点提交区块,从而避免了分叉情况的出现。但从安全角度来说,PBFT的“系统中有超过3f+1个节点”的假设在实际情况中很容易被攻击者使用女巫攻击打破。
女巫攻击[23]是一种通过在系统中创建多个公钥地址,使得一个用户能够利用单个节点来伪造多个身份存在于P2P网络中的攻击方式。
假设攻击者使用女巫攻击在网络中创建f+1个恶意节点。此时,攻击者只要让这f+1个恶意节点全部失效即可确保区块链系统瘫痪。具体来说,PBFT要求节点在收到2f-1条准备消息时才能接收这条消息,但是一旦有f+1个节点失效,那么全网任何一个节点最多只能收到2f-1条准备消息。协议将停留在准备阶段,系统无法对区块产生共识,最终瘫痪。
PoW利用算力竞争在区块链网络中实现了一致性,全网节点每一轮只接受同一个节点所收集到的一个区块。同时,由于记账权的争夺是建立在算力竞争之上,这就意味着PoW可以有效抵抗传统的女巫攻击[24-25]。
尽管PoW巧妙地解决了共识机制中的一致性问题和传统P2P网络中的女巫攻击,但它的安全性假设是建立在诚实节点占大多数,且网络处于强同步的情况上,而这些安全性假设在实际应用中很容易被打破,从而出现各种针对性的攻击方式。
PoW的安全性建立在诚实节点占据网络一半算力的前提上,一旦网络中恶意节点的算力超过50%,那么攻击者将有很大机率获得区块链的记账权。以比特币为例,目前全球排名前5的矿池算力加起来已经超过了50%,如果这些矿池间进行合作,就能直接对比特币系统发起51%攻击,控制比特币的记账权,从而篡改区块链账本,降低比特币信用度,使比特币的币值大幅下跌。
与传统货币体系不同,区块链系统没有第三方记账系统,因此一笔交易的货币走向存在不明确的风险。例如,Alice向Bob支付10个比特币,当这笔交易被记载进当前区块后,Alice使用某种办法使当前区块失效,这时Alice所支付的10个比特币又回到了Alice的账户中,于是Alice能够再次使用这10个比特币,这就是双花攻击。在PoW中执行双花攻击的步骤可以归纳为以下4步[26]:
Step1攻击者从某个区块开始,首先在主链之外进行私自挖矿,并且尽可能长地拓展这条私链。
Step2攻击者使用一些货币并将交易在全网中广播。
Step3攻击者等待交易被记录在当前区块链中。
Step4当攻击者私挖的区块链长度已经超过当前网络中的链长时,他将私链在全网公布。
由于PoW中采用的是“最长链原则”,节点会自动接收网络中的最长链,攻击者发布的这条链最终会被全网节点所接收,而这条链中并没有包含Step2中攻击者广播的交易,因此攻击者在Step2中使用的钱又回到了攻击者手里,攻击者可以重复使用这笔钱。
文献[27]对比特币中的双花攻击进行建模,证明了当51%算力假设被打破时,攻击者能够实行双花攻击。首先进行2个假设:
1)假设全网算力为1,诚实节点占据全网算力的p,恶意节点占据全网算力的q,且p+q=1。
2)假设系统难度值不变,在使用全网算力的情况下,找到符合条件的哈希值的时间为T。
本文使用ni和mi来分别指代在第i轮诚实节点控制的区块链长度和恶意节点控制的长度,那么zi=ni-mi就能得到诚实节点领先恶意节点的区块数。攻击者在发起攻击时,他的链长度是和诚实节点一样的,这时z0=0:如果下一轮的区块是被诚实节点找到的,那么此时z1=1;如果下一轮的区块是被恶意节点找到的,那么此时z1=-1。显然,一旦zi=-1,攻击者就能广播这条链成功发起攻击,所以只需要关注zi的状态即可。随着轮数的增加,zi的状态可以看成一条马尔可夫链,且它的下一状态只与当前的p和q有关:
(1)
接下来,用az来指代当攻击者落后z个区块时他成功发起攻击的概率。显然,当z<0时,az=1。当z≥0时,如果下一区块被诚实节点发现(可能性为p),那么这时攻击者落后z+1个区块,此时成功攻击的可能性为az+1;如果下一区块被恶意节点发现(可能性为q),那么这时攻击者落后z-1个区块,此时成功攻击的可能性为az-1。这样可以得到az满足下列的递归关系:
az=paz+1+qaz-1
(2)
由于p+q=1,可以得到:
(3)
分析公式(3)可得到以下3点结论:
1)当双方的算力一定时,攻击者成功发起双花攻击的可能性只与它落后的区块数有关。
2)如果攻击者控制超过50%的网络算力,不管他落后诚实节点多少个区块,他总能成功发起攻击。
3)当诚实节点的算力大于恶意节点时,攻击者成功发起攻击的几率随着落后区块数增加呈指数下降。
由于比特币系统中的算力越来越大,单个矿工挖矿成功的可能性越来越小。为了提高收益,矿工们选择将自己的算力集中在一起,组成矿池进行联合挖矿。
文献[28]指出,矿池中诚实矿工的收益可被执行自私挖矿策略(Selfish Mining Strategy)的自私矿工(Selfish Miners)决定。和双花攻击类似,自私矿工会进行私自挖矿,并且依据比特币系统的状态有策略地公布他所挖出来的私链。系统的状态可使用2种变量来表示:lead和branching。lead表示私链领先公链的区块数,branching表示当前的分支链条数。自私挖矿策略即是自私矿工在系统对应状态下的行为策略:
1)当自私矿工挖出一个区块时,如果lead=0, branching=2,自私矿工公布整条私链;否则,自私矿工继续在他们的私链上挖矿。
2)当诚实矿工挖出一个区块时,如果lead=0,自私矿工在公链上开始私挖矿;如果lead=1,公布私链的最后一个区块;如果lead=2,公布整条私链;如果lead>2,公布私链上第一个未公布的区块;否则,自私矿工继续在他们的私链上挖矿。
在计算不同状态的可能性后,文献[28]得到了自私矿池的预计收益:
(4)
其中,α表示自私矿池的算力,γ表示当分支出现时,选择在自私矿工所公布的私链上挖矿的诚实矿工比例(当长度相等的分支出现时,诚实矿工会随机选择一条分支进行挖矿)。由公式(4)可以知道,自私矿池的收益由α和γ决定。在不打破51%算力假设的情况下,如果采用这种策略的自私矿工的算力α满足以下不等式,他们可能获得比诚实矿工更高的收益:
(5)
当自私矿池的算力在这个区间内增加时,矿池内每个自私矿工的收益都会增加。因此,假设比特币系统中的矿工遵循“理性经济人”假设,那么越来越多的矿工会加入自私矿池,最终导致比特币成为一个由单一矿池控制的中心化记账系统。
PoS的诞生解决了PoW中的资源浪费问题以及潜在的51%算力攻击。在PoS机制中,攻击者想要实施攻击必须掌握系统中超过50%的货币,这个先决条件比起PoW中的大量算力需要付出更大的代价,即使攻击者募集到了足够发起攻击的货币量,他也必须极其慎重地考虑是否发动攻击,因为一旦PoS系统受到攻击(不管是对系统的攻击还是对账本的攻击),那么攻击者所拥有的货币必然将贬值,他受到的损失很可能超过攻击所带来的收益。
但是PoS这种不需要任何代价(或者说极少代价)即可进行挖矿的模式也为它带来了很多安全问题。
PoS中的矿工挖矿时在本地并不需要像PoW一样付出大量的算力代价,他们只需要执行少量的运算就能得到记账资格。
当区块链发生分叉时,假设此时矿工拥有系统10%的货币,此时分叉A成为主链的可能性为10%,分叉B成为主链的可能性为90%,如果矿工仅在A链上挖矿,那么他挖矿成功的可能性就是1%;如果他仅在B链上挖矿,那么他挖矿成功的可能性是9%;如果他在A、B这2条链上同时挖矿,他就能最大化他的挖矿成功可能性[29]。在这种情况下,攻击者需要做的仅仅是制造一条分叉,这甚至不需要付出任何代价就能分离区块链网络,打破一致性原则。
长程攻击和PoW中的攻击方式一样,是由于“最长链”原则的存在才导致的。PoS中的节点会默认接收系统中存在的最长链作为主链,也就是说一旦攻击者创造出一条比当前链更长的链,他就能成功发起攻击。由于PoS中的挖矿几乎不需要付出任何代价,所以这种创造出一条比主链更长的链的攻击方式远比在PoW中更加容易。
假设目前主链的长度为n,攻击者为了创造出一条比n更长的链,他需要在这条链的头部选取一个时间点t,假设在t时链的区块长度为λt,在这λt个区块后进行挖矿。这时攻击者落后主链n-λt个区块,用qt表示在这个点时攻击者货币所占全网货币比重,pt表示诚实矿工货币所占全网货币比重,可以得到:
(6)
其中P(t)为攻击者选取时间点t追赶上主链的几率。由公式(6)可知,如果在t时,攻击者拥有系统中超过51%的货币,那么他总能保证这条链超越主链,并且由于PoS中没有出块时间限制,攻击者可以在短时间内产生大量区块来追赶主链,这就是长程攻击。为了在t时获得足够的货币,攻击者可能会通过各种方法获取系统早期用户的私钥,这在理论上是可能的,因为很多区块链早期用户可能为了短期利益卖掉自己的私钥。
通过以上分析,如表1所示,得到在部分同步网络模型下3种共识机制的安全性对比。
表1 安全性对比
由表1可见,在部分同步网络下,PoW和PoS在一致性和敌手模型上完全相同。PoW中由于双花攻击和自私挖矿这2种攻击方式的存在,区块链无法保证不会产生分叉;PoS由于无利害攻击的存在,也无法保证在同一时间段只有一条主链的存在。由于两者都是采用节点竞争记账权的模式,PoW中需要节点掌握50%以上的算力才能保证获得记账权,而PoS中是50%以上的货币,因此两者的敌手攻击模型都是n=2f+1。PBFT可以保持强一致性,但是其假设很容易被女巫攻击打破,只要存在超过1/3的恶意节点就能瘫痪系统,因此敌手模型为n=3f+1。
但是,在实际情况中,三者的安全性分析远比这更加复杂。例如,PoW中的算力和PoS中的货币实际上并不能划等价符号,攻击者取得PoW区块链系统中50%的算力和PoS区块链系统中50%货币所要付出的代价实际上相差较大;如果对PoS发起无利害攻击,攻击者甚至不需要50%的货币,敌手模型可以比n=2f+1更小;在PBFT中,节点甚至能使用女巫攻击发起双花攻击,从而打破PBFT的强一致性。
共识机制是区块链的基石,共识机制的安全性意味着区块链的安全性。通过对目前3种主流的共识机制进行分析对比,可以发现区块链中仍然存在着能够导致区块链系统崩溃或是篡改区块链账本的攻击方式,这些攻击不只会对用户体验产生影响,同时也会造成社会对区块链技术信用度的下降;同时,现阶段对共识机制安全性的研究往往集中于单一共识机制,对于共识机制的安全性分析并没有一个统一的框架,不同共识机制之间很难进行一般性的安全性对比。
未来,为了提高区块链技术的信用度,加快区块链项目的落地,解决共识机制所面临的攻击问题是区块链技术的重要发展方向之一。另外,对共识机制建立可证明的安全框架也不可忽视,尤其是能够适用于多变量模型下的安全性分析。