区块链作为一种去中心化的分布式公共数据存储系统,其并没有中央管理机构进行管理工作,而是通过分布式节点共同利用密码学协议共同维护,而各个节点在维护整个系统的时候要通过底层的共识协议来保证账本的一致性。区块链在不同的现实场景中发挥的实际用途不同,比如公链,私链,联盟链,不同的链使用的共识算法也有所不同,比如比特币使用的PoW共识,以太坊使用的PoW共识,EOS使用的DPoS共识,而不同的共识算法所涉及的安全性又有所区别。
本文将详细介绍比特币和以太坊使用的PoW共识协议中存在的攻击风险。
首先让我们来看看什么是PoW共识协议。
从去中心化账本系统的角度看,每个加入这个系统的节点都要保存一份完整的账本,但每个节点却不能同时记账,因为节点处于不同的环境,接收到不同的信息,因此需要有共识来达成哪个节点有权记账。比特币和以太坊区块链通过竞争记账的方式解决去中心化的记账系统的一致性问题, 即以每个节点的计算能力即“算力”来竞争记账权的机制,在竞争记账权的过程就是“挖矿”。
然而,在一个去中心化的系统中,谁有权判定竞争的结果呢?比特币和以太坊区块链系统是通过一个称为“工作量证明”(Proof of Work,PoW)的共识机制完成的。
PoW(Proof of Work),即”工作量证明”,简单地说,PoW就是一份确认工作端做过一定量工作的证明。工作端需要做一定难度的工作得出一个结果,验证方通过结果来检查工作端是不是做了相应的工作。
在通过工作量证明共识进行的挖矿行为中,需要遵守三个规则:
一段时间内只有一个人可以记账成功
通过解决密码学难题(即工作量证明)竞争获取唯一的记账权
其他节点验证并复制记账结果
举个例子,给定字符串“blockchain”,我们给出的工作量要求是,可以在这个字符串后面连接一个称为nonce的整数值串,对连接后的字符串进行SHA256哈希运算,如果得到的哈希结果(以十六进制的形式表示)是以若干个0开头的,则验证通过。为了达到这个工作量证明的目标,我们需要不停地递增nonce值,对得到的新字符串进行SHA256哈希运算。
1 2 3 | Hash(上一个Hash的值, 交易记录信息集合) = 29329385BNDH749 Hash(上一个Hash的值, 交易记录信息集合, 随机数nonce) = 000029329385BNDH749 |
比如比特币中区块高度为512884的区块的Hash为:
1 | 000000000000000000188d44fd53064469b17c3590a0c4df8e90626d11e25a69 |
通过记账产生此区块的工作量证明为16**18
次hash计算,这是一个非常大的计算量。
通过简单介绍了通过记账来打包区块以及PoW的简单原理之后,回到我们的问题上来,什么是51%攻击,什么是双花攻击?
双花攻击,简单来说就是指将一个代币通过多次支付手段发起的攻击,也就是指同一个货币被花费了多次。发起双花攻击的方式有很多,包括以下几种形式:
51%攻击
种族攻击
芬妮攻击
Vector 76 攻击
替代历史攻击
也就是说如果攻击者掌握了全网超过50%的计算能力时,可通过51%攻击造成双花问题。
这里我们只分析51%攻击过程。
51%攻击,又被称为Majority attack。这种攻击是通过控制网络算力实现双花。如果攻击者控制了网络中50%以上的算力,那么在他控制算力的这段时间,他可以将区块逆转,进行反向交易,实现双花。
在PoW共识协议里,区块链系统同时允许存在多条分叉链,而每一条链都可以对外申明自己是正确的,但是在区块链的设计理念中有一个最长有效原理:“不论在什么时候,最长的链会被认为是拥有最多工作的主链。”
下面我们简单模拟一下51%的攻击过程:
如果存在这样一个攻击者,它刻意把第一笔交易向一半网络进行广播,把第二笔交易向另一半网络广播,然后两边正好有两个矿工几乎同时取得记账权,把各自记账的block广播给大家,此时选择任意一个账本都可以,这时候原来统一的账本出现了分叉,如下图:
接下来,下一个矿工选择在A基础上继续记账的话,A分支就会比B分支更长,根据区块链的规则,最长的分支会被认可,短的分支会被放弃,账本还是会回归为一个,交易也只有一笔有效,如下图:
此时A分支被认可,相应交易确认,如果攻击者拿到商品之后,立刻自己变身矿工,争取到连续两次记账权,然后在B分支上联系增加两个block,如下图所示:
于是B分支成为认可的分支,此时A分支被舍弃,A分支中的交易不再成立,攻击者在A分支的支付货币重新有效,但攻击者已经拿到商品,至此成功完成一次双花攻击。
问题了,在B分支落后的情况下要强行让它超过A分支,现实中难度很大,成功的概率很低,但是,攻击者如果掌握了全网50%以上的计算力,那么,即使落后很多,他追上也只是时间问题,这就是上面所说的“51%攻击”。
在区块链的现实世界里发送过很多次因为51%攻击导致的双花。
比如Bitcoin Gold 发生的双花问题就属于51%攻击,攻击过程如下:
攻击者控制Bitcoin Gold网络上51%以上的算力,在控制算力的期间,他把一定数量的BTG 发给自己在交易所的钱包,这条分支我们命名为分支A。
同时,他又把这些BTG 发给另一个自己控制的钱包,这条分支我们命名为分支B。
分支A 上的交易被确认后,攻击者立马卖掉BTG,拿到现金。这时候,分支A成为主链。
然后,攻击者在分支B 上进行挖矿,由于其控制了51%以上的算力,那么攻击者获得记账权的概率很大,于是很快分支B 的长度就超过了主链(也就是分支A 的长度),那么分支B 就会成为主链,分支A 上的交易就会被回滚,将数据恢复到上一次正确的状态位置。
也就是说,分支A 恢复到攻击者发起第一笔交易之前的状态,攻击者之前换成现金的那些BTG 又回到了自己手里。
最后,攻击者把这些BTG,发到自己的另一个钱包。就这样,攻击者凭借51%以上的算力控制,实现同一笔token 的“双花”。
据此次攻击区块链数据报道,攻击者成功逆转了22个区块,涉及此次攻击的比特币黄金地址已收到超过388200个 BTG,假设所有这些交易都与双花相关,攻击者可能已经从交易所窃取了价值高达1860万美元的资金,涉及此次攻击的比特币黄金记录如下图所示:
除了Bitcoin Gold 发生的双花问题之外,还有很多由于51%攻击导致的双花攻击案例:
匿名数字货币verge曾在短短几个小时内恶意挖掘了超过3500万个XVG,价值约175万美元。
日本加密货币monacoin在一名矿工获得高达57%的网络算力后明显遭到扣块攻击。
莱特币现金(LCC)官方消息,LCC曾遭到了51%攻击。
数字货币ZEN也遭受到了51%攻击。
近日的以太坊经典ETC遭受51%攻击。
来说说近日以太坊经典ETC的51%攻击,据区块链安全情报显示,一个地址以0x3ccc8f74开头的私人矿池算力发生了较大波动,这个私人矿池的算力目前占比ETC整个网络算力的63%。也就是说,该矿池目前控制ETC网络的大部分算力,这是51%攻击的先决条件。针对此次攻击的分析见coinbase的文章:https://blog.coinbase.com/ethereum-classic-etc-is-currently-being-51-attacked-33be13ce32de
文章说在1 月 5 号监测到第 1 次双花攻击,之后又发现了 8 次双花攻击,总共涉及到 88,500 枚 ETC (约$460,000),但是文章中未说明这次双花攻击的目标是谁,已经是谁发起了这次双花攻击。
根据以往发生的51%攻击案例,51% 攻击一旦成为真实场景下的成熟攻击方法,各个公链都需要小心,虽然通过51%攻击需要很大代价,但是在小币种公链网络中呢?况且,没有50%以上的算力,还是有机会成功的,只是概率低而已。
无论工作量证明的PoW,还是权益证明PoS,还是委托权益证明DPoS,只要在共识问题里面,理论上讲都无法避免出现 51% 攻击情况,在不同共识机制的实现中还可能存在各种其他问题,而且在熊市的这段时间里,算力下降,币价大跌,主网相对更加脆弱的,更容易出现51%攻击问题。
目前,零时科技安全团队针对51%攻击的解决方案主要有如下几种:
提高确认次数至 500 个以上。
改善共识机制。例如,由原先的PoW改为PoW + PoS。
升级新的公司算法。比如Bitcoin Gold遭受51%攻击之后表示,将开发新的 PoW 算法以替代原有的 Equihash 算法。
与数字资产交易平台合作,同步相关信息,阻断黑客的套现渠道。
通过第三方专业区块链安全团队应急处理。