什么是自私挖矿攻击
扫描二维码
随时随地手机看文章
统观点认为,比特币的挖矿协议是激励相容的,它可以抵御少数群体的合谋攻击,并激励矿工按照协议规定的方式进行挖矿。比特币挖矿协议之所以能实现这一效果,是由于它基本可以保证矿工根据其算力占全网算力的比例而获得相匹配的收益。
激励相容:在市场经济中,每个理性经济人都会有自利的一面,其个人行为会按自利的规则行为行动;如果能有一种制度安排,使行为人追求个人利益的行为,正好与企业实现集体价值最大化的目标相吻合,这一制度安排,就是“激励相容”的。
但Eyal等学者在文献[2]中表达了不同的观点,他们认为上述传统观点是错误的,比特币的挖矿协议并非是激励相容的。为了论证其观点,作者提出了一个挖矿策略,该策略可以让少数矿池获得比他们诚实执行挖矿协议更多的收益,而这一策略便是“自私挖矿”(Selfish Mining)。
“自私挖矿”攻击是一种针对比特币挖矿与激励机制的攻击方式,它的目的不是破坏比特币的运行机制,而是获取额外的奖励,并让诚实矿工进行无效计算。简而言之,“自私挖矿”攻击的核心思想是“自私挖矿”矿池(下文中简称为“恶意矿池”)故意延迟公布其计算得到的新块,并构造一条自己控制的私有分支,造成链的分叉。
诚实矿工会继续基于公开分支挖矿,而恶意矿池则基于其控制的私有分支挖矿。倘若恶意矿池计算得到了更多的块,它们维护的私有分支长度自然领先于公开分支,此时,恶意矿池选择不公开这些新块,力求进一步提高挖矿收益。
但由于恶意矿池的算力限制,私有分支的长度优势将无法一直保持下去,当公开分支接近私有分支长度时,恶意矿池将公布所得到的新块,并获得这些块的奖励。该攻击直接导致了诚实矿工之前的计算变为了无效计算。
当然,在攻击过程中,无论是“自私挖矿”矿工(下文中简称为“恶意矿工”)还是诚实矿工都有进行无效计算的可能,只是诚实矿工浪费了更多的计算,而恶意矿工从收益上得到了回报。此外,为了获取“超额”的挖矿奖励,会有越来越多的“理性”矿工转而加入恶意矿池。
攻击策略与收益
首先我们假设初始状态下,公开分支与恶意矿池构造的私有分支长度相同。下面就对“自私挖矿”的攻击策略以及对应收益情况进行分析。(本章节图片摘自文献[3]或基于[3]中图片进行修改,黑色部分代表公开分支,红色部分代表恶意矿池维护的私有分支。其中红色虚线方块代表私有分支中未公开的块,而红色实线方块则代表已公开的块)
(1)当公开分支长于私有分支时,倘若仅通过恶意矿工的挖矿努力,由于恶意矿池与全网其他矿工的总算力差距,私有分支能够追上并超过公开分支的机会是很小的。因此,此时恶意矿池采取的策略是,根据公开分支的变化,动态地更新私有分支,使得两条分支长度相同,并进而基于更新后的私有分支继续挖矿。在该情况下,恶意矿池无法获得收益。
(2)当恶意矿工计算得到一个新块,并使得私有分支比公开分支长度多1个块时,恶意矿池将选择不立即公开该新块,而是基于私有分支继续挖矿。此时会产生两种可能的情况。
a) 在情况一中,诚实矿工基于公开分支计算得到了下一个新块。此时,私有分支失去长度优势。
b) 在情况二中,恶意矿工计算出下一个块,私有分支继续保持对于公开分支的长度优势。
(3)对于上述情况一而言,由于私有分支的优势被消除,恶意矿池将立即公开私有分支,两条分支进入竞争状态,任何一条分支都有取胜的可能。此后,所有恶意矿工将基于私有分支继续挖矿,而诚实矿工则会选择其中的一条分支挖矿(诚实矿工的选择取决于新块通知的传播速度)。
a) 倘若恶意矿工首先计算得到下一个块,恶意矿池将直接公布私有分支,并获得两个块的奖励作为收益。
b) 倘若下一个块被基于私有分支挖矿的诚实矿工计算得到,则此时恶意矿池将得到第一个块的奖励,而该诚实矿工将得到第二个块的奖励。
c) 倘若下一个块被基于公开分支挖矿的诚实矿工计算得到,那么这两个块的奖励则分属于计算得到他们的诚实矿工,而恶意矿池将一无所获。
(4)对于上述情况二而言,恶意矿工继续领先计算出下一个块,此时私有分支就建立了两个块长度的优势,这一优势是恶意矿池比较舒服的一个“安全垫”。恶意矿池会选择进一步扩大收益,也即是延迟公开这两个新块,并继续挖矿。
a) 接下来,每当诚实矿工计算得到一个新块,作为应对,恶意矿池也随之公开一个新块。而倘若恶意矿工计算得到一个新块,恶意矿池则继续不公开该新块。
b) 由于在算力上,恶意矿池相较其他矿工的总和处于劣势地位,故它所控制的私有分支的长度优势大概率会逐渐变小,直至减少为1个块。此时,恶意矿池会立即公布这条私有分支,使其成为当前合法主链,系统再一次恢复到只有一条分支的状态。而恶意矿池也将获得其计算到得的全部新块的奖励。
攻击效果
文献中给出了“自私挖矿”攻击的模拟效果,实验背景大致设定如下。首先作者利用模拟器模拟了1000个节点,这些节点以相等概率进行挖矿。
在这1000个节点中,有1000α(α表示全部节点中“自私挖矿”节点的比例)个节点运行“自私挖矿”算法,而其他节点则是运行比特币挖矿协议的诚实节点。接着,假设两条分支处于等长状态,并将诚实矿工分为两类,γ比例的诚实矿工基于私有分支挖矿,而剩下的γ比例的诚实矿工则基于公开分支挖矿。
从图1中可以看到,γ等于0时,也即全部诚实矿工都基于公开分支挖矿的情形下,若想在挖矿收益上超过正常执行比特币挖矿协议时的收益,恶意矿池最低大约需要掌握1/3的全网算力。
而当γ等于0.5时,也即诚实矿工中,一半人数基于私有分支挖矿,而另一半则基于公开分支挖矿时,恶意矿池实现“超额”收益的门槛则下降至全网算力的1/4。可见,相较于实施51%攻击的算力要求而言,实施“自私挖矿”攻击的门槛要低出不少。
后续研究
介绍到这,有关“自私挖矿”攻击的故事其实还远没有说完。此后,许多针对“自私挖矿”策略优化及扩展的工作相继展开。2016年,Nayak等作者在文献[4]中提出了一种新的挖矿策略“stubborn”,该策略对“自私挖矿”策略进行了扩展。基于该策略,恶意矿池的收益相较于使用“自私挖矿”策略将提高13.94%。
不仅如此,在文中作者还进一步对“stubborn”策略进行了优化,并提出了两个新的策略,即“the EqualFork Stubborn”与“Trail Stubborn”。这两个策略进一步提高了恶意矿池的挖矿收益。
在文献中[5],Carlsten研究了交易手续费对于“自私挖矿”策略的影响。文献[6]则进一步扩展了“自私挖矿”模型,即将恶意矿池与诚实社区之间的延时加入模型。基于此模型,作者提出了一种通过监测“孤立块”比例来检测“自私挖矿”异常行为的方法。
文献[7]则考虑了一个更加通用的假设,即利用贝叶斯博弈公式对“自私挖矿”矿工在策略中的选择行为进行建模,进一步优化了挖矿策略。
总结
随着区块链技术的快速发展,针对它的攻击方式也逐渐增多,“自私挖矿”只是诸多攻击中的一种。其他常见攻击方式包括针对区块链网络层的BGP劫持攻击与Eclipse攻击等,针对POW共识算法与交易过程的平衡攻击与活性攻击等,以及针对智能合约的the DAO攻击、“GovernMental”攻击等。在后续的文章中,笔者将为大家分析这些攻击方式。