1703866715
1703866716
1703866717
1703866718
1703866719
图5.15 分叉攻击
1703866720
1703866721
注:一个恶意的矿工给受害者鲍勃发送了一些比特币来购买其服务和货品。然后这个矿工进行了一个分叉攻击,创建了一个包含冲突交易的更长的分叉,在新的共识链中给鲍勃的支付就变成了无效的交易。
1703866722
1703866723
想要这个攻击成功,被分叉的区块链必须要覆盖当前最长的一条链,一旦这个情况发生,支付给鲍勃的交易就不再存在于共识的区块链里。如果这个矿工掌握占优势的哈希算力的话,也就是说α > 0.5,这种攻击就会成功。也就是说,即使有大量的随机变数,这个分叉最终会变成最长的一条链,也就是正当有效的共识链。甚者,因为这些币已经被用过了(在新的共识链上),这笔支付给鲍勃的交易永远不可能再回到区块链上了。
1703866724
1703866725
51%是必要的吗?如果α > 0.5的话,发动一个分叉攻击是很有可能发生的。但在实际中,用稍低的算力也可以发动一个那样的攻击,因为有类似于网络拥塞之类的其他因素。在主链上挖矿的其他矿工会因为一个正常的原因产生一些过时的区块——因为有网络延时。但是一个中心化的攻击者本身则不会有这个延迟,他可以进行更快速的通信并且生成更少的过时区块,这可能会节省1%甚至更多的算力。
1703866726
1703866727
拥有近乎50%算力的攻击者可能需要花很长时间才可能成功,因为有随机性。算力超过50%越多,攻击就会变得越容易也越有效。人们经常讨论51%的攻击,是因为51%是一个分水岭,超过51%的时候分叉攻击就会成为可能。实际上,这种攻击的成功概率是呈梯度变化的。
1703866728
1703866729
可操作的对策。我们不清楚分叉攻击在现实中是否一定成功。因为大家可以觉察到这个攻击,社区可以对此做出决定,即使分叉链更长也可以拒绝接受。
1703866730
1703866731
攻击和币值(exchange rate)。更加重要的是,这种攻击可以摧毁大家对比特币的信心,比特币的拥有者们就想要把资产转移出去,以至于比特币价格崩溃。因此,虽然一个具有51%算力的攻击者可能会在短期内利用双重支付进行欺骗并获得额外的收益,但是从长期来看,其实他们这么做造成的损失可能更大。
1703866732
1703866733
所以发动这种攻击的人其实是想通过打击信心来摧毁比特币。有点类似于邦德电影里的反派想要对诺克斯堡里的所有的黄金进行辐射污染,使其变得没有价值一样,这类攻击被称为金手指攻击(Goldfinger attack)。这种攻击者的目的可能就是摧毁整个货币,可能是由于他可以通过要么做比特币空头交易,要么拥有大量的竞争货币而获益。
1703866734
1703866735
通过贿赂来进行分叉攻击
1703866736
1703866737
通过购买足够多的矿机来控制大部分的算力,是一件非常困难而且昂贵的任务。但可能还是会存在其他简单的方法来进行分叉攻击:相比直接购买算力以获取超越所有其他人算力的昂贵做法,贿赂那些有能力的矿工来为你来工作也是可能的。
1703866738
1703866739
有几种贿赂其他矿工的方法。其中一个方法是“系统外的”(out of band)——可能找到一些矿工然后直接用现金来贿赂他们。当然一个更加聪明的办法是创建一个新的矿池,然后提供更好的奖励来吸引其他矿工来加入,即使矿池运行可能因此而亏损。虽然这种奖励不可能长期维持下去,但是可以维持足够长的一段时间直到可以发动一个成功的分叉攻击,然后获利。还有一种方法是在你的分叉区块链里留下足够多的“小费”,多到足以让其他矿工离开最长链来加入你的分链,矿工们希望你的链成为最长的链,这样一来他们可以收取你留下的小费。
1703866740
1703866741
不管是哪种贿赂的方式,核心思路都是一样的:有别于直接获得大量算力,攻击者去贿赂那些已经拥有算力的人,让他们帮助自己分叉出另外一条最长的区块链。
1703866742
1703866743
可能矿工们并不愿意去帮助一个攻击者,因为这么做会危害整个货币的价值,而他们已经在此之上投入了相当多的资金和矿机。从另一方面看,虽然矿工们作为一个整体可能希望保持货币的价值,但是他们可能做不到一致行动。个别矿工可能会因为短期利益,将个人利益置于集体利益之上。从经济学的角度来看,那就是个经典的“公地悲剧”了。
1703866744
1703866745
这些假想在现实中未曾发生。贿赂攻击是否可行,这依旧是一个悬而未决的问题。
1703866746
1703866747
临时保留区块攻击
1703866748
1703866749
假设找到一个区块之后,默认的做法是你会立刻向全网宣布找到的区块。但是如果你想进行一个临时保留区块攻击(temporary block-withholding attacks),你也可以不立刻宣布,然后在这块上面继续挖矿,期望你可以在其他矿工找到下一个区块之前连续找到两个有效区块,在整个过程中秘密地保留你所发现的区块。
1703866750
1703866751
如果你已经拥有两个公共区块链上超前的秘密区块,那么全网剩下的矿工所做的挖矿努力都会被浪费,其他的矿工都会在他们认为最长的链上继续挖矿,一旦他们宣布他们找到了一个有效区块,你可以立刻宣布你所秘密保留的两个区块,这样你的区块链立刻变成了最长的有效链,而其他人辛苦挖出来的区块马上就变成了一个孤块而被丢弃(见图5.16),你的这种行为被称为自私挖矿(selfish mining)。通过使网络上的其他矿工浪费算力计算出来的区块瞬间过期,可以有效地增加你的挖矿获利。
1703866752
1703866753
1703866754
1703866755
1703866756
图5.16 自私挖矿图示
1703866757
1703866758
注:图中显示了其中一种攻击方式。(1)攻击之前的区块链。(2)攻击者挖到的区块,保留着,在此之上继续挖矿。(3)攻击者运气很好,在全网其他矿工之前发现了第二个区块,并继续保留。(4)非攻击者找到了一个区块,并进行广播。攻击者立刻广播他所保留的两个区块,使得区块4变成了孤岛,浪费了其他人之前所用的算力。
1703866759
1703866760
这里面的关键是你需要运气好到连续发现两个区块,风险在于你只领先了一个区块,其他人就已经向网络宣布发现了一个有效区块。如果这种情况发生,你必须立刻宣布你的秘密区块,这叫造成了一个区块的分叉,每个矿工都需要选择哪一个区块继续挖下去。当然,你希望大部分其他矿工最早监听到你的区块并在上面继续挖矿。由于这种攻击的有效性严重依赖你赢得这个竞赛的能力,所以网络位置至关重要。你可以尝试跟所有的节点建立链接,以使得你的区块可以第一个到达其他的节点。
1703866761
1703866762
假设只有50%的机会可以赢得这个竞赛,在α>0.25的情况下,自私挖矿可以比默认策略更有收益。如果α>0.333,即使你输掉每一个这种竞赛,仍然可以获得更高的收益。这种攻击的存在是令人震惊的,原来大家都相信如果没有很大的算力——比如α≤0.5——不会有比默认策略更有利的挖矿策略。所以,即使某个矿工控制的算力低于50%,也是有可能通过切换到其他的挖矿策略来获取更多的收益。
1703866763
1703866764
到2015年为止,临时保留区块攻击仅仅是理论上的,在实际中并没有观察到这类攻击事件,自私挖矿则很容易被检测到,因为这种策略会增加同时宣布区块的概率。
[
上一页 ]
[ :1.703866715e+09 ]
[
下一页 ]