在《0基础学习区块链技术——分叉》一文中,讲解了区块链分叉相关的原因。这种分叉是CAP原则的结果,大部分分布式系统都会优先保证Availability(可用性)和Partition Tolerance(分区容错性)。而对于Consistency(一致性)则相对宽松。也就是说并不要求无时无刻保持强一致性,可以容忍在相对短的时间内出现不一致的情况。之后通过后续的其他策略进行补偿,从而达到最终的一致性。
在这篇文章中我们还看到了:一条被部分人认可的主链并不一定会成为最终的主链。因为最长链原则的存在,导致区块链网络中某条链在某种原因下率先新增了一个区块,从而导致他比其他区块的高度更高。这样其他区块就会同步该区块链全部区块。它也就进化成为主链了。
比如上图,链高度是4时,1 2 3’ 4’‘被多数链采纳;
之后最上面一条链最先完成了上区块,同时最下面一条链也完成了上区块。而中间三条链都没有上区块,导致它们的高度比最上和最下两条链都要短。这个时候中间三条链会选择某条链进行同步。上图中它们同步了最上面一条链,即1 2 3 4’ 5’。
最后一条链在后面上区块6时和第一条链又同时发生。但是此时中间三条链由于种种原因,也没抢先上链,于是它们又要选择同步某条链。此时它们选择了同步最下面一条链,即1 2 3 4 5 6。
后面的4条链中某条链上了区块7,且早于其他链上区块。于是全网的区块链在此时达到一个短暂的一致性,即1 2 3 4 5 6 7。
后面新增区块8时,又由于种种原因,出现了分叉。
所以我们看到区块链网络中,统一和分叉是一直在进行和发展的。这就引出一个问题:历史上在区块上的交易记录,可能在某个时间点就不不存在了。因为包含它的那些链,因为后续有其他链比它们长,而被替换掉了。
理解了上述可能存在的现象,我们就可以想象如何利用这个原理做点坏事。
这也就是本文要讲的51%攻击和双花问题。
什么是51%攻击?很多文章的解释是:掌握了51%的算力。这个解释有点抽象,是“黑客”掌握了全网51%的机器资源吗?那它又是如何做到入侵这么多机器资源的呢?实际情况远没有这么复杂,我们通过一个案例来介绍它和双花。
参与区块链网络
黑客将自己的计算机和自己特殊定制的软件加入到区块链网络,并充当全节点。这个时候它需要和其他全节点通信,以获取全部区块数据。
购买资产、控制一条链
黑客转账购买资产,花费了500万。这条交易记录被全网广播,并被其他矿工打包进入主链。
但是黑客控制的区块链会过滤掉这条交易记录,但是会接受验证节点发送的其他交易记录,并依据这些记录打包出自己的区块。这条被控制的区块链在收到其他区块链通知同步数据时什么都不做,它只是专注于黑客自己控制的矿机挖掘的区块,并将这样的区块上的自己的链上。这个区块链不包含自己的交易记录。
转移资产
黑客此时要把购买的资产转移到安全的地方,因为等下它就要发起攻击了。
这一步非常重要,它牵扯到信任机制。
因为有分叉的存在,所以即使交易记录上链也不能意味着这笔交易最终被确认,因为未来的某个时间点,可能因为最长链原则,包含这笔交易的区块被其他更长的链替代。难道我们就要无穷无尽的等下去吗?实则不是。现实中大家一般认为经过6次确认,或者说包含交易的区块之后上链了5个其他区块,那这笔交易基本可以认为是确认了。因为理论上来说,这样的链是不容易被整体替换的了。
但是只是“不容易”,实则还可以。但是大部分人因为现实原因,选择相信“不容易”就是“不可以”。
这样商家在查看到交易被“确认”后,就放心的把客户购买的资产给兑现了。
51%攻击
攻击者自己维护的链上是没有自己交易记录的,这点非常重要。
在计算区块6的时候,全网矿工和黑客控制的矿工在竞赛,看他们谁先产出第一个区块。
假如黑客的矿工这次优先产生了区块,它会在上链后,快速告知全网,让全网的节点来同步自己的区块链。假如全网都同步了它的完整区块链,那么它之前发起的交易会全部抹掉。这样现实中它套现了1000W,而区块链网络上自己的1000W还存在。这就是双花,即一笔钱可以花两次。
假如黑客的矿工这次没有优先产出区块,则它继续保持缄默,持续挖下去,一直到它抢到第一个区块为止。
所以这个过程是黑客的矿机和全网其他“诚实”矿机比拼的过程。所以51%只是一种代称,即表示黑客在此次的计算结果更快。而不是它入侵了51%的矿机。
分叉在“双花”中的其他用处
比较有意思是,由于分叉一直存在,所以即使双花产生了,也可能有某个隐秘的区块链没有同步,而是自己衍生出一条链,这条链就包含了黑客历史交易记录。于是我们可以通过这条链来找到攻击前原来的样子。
如下图,No.6的链就记录了之前大部分区块链认可的历史。
但是随着时间推移,在无认为干预的情况下,No.6要对抗全网算力,最后它还是会被其他链覆盖。到时候整个区块链网络上就找不到黑客发起的攻击记录了。