『学概念找员外』挖矿的激励和策略
之前在这挖矿上面用了很多篇幅讨论作为一个矿工的主要挑战:买到好的硬件、找到廉价的电费,然后尽快开始运行,然后期待一些好运气。不过在挑选一个区块开挖之前,每个矿工都需要做一些策略上的选择:
- 需要包括哪些交易?矿工可以选择将哪些交易放进他的区块里。默认的规则是选择那些交易费比较高的交易。
- 对哪一个区块进行挖矿运算?矿工可以选择在哪个区块上进行挖矿。默认的做法是在最长的那条区块链上继续挖下去。
- 在同一高度的多个区块中做选择。如果两个不同的区块在同一时间被宣布发现,这就造成了一个区块的分叉,每个区块都是可以被延续下去的,因为它们都符合最长区块链原则。矿工必须选择其中一个区块接龙下去。默认的做法是选择最先被监听到的那一个区块。
- 什么时候宣布新的区块?当矿工找到一个有效区块之后,他们要决定什么时候向比特币网络宣布这一个区块。默认做法是立刻宣布,但他们也可以选择等一下。
矿工其实面临很多决定。每个决定都有一个默认策略,绝大多数的比特币客户端都是按照该默认策略运行的。非默认策略也有可能使得挖矿收益更高,很多人积极研究如何找到这样的策略。让我们来看看几种可能有别于默认策略的做法,这些做法可能使得挖矿收益更高。在接下来的内容中,我们假设一个运行非默认策略的矿工掌控一定的比特币网络挖掘市场份额,设为α。
分叉攻击
最简单的攻击就是分叉攻击(forking attack),这是一个显而易见的获利方式——重复支付。一个恶意的矿工给一个受害者发送了一些比特币来购买其服务和货品。受害者等到这笔支付交易被放进了最长链之后,甚至还等到了6个证实的时候确认支付安全之后,才开始发货或者提供服务。
现在这个矿工开始跳到前一个区块上开始重新挖矿——就是在那个包含他给受害者的支付交易区块之前的那一块。在这个分叉的区块链里,他插进了另一个替代交易——或者进行一个双重支付——把那些已经支付给受害者的比特币重新发送回自己的地址里。
想要这个攻击成功,被分叉的区块链必须要覆盖当前最长的一条链,一旦这个情况发生,支付给受害者的交易就不再存在于共识的区块链里。如果这个矿工掌握占优势的哈希算力的话,也就是说α > 0.5,这种攻击就会成功。也就是说,即使有大量的随机变数,这个分叉最终会变成最长的一条链,也就是正当有效的共识链。甚者,因为这些币已经被用过了(在新的共识链上),这笔支付给受害者的交易永远不可能再回到区块链上了。
51%是必要的吗?
如果α > 0.5的话,发动一个分叉攻击是很有可能发生的。但在实际中,用稍低的算力也可以发动一个那样的攻击,因为有类似于网络拥塞之类的其他因素。在主链上挖矿的其他矿工会因为一个正常的原因产生一些过时的区块——因为有网络延时。但是一个中心化的攻击者本身则不会有这个延迟,他可以进行更快速的通信并且生成更少的过时区块,这可能会节省1%甚至更多的算力。
拥有近乎50%算力的攻击者可能需要花很长时间才可能成功,因为有随机性。算力超过50%越多,攻击就会变得越容易也越有效。人们经常讨论51%的攻击,是因为51%是一个分水岭,超过51%的时候分叉攻击就会成为可能。实际上,这种攻击的成功概率是呈梯度变化的。
可操作的对策
我们不清楚分叉攻击在现实中是否一定成功。因为大家可以觉察到这个攻击,社区可以对此做出决定,即使分叉链更长也可以拒绝接受。
攻击和币值
更加重要的是,这种攻击可以摧毁大家对比特币的信心,比特币的拥有者们就想要把资产转移出去,以至于比特币价格崩溃。因此,虽然一个具有51%算力的攻击者可能会在短期内利用双重支付进行欺骗并获得额外的收益,但是从长期来看,其实他们这么做造成的损失可能更大。
所以发动这种攻击的人其实是想通过打击信心来摧毁比特币。有点类似于邦德电影里的反派想要对诺克斯堡里的所有的黄金进行辐射污染,使其变得没有价值一样,这类攻击被称为金手指攻击(Goldfinger attack)。这种攻击者的目的可能就是摧毁整个货币,可能是由于他可以通过要么做比特币空头交易,要么拥有大量的竞争货币而获益。