35

文章目录

  1. 摘要
  2. 背景
    1. 矿池
  3. 详细内容
    1. 基本攻击模型
    2. 单攻击者模式
    3. 双攻击者模式
    4. 实际问题
      1. 攻击检测
      2. 对于区块链的影响
    5. 可能的解决方案
  4. 结束语
  5. 引用

摘要

加密货币系统中矿工越来越多,特别是近几个月比特币价格居高不下,加密货币系统的算力也越来越强。这导致个人矿工如果单独挖矿几乎不可能挖到,所以现在几乎所有的矿工都加入了矿池,矿池在一定程度上可以稳定矿工的收益。

算力较小的矿工难以挖到新的区块,这就衍生出对矿池的一种攻击。攻击者可以将自己一部分算力拿出来加入到其它的矿池去挖矿,但是自己挖到区块之后,不交给所在矿池。这样攻击者对于矿池永远没有贡献,却享受着矿池中其它矿工带来的收益分成。我们称这种攻击为区块扣留攻击(Block WithHolding, BWH)。

本文对于矿工之间的这种攻击,进行了博弈建模分析。在单攻击者模式下,攻击者永远可以获取比诚实挖矿更高的收益。在双攻击者模式下,攻击者之间就会陷入著名的囚徒困境。

背景

矿池

我们以比特币为例介绍矿池的基本工作原理。比特币挖矿过程就是寻找一个区块满足其哈希值小于某个特定值。为了控制新区块的产出保持在一个固定的速率,这个难度值会不断调整。矿工们组成矿池,共同计算这个哈希值,得到一个满足要求的哈希值(产生一个区块获取收益)后,大家按贡献分享挖矿带来的收益。基本工作模式如下:

矿池工作原理

矿池将工作任务分发给矿工,矿工们完成矿池分发的任务,由于挖矿难度大,绝大部分矿工无法挖出区块。于是,这些无法挖到区块的矿工,会定时向矿池提交当前自己计算出的最好的结果($pPoW$)。矿池对矿工提交的$pPoW$进行统计,一旦有一个矿工挖到了区块,也就是上图中矿工2提交的全工作量证明$fPoW$,那么矿池就根据前一轮统计的矿工的工作量,将收益按比例分发给矿工。一些矿池会设置一个阈值,在矿工累积工作量到达一定值的时候才会发放奖励,以降低交易成本。

本文提到的$BWH$攻击就是如下图所示,矿工2在挖到区块后,不交给矿池而是扔掉。

BWH攻击

详细内容

基本攻击模型

攻击者矿池$A$,将其部分挖矿算力渗透到受害者矿池$B$中,渗透算力为$r$。我们称称渗透到受害者矿池挖矿的矿工为渗透矿工。渗透矿工只会提交$pPoW$(部分工作量证明)用于受害者矿池统计他们的工作,而渗透矿工永远不会提交$fPoW$(全工作量证明)。

$BWH$攻击会对挖矿造成以下三方面的影响:

  1. 受害者矿池,其挖矿算力没有变(不算渗透矿工),但是分享收益的人变多了
  2. 攻击者矿池,由于它分了一部分矿工去攻击别人,因此它自身的算力减少,自身矿池收益也减少了;但是,他可以从受害者矿池获取渗透矿工的收益分成
  3. 由于渗透矿工只打雷不下雨,导致整个区块链的算力下降,从而会导致整个区块链的挖矿难度下降

在这个挖矿游戏中,矿池需要做两个选择:

  1. 是否进行$BWH$攻击?
  2. 若攻击,使用多少渗透算力?

下面我们分两种情况分析。

单攻击者模式

单攻击者模式示意图如下:

单攻击者模式

我们假设网络中存在一个攻击者矿池1,受害者矿池2以及其余的矿工。设整个区块链的矿工算力为$m=1$,矿池1的算力为$m_1$,矿池2为$m_2$,渗透矿工算力为$x_{1,2}, (0 \le x_{1,2}\le m_1)$。矿池1和矿池2的收益分别为:

$$ \begin{align} R_1 &= \frac{m_1 - x_{1, 2}}{m - x_{1, 2}}\\ R_2 &= \frac{m_2}{m - x_{1, 2}} \end{align} $$

我们用收益除以算力,得到矿池的收益率分别为:

$$ \begin{align} r_1 &= \frac{R_1 + x_{1, 2}*r_2}{m_1}\\ r_2 &= \frac{R_2}{m_2 + x_{1, 2}} \end{align} $$

由于单攻击模型下,矿池2不会对矿池1的攻击做出反应,因此矿池1只需找出$\hat{x_{1,2}} = argmax_{x_{1,2}}r_1$。

根据上述$r_1$的公式,我们画出在不同$m_1, m_2$算力的情况下,投入$x_{1,2}$作为渗透算力的情况下的收益图。

投入不同攻击算力时的收益情况

其中横坐标为投入的攻击算力$x_{1,2}$,纵坐标为$r_1$。从图中我们可以分析出:

  1. 攻击者算力一定的情况下,受害者矿池的算力越大,攻击者可以获得的额外收益也越高
  2. 受害者矿池算力一定的情况下,攻击者的算力越大,可以获得额外的收益也越高
  3. 攻击者投入攻击算力超过一定阈值之后,收益率会快速下降,并且很可能低于诚实挖矿算力
  4. 此类攻击,整体额外收益不高,特别是在攻击者算力较小的情况下,额外收益很少,不值得实施

双攻击者模式

如果矿池中有两个矿池互相使用$BWH$来进行攻击,那么其收益如下表所示:

在有一方进行攻击时,和我们之前分析的一样,攻击方可以获取收益。但是如果两个矿池都攻击对方,那么他们都会浪费算力,这部分浪费的算力不会给双方带来任何收益,在此情况下,双方收益都下降。

这是经典的囚徒困境问题:对于矿池2来说,不管它攻击不攻击矿池1,只要矿池1攻击它,它的收益就是下降的;反过来也一样。所以对于矿池2来说,它最好的策略就是攻击,因为只有攻击才有可能提高收益。

实际问题

攻击检测

$BWH$攻击的检测还是比较简单的,攻击者只需要对比自己的挖矿算力和挖矿收益,查看是否差别过大就可以。但是,检测到并没有什么用,它无法分辨出是谁进行的攻击,因为小算力的矿工,正常情况下本来就很难挖到区块(比如一年才能挖到一个),这样即使一个矿工长时间没有提交$fPoW$,也不能说明它就是攻击者。

矿池还可以通过统计每个矿工的收益是否与其提交的$fPoW$成比例,但这基本也是没有用的。一来,攻击者可以将算力分解为大量的小矿工,让统计作用变得基本无用;二来,攻击者还可以不断的变化$ID$,这样针对之前ID的统计也就自然失效了。

对于区块链的影响

$BWH$攻击如果持续时间较长,对于矿池来说很容易检测到。这样矿池可能倾向于只使用自己可行的矿工来挖矿,这样可以降低矿池的大小,在一定程度上可以缓解区块链中心化的问题。

可能的解决方案

  1. 采用一种特殊的区块链结构,可以让矿池主进行钓鱼。也就是说在新的区块链结构下,矿主可以发送一个已知可以产生工作量证明的任务,如果矿工没有提交一个全工作量证明那么攻击者就被发现了
  2. 矿池可以适当收取一些佣金,由于$BWH$攻击本身收益并不高,收取佣金可以提高攻击的门槛

结束语

本文分析了区块扣留攻击$BWH$:

  • 攻击在只有一个攻击者的情况下,攻击者总是可以通过此种方式来获取更高收益。但是如果攻击者的算力较小,那么额外收益也很小。
  • 在双攻击者模式下
    • 攻击者之间陷入了囚徒困境。不管己方矿池采取什么操作,只要对方矿池进行攻击,己方的收益就会减少
    • 受害者矿池越大,攻击者可以获得的收益就越高,因此大的矿池更容易收到攻击,这对于矿池的扩大有一定的抑制作用

引用

[1] Eyal I. The miner's dilemma[C]//2015 IEEE Symposium on Security and Privacy. IEEE, 2015: 89-103.