可能矿工们并不愿意去帮助一个攻击者,因为这么做会危害整个货币的价值,而他们已经在此之上投入了相当多的资金和矿机。从另一方面看,虽然矿工们作为一个整体可能希望保持货币的价值,但是他们可能做不到一致行动。个别矿工可能会因为短期利益,将个人利益置于集体利益之上。从经济学的角度来看,那就是个经典的“公地悲剧”了。
所以发动这种攻击的人其实是想通过打击信心来摧毁比特币。有点类似于邦德电影里的反派想要对诺克斯堡里的所有的黄金进行辐射污染,使其变得没有价值一样,这类攻击被称为金手指攻击(Goldfinger attack)。这种攻击者的目的可能就是摧毁整个货币,可能是由于他可以通过要么做比特币空头交易,要么拥有大量的竞争货币而获益。
想要这个攻击成功,被分叉的区块链必须要覆盖当前最长的一条链,一旦这个情况发生,支付给鲍勃的交易就不再存在于共识的区块链里。如果这个矿工掌握占优势的哈希算力的话,也就是说α > 0.5,这种攻击就会成功。也就是说,即使有大量的随机变数,这个分叉最终会变成最长的一条链,也就是正当有效的共识链。甚者,因为这些币已经被用过了(在新的共识链上),这笔支付给鲍勃的交易永远不可能再回到区块链上了。
到2015年为止,临时保留区块攻击仅仅是理论上的,在实际中并没有观察到这类攻击事件,自私挖矿则很容易被检测到,因为这种策略会增加同时宣布区块的概率。
关于比特币和加密货币的知识系统化文章,特别是第三部分关于稳定性:
α2这个概率看上去不是很好。就算你掌控了20%的全网算力,也只有4%的成功概率来封杀那笔你不希望出现在区块链上的交易。但这已经不错了,至少你还有可能说动其他矿工来加入你。只要你把你的计划公开了,其他矿工便会知道:如果他们胆敢把这个来自地址X的交易加入自己的区块,便有α2的可能会丧失自己已经发现的区块[被你的羽量级分叉攻击(feather forking)所消灭]。只要他们不是有很强的主观意愿把这个交易包括进来并且这个交易没有很高的交易费,他们可能更愿意规避那α2失掉过往挖矿奖励的风险,而不是获取那笔交易费。
关于挖矿硬件演变的一篇优秀论文:
Bonneau, Joseph, Andrew Miller, Jeremy Clark, Arvind Narayanan, Joshua A. Kroll, and Edward W.Felten. “Research Perspectives and Challenges for Bitcoin and Cryptocurrencies.” Presented at the 2015 IEEE Symposium on Security and Privacy, San Jase,CA,May 2015.
Eyal, Ittay. “The Miner\'s Dilemma.” Presented at the 2015 IEEE Symposium on Security and Privacy, San Jose,CH,May 2015.
图5.15 分叉攻击
我们在这一章花了很多篇幅讨论作为一个矿工的主要挑战:买到好的硬件、找到廉价的电费,然后尽快开始运行,然后期待一些好运气。不过在挑选一个区块开挖之前,每个矿工都需要做一些策略上的选择:
注:图中显示了其中一种攻击方式。(1)攻击之前的区块链。(2)攻击者挖到的区块,保留着,在此之上继续挖矿。(3)攻击者运气很好,在全网其他矿工之前发现了第二个区块,并继续保留。(4)非攻击者找到了一个区块,并进行广播。攻击者立刻广播他所保留的两个区块,使得区块4变成了孤岛,浪费了其他人之前所用的算力。
图5.16 自私挖矿图示
1.需要包括哪些交易?矿工可以选择将哪些交易放进他的区块里。默认的规则是选择那些交易费比较高的交易。
如果你已经拥有两个公共区块链上超前的秘密区块,那么全网剩下的矿工所做的挖矿努力都会被浪费,其他的矿工都会在他们认为最长的链上继续挖矿,一旦他们宣布他们找到了一个有效区块,你可以立刻宣布你所秘密保留的两个区块,这样你的区块链立刻变成了最长的有效链,而其他人辛苦挖出来的区块马上就变成了一个孤块而被丢弃(见图5.16),你的这种行为被称为自私挖矿(selfish mining)。通过使网络上的其他矿工浪费算力计算出来的区块瞬间过期,可以有效地增加你的挖矿获利。
传统观点都认为在比特币里这种黑名单没有办法有效施行。因为即使有些矿工会拒绝把交易放进区块链里,其他一些矿工可能会。如果你真的想把一笔交易列入黑名单,你可以尝试其他一些更加激烈的手段,比如,惩罚分叉(punitive forking),你可以宣布拒绝在包含来自该地址的交易的区块链上工作。如果你拥有大部分市场运算能力,那应该足以保证这个黑名单上的交易永远不会被公布。确实,在这种情况下,其他矿工很有可能不会再试图把这笔交易放入区块链里,因为这么做有可能使得他们自己的区块链被分叉,这会导致他们发现的区块被删除。
一份完整的分析2011年不同矿池激励机制的文章(有些信息有点过时,但是整体上还是值得参考):
不管是哪种贿赂的方式,核心思路都是一样的:有别于直接获得大量算力,攻击者去贿赂那些已经拥有算力的人,让他们帮助自己分叉出另外一条最长的区块链。
直到2015年,交易费还不是那么重要,因为区块奖励在矿工总收入里占比超过99%。但每4年,区块奖励就会被减半,最终区块奖励将会变得很低,低到交易费变成了矿工的主要收入来源。届时矿工会如何应对还属未知。他们会不会更加激进地要求实行最低交易费?矿工会不会联合起来逼迫比特币网络实行最低交易费制度?
现在这个矿工开始跳到前一个区块上开始重新挖矿——就是在那个包含他给鲍勃的支付交易区块之前的那一块。在这个分叉的区块链里,他插进了另一个替代交易——或者进行一个双重支付——把那些已经支付给鲍勃的比特币重新发送回自己的地址里(见图5.15)。
攻击和币值(exchange rate)。更加重要的是,这种攻击可以摧毁大家对比特币的信心,比特币的拥有者们就想要把资产转移出去,以至于比特币价格崩溃。因此,虽然一个具有51%算力的攻击者可能会在短期内利用双重支付进行欺骗并获得额外的收益,但是从长期来看,其实他们这么做造成的损失可能更大。
如果一个矿工想把一个来自地址X的交易列入黑名单,换句话说,他想冻结从该地址出来的钱,让这些钱变得不可用。或许他想用这个办法来敲诈勒索一笔钱,或许他们之间有仇,还有可能是政府执法部门认为那些地址有问题,需要矿工的配合来冻结这些币。
如果没有很大的算力,上述的几个分叉攻击在现实中都不太可能实现。如果你宣布拒绝接受包含某些特定交易的区块链,但这条链被网络上的其他矿工所接受并形成最长链的话,你就会发现自己被永远排除在共识链之外(这就是一个硬分叉),所有你做的挖矿工作统统浪费了。更加糟糕的是,黑名单上的交易仍然存在于最长的区块链上。
默认策略能否在实际运行中一直保持有效,对于这一点我们也没有把握。比特币运行所依赖的现实条件也一直在改变。矿工们变得越来越中心化和专业化,整个系统的算力也越来越大。另外,从长期来看,比特币的奖励将从固定的挖矿奖励为主转变为交易费为主。我们真的不知道这将会如何演变,基于博弈理论对此进行预测也是一个非常有趣的前沿研究领域。
Taylor, Michael Bedford. “Bitcoin and the Age of Bespoke Silicon.”In Proceedings of the 2013 International Conference on Compilers, Architectures and Synthesis for Embedded Systems .Washington,DC: IEEE Press, 2013.
最简单的攻击就是分叉攻击(forking attack),这是一个显而易见的获利方式——重复支付。一个恶意的矿工给一个受害者鲍勃发送了一些比特币来购买其服务和货品。鲍勃等到这笔支付交易被放进了最长链之后,甚至还等到了6个证实的时候确认支付安全之后,才开始发货或者提供服务。
换句话说,考虑到还有其他矿工的存在,用惩罚分叉把特定交易放入黑名单的手段并不可靠。然而,有另一个更明智的方法可以做到这一点。与其一看到从地址X里出来的交易就宣布你会进行永久分叉,不如宣布你将会尝试分叉,但过一段时间你可能会放弃封杀的尝试。例如,你可以宣布:当k个区块证实了从这个地址出来的交易是正当的时候,你便会回到最长链。[1]
Kroll, Joshua A., Ian C. Davey, and Edward W. Felten.“The Economics of Bitcoin Mining, or Bitcoin in the Presence of Adversaries.”In Proceedings of the Workshop on the Economics of Information Security 2013. Berlin:Springer-Verlag,2013.
这里面的关键是你需要运气好到连续发现两个区块,风险在于你只领先了一个区块,其他人就已经向网络宣布发现了一个有效区块。如果这种情况发生,你必须立刻宣布你的秘密区块,这叫造成了一个区块的分叉,每个矿工都需要选择哪一个区块继续挖下去。当然,你希望大部分其他矿工最早监听到你的区块并在上面继续挖矿。由于这种攻击的有效性严重依赖你赢得这个竞赛的能力,所以网络位置至关重要。你可以尝试跟所有的节点建立链接,以使得你的区块可以第一个到达其他的节点。
几篇研究挖矿策略的论文:
拥有近乎50%算力的攻击者可能需要花很长时间才可能成功,因为有随机性。算力超过50%越多,攻击就会变得越容易也越有效。人们经常讨论51%的攻击,是因为51%是一个分水岭,超过51%的时候分叉攻击就会成为可能。实际上,这种攻击的成功概率是呈梯度变化的。
有几种贿赂其他矿工的方法。其中一个方法是“系统外的”(out of band)——可能找到一些矿工然后直接用现金来贿赂他们。当然一个更加聪明的办法是创建一个新的矿池,然后提供更好的奖励来吸引其他矿工来加入,即使矿池运行可能因此而亏损。虽然这种奖励不可能长期维持下去,但是可以维持足够长的一段时间直到可以发动一个成功的分叉攻击,然后获利。还有一种方法是在你的分叉区块链里留下足够多的“小费”,多到足以让其他矿工离开最长链来加入你的分链,矿工们希望你的链成为最长的链,这样一来他们可以收取你留下的小费。
4.什么时候宣布新的区块?当矿工找到一个有效区块之后,他们要决定什么时候向比特币网络宣布这一个区块。默认做法是立刻宣布,但他们也可以选择等一下。
如果你在一个区块证实后便放弃,把那笔从地址X出来的交易成功封杀的概率是α2。原因是你必须要在其他矿工找到下一个区块之前找到连续两个区块,这样才能成功地丢弃那个包括地址X交易的区块。α2是你连续找到两个区块的概率。
Eyal, Ittay, and Emin Gün Sirer.“Majority Is Not Enough: Bitcoin Mining Is Vulnerable,”In Financial Cryptography and Data Security . Berlin and Heidelberg:Springer,2014.
总结来说,理论上矿工可以自由地选择挖矿的策略,但在实际中我们观察到的是大部分矿工都选择了默认策略来挖矿,虽然没有完整的模型可以证明默认策略(default strategy)就是最佳的。在本章中,我们讨论过几个特定案例,有大量算力的矿工有可能执行非默认策略来获取更大的收益。在挖矿策略上,实践是领先于理论的。在实践中,大多数矿工还是选择了默认策略,而且比特币运行得也很好。但是,从理论上,我们还无法论证这是一个稳定的机制。
通过购买足够多的矿机来控制大部分的算力,是一件非常困难而且昂贵的任务。但可能还是会存在其他简单的方法来进行分叉攻击:相比直接购买算力以获取超越所有其他人算力的昂贵做法,贿赂那些有能力的矿工来为你来工作也是可能的。
矿工其实面临很多决定。每个决定都有一个默认策略,直到这本书撰写之时,绝大多数的比特币客户端都是按照该默认策略运行的。非默认策略也有可能使得挖矿收益更高,很多人积极研究如何找到这样的策略。让我们来看看几种可能有别于默认策略的做法,这些做法可能使得挖矿收益更高。在接下来的内容中,我们假设一个运行非默认策略的矿工掌控一定的比特币网络挖掘市场份额,设为α。
3.在同一高度的多个区块中做选择。如果两个不同的区块在同一时间被宣布发现,这就造成了一个区块的分叉,每个区块都是可以被延续下去的,因为它们都符合最长区块链原则。矿工必须选择其中一个区块接龙下去。默认的做法是选择最先被监听到的那一个区块。
51%是必要的吗?如果α > 0.5的话,发动一个分叉攻击是很有可能发生的。但在实际中,用稍低的算力也可以发动一个那样的攻击,因为有类似于网络拥塞之类的其他因素。在主链上挖矿的其他矿工会因为一个正常的原因产生一些过时的区块——因为有网络延时。但是一个中心化的攻击者本身则不会有这个延迟,他可以进行更快速的通信并且生成更少的过时区块,这可能会节省1%甚至更多的算力。
[1] 给自己留条后路,见机行事。——译者注
假设找到一个区块之后,默认的做法是你会立刻向全网宣布找到的区块。但是如果你想进行一个临时保留区块攻击(temporary block-withholding attacks),你也可以不立刻宣布,然后在这块上面继续挖矿,期望你可以在其他矿工找到下一个区块之前连续找到两个有效区块,在整个过程中秘密地保留你所发现的区块。
可操作的对策。我们不清楚分叉攻击在现实中是否一定成功。因为大家可以觉察到这个攻击,社区可以对此做出决定,即使分叉链更长也可以拒绝接受。
2.对哪一个区块进行挖矿运算?矿工可以选择在哪个区块上进行挖矿。默认的做法是在最长的那条区块链上继续挖下去。
假设只有50%的机会可以赢得这个竞赛,在α>0.25的情况下,自私挖矿可以比默认策略更有收益。如果α>0.333,即使你输掉每一个这种竞赛,仍然可以获得更高的收益。这种攻击的存在是令人震惊的,原来大家都相信如果没有很大的算力——比如α≤0.5——不会有比默认策略更有利的挖矿策略。所以,即使某个矿工控制的算力低于50%,也是有可能通过切换到其他的挖矿策略来获取更多的收益。
Rosenfeld, Meni. “Analysis of Bitcoin Pooled Mining Reward Systems.”arXiv preprint arXiv:1112.4980(2011).
这些假想在现实中未曾发生。贿赂攻击是否可行,这依旧是一个悬而未决的问题。
注:一个恶意的矿工给受害者鲍勃发送了一些比特币来购买其服务和货品。然后这个矿工进行了一个分叉攻击,创建了一个包含冲突交易的更长的分叉,在新的共识链中给鲍勃的支付就变成了无效的交易。
这就演化为:其他挖矿者经过理性的思考,将决定加入你对X地址的封杀行动,这样你便可以成功地封杀X即使α<0.5。所以这个攻击要想成功,重点在于确保其他矿工相信你将会进行分叉攻击。