旧博文,搬到 csdn
原文:http://rebootcat.com/2020/04/11/network_attack_of_blockchain_51_attack/
自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之初的几年,并且随着比特币价格的一路飙涨,黑客针对比特币网络的攻击就一直没有停止过。据估算,目前大约有 350 ~ 400 万比特币永久丢失,价值大约 240 ~ 280 亿美元。当然其中不只有由于黑客的攻击导致的丢失,毕竟比特币最初的几年很多人都没有意识到比特币的价值,很多的私钥都遗失了。
本文就谈一下目前几种区块链网络攻击,以及其防御方案。
本文尽量用简单易懂的白话来描述,也仅代表我个人的看法,欢迎探讨。
同系列:
在了解什么是 51%攻击前,先简单科普下区块链的几个概念,这里主要以比特币为例作说明。
其实挖矿这个词描述得有点太过于形象了,以至于弄得反而很生涩。当然区块链世界里还有很多玩概念的东西,背后道理其实反而没那么复杂。
在比特币网络里,大家共同在维护一张账目表,参与记账的节点可以称之为矿工,其中矿工需要做的事情就是拼命竞争记账的权利,这个竞争记账权的过程可以称之为挖矿,当一个节点得到这个记账权之后,可以描述为这个节点挖到矿了。那么节点为什么会拼命的竞争这个记账权呢?因为比特币会对挖到矿的节点有奖励。这个奖励是基于区块高度的,最开始是每个区块奖励 50btc,每产生 210000 个区块为一个减半间隔,减半间隔之后奖励会减半。比如目前(2020.04)区块奖励是 12.5btc。
上面这段话里面有两个点需要解释:
针对第一个问题,如果用比较白话的方式讲的话就是,在分布式去信任的系统中,由于有激励的存在,大家都想拿到这个记账权,但是这个记账权在同一时刻(这里用词不一定表示某一刻,更多的形容相对的同一时刻)只允许其中一个节点拿到,并且由这个节点对交易进行记录。这样才能保证这张账本是唯一的,大家看到的是一样的账本。不然大家都来记账的话,这张账本就乱了,这就是称之为 ”共识“ 的由来。
针对第二个问题,很好理解,区块高度或者说时钟高度,其实是用来描述一个区块的序号的,从创世区块 0 开始依次递增。不用过分纠结,本身是一个很简单的东西,或者叫区块序号更容易理解【手动滑稽】,可以看一下下图:
我们打开 BTC.com, 可以看到比特币网络的一些信息,比如区块高度,目前最新的已经到了 625408,区块奖励是 12.57869736btc。我们选择一个区块高度(比如 625400), 可以看到这个区块的信息:
可以看到这个区块高度是 625400, 这个区块里有 243 笔交易,确认数是 9等。这里需要重点关注一下 确认数 这个概念,后面会用到这个概念。
上面提到比特币网络里参与记账的节点竞争记账权的过程称为挖矿,那么除了上面抛出来的两个问题之外,还有一个问题没有解决。
那就是节点通过什么方式竞争,怎么竞争?
竞争的方式就称之为共识,描述分布式去中心化的系统中大家通过共识算法达成统一某个行为或是认知的这种行为,即大家达成了共识,本次由 A 节点进行记账,下次由 B 节点进行记账。
共识算法应该能保证大家能在一定时间内形成共识,同时兼具安全性以及公平性。这样的话参与记账的节点才能有机会获得奖励,才能鼓励大家参与这个网络。
对于比特币来说,采用的是 POW 作为共识算法,即 Proof Of Work(工作量证明)。工作量证明算法是一种应对拒绝服务攻击和其他服务滥用的经济对策。它要求发起者进行一定量的耗时适当的复杂运算,并且这个结果能够快速被其他节点进行验证。
比特币节点需要计算一个 hash,具体过程是对一个随机数加上交易数据做 hash,然后穷举这个随机数,使得 hash 之后的值能满足一定的条件,比如前缀是 ‘0000’。谁先计算出来,谁就在本次记账权的竞争中胜出,然后对交易打包,广播区块,获得区块奖励。显然这里的穷举需要耗费大量的算力,并且计算满足条件的 hash 值不是一件容易的事,基本上可以保证很难有在同一时刻(相对同一时刻)两个或者多个节点都找到了这个满足条件的 hash 值,这也就保证了共识的稳定性。
到这里基本上可以明白一个道理,谁拥有越多的算力,谁得到这个记账权的概率就越大,获得的奖励就会越多。
区块链世界中有很多概念还是很不好理解的,慢慢来,比如这个最长链原则。
在分布式去中心化的系统中,由于网络传输的延迟或者网络故障等不可预知的一些因素,会导致大家收到的交易或者数据是不一致的。在几轮记账之后,势必会出现一些节点看到的区块链和其他节点看到的区块链不一致。
由于大家看到的区块链不一致,也就是有长有短的区块链。比特币规定任何矿工在看到更长的区块链的时候,应该立即停止短的区块链上的挖矿,大家共同围绕这最长的这条链进行挖矿。
如果不了解区块链原理的同学可能会一头雾水,是的,这里的概念还是比较难理解的。下面举一个例子作为说明:
上图可以看到在区块2 之后分叉了,变成了两条链,区块链网络中的一部分节点看到的链是上面这条区块链,另外一部分看到的是下面这条区块链。
矿工在挖矿的时候,或者说节点在做记账权竞争的时候,需要计算 hash,这里会用到最后一个区块的信息,当挖到区块的时候,新产生的区块里会记录上一个区块的一些信息,这样就把整个区块就串起来了,形成一条链。
假设 A 节点看到的是上面一条链,并且基于这条链进行挖矿,在挖矿的过程中收到了下面一条链的区块7 的数据包,校验发现这个区块的高度相比自己的区块6’ 更高,也就是说收到了一条新的更长的区块链,那么诚实的矿工应该马上停止正在进行的基于区块6‘ 的挖矿,转而基于区块7 进行挖矿。一定时间之后上面这条链就废弃了,网络中没有任何节点会保存这条链的信息,大家看到的都是一条最长的区块链。
设想一下,如果 A 节点仍然基于区块6’ 进行挖矿,那么即便挖到了区块,收到的奖励最后也会无效。
这里可能会有人有疑惑,为什么要制定这个最长链原则?大家为什么又要遵守这个规则?从安全角度讲,最长链原则更安全,更难推翻重写;从其他角度讲,这个规则就是区块链世界里的公理,而公理就是指对一些基本的假定,比特币就是这么规定的,不用过分纠结。
细心的同学可能会注意到上面的一个问题,A 节点放弃自己的链,那么这条链从区块3‘ 开始到区块6’ 里面的数据是不是都无效了?里面的交易呢?
答案是的,里面的交易都无效了,因为一个区块是对一堆交易的打包,而对于同一笔交易来说,转账发起方会把这笔交易广播给所有人,也就是对于一笔交易来说,每个矿工都可能会收到这条交易并且放到自己的交易池。那么针对作废的区块3‘ 到区块6’ 里面的交易,虽然在这条链上无效了,但是这些交易也会被其他节点看到,说不定已经被其他节点挖到区块并且记录到下面这条区块链里了。所以针对某笔交易来说,并没有丢失。
在通过上述文章的讲解之后,明白了 ”挖矿“ 的概念,”共识“ 的概念以及 ”最长链原则“ 的概念。接下来可以正式开始介绍 51% 攻击了。
51% 攻击是指如果攻击者拥有全网 51% 的算力,那么他就能够利用算力优势搞一些动作。这里的 51% 是一个概称,实际上运气好的话可能不需要这么多的算力就能发动 51%攻击,比如 45%算力就有成功的可能性。
那么我们来探讨下攻击者会利用 51%攻击做什么事?
攻击者拥有全网超过 51% 算力之后,首先是成功挖矿的概率增大了,由于成功挖矿的概率增大,那么攻击者就能够对挖到的区块进行修改。假设攻击者是理性的,为了利益考虑,那么他会修改区块中关于自己的交易记录,以便双重支付,区块中其他的交易,由于没有发起者的签名,攻击者是不能够去修改的,也就是说攻击者没法做到把别人的币转给自己。
具体做法就是把自己的币转到交易所,卖出后出金提现,然后利用 51% 攻击去修改这笔交易,转到自己的另外一个钱包地址中,由于有算力优势,并且遵循最长链原则,那么之前转到交易所的交易记录被认为是无效的,区块链中记录的是后面这笔交易。也就是同一笔钱花了两次,最终损失的是交易所。这里不一定是交易所,也可能是其他人或者商家等。
但是双花是有可能被检测出来的,还记得上文提到的 “确认数” 吗?那么确认数是什么?
区块链是由一个个区块形象的连接在一起,形成链状。当其中某笔交易发生的时候,会被打包到区块中,然后形成区块链,每追加一个区块,确认数加 1。计算方法很简单,用当前最长链的最新区块高度减去某笔交易所在的区块高度即为确认数。这里需要注意的由于有分叉的可能(参考上面的两条不同长度的链),这笔交易在不同的链里面高度是不一样的,所以正确获得某笔交易所在的区块高度是通过交易哈希去获取的。
同样是区块高度为 625400 的区块,经过编写博文这么一段时间来,确认数从 9 变成了 25,说明 625400 这个区块之后新增加了 14 个区块。
节点会对区块进行校验的,对于双花攻击,节点是有可能在 6 个确认周期内发现一笔交易被双重支付了,从而对交易发起者进行一些惩罚。所以为了预防双花,一般可以增加确认数,对比比特币来说, 6 个确认周期是比较合适的。
那么此次成本和收益怎么样呢?成本就是你需要掌握全网 51% 以上的算力,这个本身就是一个很大的成本;收益就是一笔钱被花费了两次,那么这笔钱有多少就很关键了,如果少的话攻击者肯定是犯糊涂了才会发起这个 51% 攻击,如果这笔钱很大呢?在对交易进行验证的过程肯定也会更加严格,包括在交易所出金提现也是会重重验证,想要快速的脱身恐怕很难。
所以发起 51%攻击不可能是因为一次双花攻击。那么做空比特币呢?
比特币遭到 51%攻击之后势必会导致比特币乃至整个加密货币市场的市值损失,然后攻击者通过比特币期货做空比特币获益。这里其实还是跟获益的大小有关系,如果获益比较小,收益都赶不上发起攻击的成本;如果获益很大,则在实际操作套现过程中会变得很困难,至少是不顺利,风险很大。
上面的讨论基于一个假设是攻击者控制了全网 51% 的算力只持续了一段时间,攻击者的目的也只是想要发起双重支付攻击或者做空比特币,并且快速套现脱身,那么如果攻击者控制了全网 51% 以上的算力持续了很长一段时间呢?
先说我个人的看法,对比特币发起 51%攻击,比特币系统不会崩溃,而且还能恢复,但比特币市值就不好说了,甚至整个加密货币的市值很可能损失 0 ~ 90% 以上。
如果攻击者拥有超过 51% 以上的算力,实际攻击的时候肯定不止 51%,比如达到了70% ~ 90%,并且攻击者控制持续了一段比较长的时间,那么攻击者能够反复进行双花攻击。实际过程可能是这样的:
首先攻击者需要在攻击发起之前买到一定量的比特币,或者说拥有一定量的比特币,那么出售这些比特币,然后利用算力优势发起双花攻击,抹掉出售自己比特币的这些交易记录,相当于自己的比特币与出售之前没什么变化,再次出售这些比特币,然后重复这个过程。
在这个过程中,势必会引起市场的警觉,导致比特币价格一路下跌,只要比特币价格没有跌倒 0,说明有人还愿意收比特币,那么这个攻击就可以持续。直至比特币归零或者其他防御解决方案比如硬分叉重新恢复了比特币网络。这个时候的加密货币市场,肯定是一片哀鸿。
但是从技术层面来讲,即便比特币归零了,比特币网络依然还能够通过诚实的矿工加入,利用全球闲置的大量算力,重新恢复比特币网络。至于比特币价格,这个不做讨论。也就是说 51%攻击能阻断或者影响比特币系统一段时间,但是攻击停止之后还是能够恢复的。这里就不得不提 POW 这个共识的优点了。
本来 POW 是消耗了大量的电力来做算力竞速的,但是在比特币系统接近崩溃的时候,只要有算力的加入,整个区块链网络就能恢复起来。
然而,如果是使用了 POS 的区块链系统,如果发生类似的 51% 攻击,由于共识算法是以 Stake 作为依据的,那么新节点加入并不能带来任何起色,整个网络基本上不可能恢复了。但是这里有个悖论就是拥有 51% 以上 Stake 的攻击者为什么要发起这个攻击?导致自己的币不值钱?真的是人傻钱多,不在乎钱,就想干死这个区块链系统?【黑人问号脸】
其实上面有提到过,发起 51%攻击的成本很高,尤其是想持续一段时间的攻击。那么收益的大小就很关键,但是无论怎么算,收益本身并不高并且风险巨大。
相比拥有 51% 算力诚实的参与比特币挖矿得到的奖励来说,可能都达不到。而且真实场景下,想要发起 51%攻击,门槛很高,并且不可能做到无人察觉。
所以这也就是为什么 51%攻击基本上不可能的原因。但是,,,结合其他的攻击手段,可以降低 51%攻击的算力门槛,比如日蚀攻击,这个在下一篇博文中 浅谈几种区块链网络攻击以及防御方案之日蚀攻击 会做介绍。
关于 51%攻击,大家基本上只需要了解就行了,对于区块链系统来说,基本上不用担心这种攻击,因为有悖论的存在。真正需要关心的是门槛较低,风险较低,收益较高的攻击。
另外,使用 POW 的缺点是很明显的,但是在安全方面又有着很独特的作用,不得不佩服中本聪对比特币系统的设计!!!
51% Attack
51%攻击解析
什么是比特币51%攻击?
是否仅需一次51%攻击,比特币体系即会崩溃?
Blog:
rebootcat.com
email: [email protected]
2020-04-11 于杭州
By 史矛革