摘要
比特币为矿工提供了两部分激励:区块奖励和交易费。当前,区块奖励占了总奖励的绝大部分,但由于比特币的区块奖励每隔四年减半,随着时间的推移,最终区块奖励会消失,而交易费会成为矿工的挖矿收入的唯一来源。人们潜意识里都认为,无论比特币的激励是从区块奖励来还是从交易费来,都不会影响比特币区块链网络的安全性。本文说明实际情况并不是这样的。
本文的主要发现是:在当矿工只有交易费作为激励时,整个区块的奖励(所有交易费的总和)的方差会由于区块挖出时间的指数分布特性变得非常大$^{[a]}$。此时矿工可能会更加倾向于进行分叉以获得更多的奖励。这显然会给比特币区块链带来负面影响。
本文还分析了在仅有交易费激励的情况下自私挖矿(selfish-mining)的收益情况,结果表明在此情形下,任意算力、任意网络状况的矿工都可以通过自私挖矿来得到更高的收益。
[a] 显然如果区块长时间未被挖出,交易池中的交易会不断累积,此时区块中可以包含更多的交易,收到更多的交易费,此处其实只在区块可以无限大的情况下成立,本文就是在此前提下做的
主要贡献
- 实现了一个挖矿策略模拟器
- 提出了一种新的挖矿攻击undercutting攻击
- 研究在交易费时代的自私挖矿策略
背景介绍
比特币区块链网络的共识协议的运行依赖于矿工们遵守比特币协议。矿工之所以挖矿是因为挖矿有比特币奖励,而目前比特币奖励的市场价格可以覆盖矿工的机器成本。由于比特币的区块奖励每四年都会减半,这导致最终挖矿的奖励仅仅只会由交易费用构成。那么矿工的挖矿奖励是从区块奖励来还是从交易费来对于比特币区块链网络的安全性是否有影响呢?本文对此进行了研究。
详细内容
简单举例
现在我们考虑当区块奖励不存在而有交易费奖励的情况下的一个例子,示意图如上图所示。区块链的当前状态为:头部区块中包含了100个交易,因此自然可以得到100个交易的交易费;同时,现在有5个交易没有被包含在区块链中,矿工后续挖矿时,可以将这5个交易包含在区块中。
接下来,矿工挖矿时有很多种选择,我们考虑其中两种:
- 诚实挖矿策略:矿工继续在最长链后面挖矿,此时矿工的新区块中可以包含5个交易,如果矿工此时挖到了一个区块,那么后续矿工挖矿时,由于后续的交易还没有到来,区块中就没有交易可以包含(自然就没有交易费)
- 分岔策略:矿工选择在头部区块之前的区块上进行挖矿,此时矿工在新区块中就可以包含头部区块中的100个交易,这样区块中最多可以包含$100+5=105$个交易。上图中,我们显示了矿工的一个策略:在自己新挖的区块中包含55个交易,留50个交易给后续矿工
选择一是比特币网络诚实挖矿策略。经过简单的思考,我们可以分析出,选择二对于矿工的选择可能更有利,可以获得更多的交易费奖励,因为在其后挖矿矿工可以包含更多的交易。
显然,这种情况在目前有区块奖励的情况下是不可能发生的。本文的研究结果表明,在交易费时代(没有区块奖励),这种分岔策略很有可能发生。另外,这种激励带来的问题并不是由于交易到来的时间的不确定性导致的,而是由于矿工可以在一个交易池(由所有未被包含在区块链中的交易组成)中进行不同选择带来的。
问题分析
没有区块奖励时,在矿工收到或挖到一个新区块后的时刻,矿工继续挖矿的期望收益为0,因为此时所有的交易都被包含在了刚挖出的区块中。而此时,挖矿的电力消耗却仍然存在,矿工便没有动力继续挖矿。
我们称矿工没有动力继续挖矿的这段时间为Mining Gaps。如上图所示,横坐标为时间,纵坐标为费用,实线为挖矿奖励,虚线为挖到一个区块平均消耗的电费。在一个区块刚挖到的时刻,后续挖矿收益期望为0,此时矿工停止挖矿直到交易费可以覆盖矿工的电费才开始继续挖矿。
系统建模和策略定义
系统建模
本文考虑一种简洁的系统模型,并且基于以下的条件或假设:
- 本文所分析的比特币系统是在区块奖励为0的情况下进行的
- 交易(费)以恒定速率到达,也就是奖励与时间间隔成正比(线性)
- PoW难度不会调整,区块产生的期望时间固定
- 网络无延迟,所有矿工同时收到区块、交易等
- 假设现在交易池中的总交易费为$R$,那么矿工可以选择将其中任意交易费总和为$r \in[0, R]$的交易包含在区块中
- 区块可以包含所有需要包含的交易(不考虑区块大小限制)
挖矿策略定义
本文只考虑在同一个加密货币上的挖矿策略,而不考虑多种加密货币的情况。矿工可以考虑偏离诚实挖矿的策略,策略由三部分构成:
- 哪一个:矿工选择在哪一个区块的基础上挖矿,比如顶部最新区块、倒数第二个区块等
- 多少:选择包含多少交易在区块中
- 时间:选择是否将挖到的区块公开,以及在什么时候公开
挖矿策略模拟器
模拟器在挖矿时,会进行很多轮($round$),$round$是模拟器中最小的时间单元(比如当前区块链每600秒产生一个区块,那么一轮可以设置为$\frac{1}{600}$),显然设置越小越精确。在每一轮中,每个矿工
- 以当前矿工所知道的区块链为输入
- 决定在哪一个区块上挖矿
- 决定区块中包含哪些交易
而后,矿工根据算力进行模拟挖矿,决定是否在当前轮挖到了区块。最后矿工决定是否公开挖到的区块以及公开哪一个区块。
实验中会进行挖矿策略的模拟,每个实验被设计为矿工间的博弈游戏,每次游戏会进行许多轮$(round)$,多轮运行结束后,会记录每个矿工的收益。
每次模拟可以进行一个游戏或者同时进行多个游戏。同时进行多个游戏的目的是为了实时计算每个矿工的收益,然后让矿工实时学习以采用更好的策略。
(后文交易费、交易量会混用,本文不考虑不同交易费的交易)。
策略学习
在一些模拟实验中,为了让矿工可以用当前最好的策略进行挖矿,模拟实验会连续进行多个挖矿游戏。在挖矿过程中,矿工会根据多个挖矿游戏中采用不同策略矿工的收益情况来调整自己的策略。
矿工的学习策略采用博弈论中常用的$no\ regret\ learning$方法,许多no regret learning算法收敛速度都很快。算法会为每个策略维护一个权重,并且根据各个策略在博弈游戏中的表现来调整。模拟器提供了两个可选项:
- EXP3算法[2]:该算法是解决adversarial bandits问题的常用算法,该算法可以保证后悔值保证在一定可接受范围内,它有一个可调节的参数$\epsilon$
- Multiplicative Weights Update Rule (MWU)算法[3]
这两个算法大家感兴趣可以参考相应论文。本文中的插图都使用$EXP3$算法进行模拟的。
挖矿策略
符号定义:
- $H$为区块链网络中最新公开的区块链高度
- $MOST_H^m / MOST(H, m)$为矿工$m$自己的挖出高度$H$的区块(如果有),如果矿工没有挖出高度为$H$的区块,那么$MOST_H^m$定义为高度为$H$且包含总交易量最少的区块
- $B(H)$为高度为$H$的区块
- $R(B)$为区块$B$发布后,网络中剩余交易
- $Gap_i/Gap(i) = R(MOST_{i-1})-R(MOST_{i})$,表示矿工在区块$MOST_{i-1}$基础上挖矿时,挖到区块$MOST_{i}$时最多可以包含的交易费
本文研究了在仅有交易费激励的情况下,如下的一些策略:
默认策略
此为比特币的默认挖矿策略,矿工会在区块中包含所有可能包含的交易,并且会在最新的区块上继续挖矿,挖到之后立即发出
哪一个: 最早接收到的高度为H的区块
多少: R(H)
时间: 立即发布
狭隘(Petty)策略
此挖矿策略基本与默认策略一致,唯一不同的是:在区块链存在分岔时,矿工会选择在那个包含较少交易的区块上继续挖矿(这样矿工就可以在自己的区块中包含更多的交易)
哪一个: MOST(H, m)
多少: R(H)
时间: 立即发布
采用默认策略挖矿的矿工显然不是最优的,使用狭隘策略的矿工的收益显然不会低于比采用默认策略的矿工的。当有分岔存在时,采用狭隘策略的矿工会获取更高的收益。
后分岔(Lazy Fork)策略 (undercutting)
矿工在头部区块中包含的交易量大于剩余交易量时,选择在高度为H-1的区块上挖矿,并且仅在区块中仅包含部分交易
哪一个:- 选择 SELECTED = MOST(H, m): 如果MOST(H)为矿工m自己挖出来的或者R( MOST(H, m) ) > Gap(H)
- 选择 SELECTED = MOST(H-1, m)
在有采用狭隘策略矿工存在时,其他矿工可以通过故意对链进行分岔来获取更高收益。这里的基本思想是:在有采用Petty策略的矿工存在时,采用分岔策略的矿工可以在自己的区块中包含略少于原来高度为H的区块中所包含的交易,这样Petty矿工就会在分岔矿工的区块上挖矿了(因为分岔矿工区块中包含交易少,后续矿工区块就可以包含更多的交易,获取更多交易费)。
在后分岔策略中,分岔时,矿工在区块中包含了一半的交易。但更好的策略是,矿工可能想在 (a) 自己区块中包含更多的交易 与 (b) 最小化自己被采用同样后分岔策略的其他矿工取代风险间进行一个平衡。如果矿工在自己区块中包含了过多的交易,那么显然其所挖到的区块就更容易被其使用后分岔策略的矿工的区块分岔所取代。此处我们定义一个函数$f(x)\in[0, x], \forall x$,以当前可用交易量$x$为输入,输出矿工决定包含在区块中的交易量。
激进策略 (Aggresive undercutting)
矿工总是选择在他们可以包含更多交易的区块上挖矿(根据函数 f 确定)。
哪一个:- 选择 SELECTED = MOST(H, m): 如果MOST(H)为矿工m自己挖出来的或者V-continue(f) > V-undercutting(f)
- 选择 SELECTED = MOST(H-1, m)
- V-continue(f):如果 SELECTED 为 MOST(H, m)
- V-undercutting(f):如果 SELECTED 为 MOST(H, m)
其中:
函数$V$返回的是矿工可以包含多少交易在自己的区块中。
如果矿工选择在$MOST_H^m$区块后面挖矿,称这种行为为$continuing$。如果矿工选择在区块$MOST_{H-1}^m$上进行挖矿,称这种行为为$undercutting$。采用$continuing$和$undercutting$取决于两种情况下对应的$V$值的大小。
对于激进策略而言,一个合理函数$f(\cdot)$函数应该是一个单调增的函数。因此$f(R(MOST_{H-1}^m))$总是比$f(R(MOST_{H}^m))$大,此时选择哪一个区块就取决于$f(R(MOST_{H}^m))$与$Gap(H)$的比较。也就是说,选择哪一个区块只与当前正常挖矿后剩余的交易量($MOST_H^m$区块挖出后剩余的交易)与当前最高区块中包含的交易量($Gap(H)$)有关。
在本文的实验中,只考虑函数族:$f(x) = kx, k\in[0, 1]$。
策略比较
文中的模拟实验考虑了两种类型的矿工:
- non-atomic型:该种类型的矿工算力可以无限分割,并且他们的目标是最大化当前能够得到的利益,而不考虑后续的利益。此类矿工一般用来模拟那些算力小的散户,他们算力较小挖到一个区块后可能再也挖不到第二个区块了
- atomic型:此类型的矿工拥有一定比例的算力(类似于矿池),此类矿工目标是最大化长远利益,比如自私挖矿中就是为了最大化最终收益
这两种矿工在实验中主要体现在策略学习中,也就是策略学习时根据那种标准来衡量一个策略的好坏。
对于non-atomic类型的矿工实验结果如下图所示:
该实验模拟了200个矿工、九种策略,每次游戏产生区块链长度为10000,策略学习参数$\epsilon=0.01$。
上图中横坐标为进行模拟游戏的次数,纵坐标为学习到的各个策略的归一化后的比重。实验显然无法模拟任意多的矿工,实验中模拟时将采用不同策略的矿工算力合成一个大的矿工来进行实验。可以看到随着博弈游戏的不断推进,$f(x) = kx$的系数$k$倾向于越来越小。这个可以理解为:如果当前采用$f(x)=kx$,那么如果采用$f^\prime(x)=k^\prime x, (k^\prime \lt k)$策略时,区块更容易被接受(因为后续矿工可以包含更多的交易)。因此,随着游戏不断的训练,系数越小的$f(x)策略得到的权重越大。
对于atomic类型的矿工,实验结果如下(参数与上文non-atomic实验一样):
对于此类型的矿工,我们可以看到实验结果很不相同,$f(x)$的系数没有逐渐减小。这里文中给出的理由是:在non-atomic矿工的条件下,大家只关注当前区块是否被包含在区块链中,而在atomic矿工条件下,矿工们更关注长远利益。虽然实时挖矿时,系数越小包含的概率越大,但是当前挖到的区块不一定被包含在最终的主链上。$f(x)$系数较大的矿工,他们很有可能连续挖到两个区块,这样他们的区块就被确认了(本文只考虑矿工们回溯一个区块进行分岔的情况),由于他们$f(x)$的系数较大,因此此时获得的利润也较多。
文中还展示了在有一定量的诚实矿工存在(采用默认策略)的情况下,最终学习到的策略比重,结果如下图所示(堆叠图):
- Lazy 为后分岔策略
- Petty为狭隘策略
- 参数:100个矿工,每次游戏会产生10000个区块,学习参数$\epsilon=0.01$,在此参数下大约需要进行300,000轮游戏策略学习才会收敛
横坐标为诚实矿工所占比例,纵坐标为归一化后的权重。可以看出在存在超过一半的诚实矿工的情况下,分岔策略还是有可能成功的(图中的$f(x)=x$)部分。理论分析表明,只要诚实矿工小于$\frac{2}{3}$,采用激进策略所获的收益就比$Petty$策略高。
文中还讨论了策略学习的收敛条件,也就是博弈达到均衡点的条件,感兴趣的可以参考原论文
自私挖矿
在仅有交易费奖励的情况下,矿工们更倾向于采用自私挖矿策略(相比于有区块奖励的情况)。因为,一方面矿工们可能会采用$Petty$策略,这一点可以被自私挖矿的矿工利用;另一方面,如果一个矿工在上一个区块产生后的极短时间内就挖到了下一个区块,那么这个区块中很有可能只包含极少量的交易,此时可能连电费都够不上,那么为什么不用来进行自私挖矿呢?
文中给出了一个改进型的自私挖矿策略。修改点主要是设定了一个阈值$\beta$,如果自私挖矿的矿工所挖区块中包含的交易费超过了$\beta$,那么矿工就正常发布这个区块。这样可以降低在竞争失败的情况下的损失。这个参数可以根据自己的算力比例$\alpha$以及诚实矿工在自己区块后面挖矿的比例$\lambda$来确定(关于自私挖矿可以参考之前的文章[4])。
改进后的策略描述如下:
改进的自私挖矿策略
矿工根据参数 beta 来指示他们丢失收益的大小,并以此决定是否采取自私挖矿策略 哪一个:自私矿工视野内高度最高的区块(也就是相比于诚实矿工来讲,如果本地存在未公开的分岔,就在自己的分岔上挖矿) 多少: R( MINING(m) ) --- 包含所有自己可以包含的交易 时间:在以下三种情况下,矿工选择公开自己的私链:- 挖到了一个区块,其中的交易费收益大于 beta,此时立即发布区块以便立即获取收益
- 自己的长度为1的分岔被追上了,此时立即公开自己的私链与其它分岔竞争
- 其他人发现了一个区块后导致公开的链的长度仅比矿工私链长度小一,此时立即公开私链:此时由于私链长度较长,因此可以让其它较短的链失效(根据最长链为主链原则)
改进的自私挖矿仿真的收益图如下图所示:
横坐标为自私矿工的算力比例,纵坐标为收益比例,该图对应的实验是在$\gamma=0.$的情况下做的(也就是最差情况,实际收益可能更高)。图中对比了不同$\beta$情况下的收益情况,可以看出大算力矿工更愿意$\beta$取较大值,而小算力矿工则选择较小的$\beta$更有优势。如果根据不同算力$\alpha$以及不同的$\gamma$值选用最优的$\beta$值,那么更具模拟实验结果,无论矿工的算力比例是多少,都可以得到比诚实挖矿更高的收益。收益图入下图所示:
图中横坐标为矿工算力比例,纵坐标为收益比例。
直线为诚实挖矿收益,浅蓝色为自私挖矿在最差情况下$\gamma=0.0$的收益,紫色为采用最优$\beta$参数的改进型自私挖矿的收益,显然最优参数的改进型自私挖矿策略可以得到最优收益,并且无论矿工的算力有多少都可以获取更多收益。
结束语
本文分析了在只有交易费激励的情况下,比特币矿工们采取不同策略挖矿时的收益情况及其可能对区块链网络的影响。根据本文的模拟分析,在交易费主导收益的时代,矿工们可能能愿意进行分岔以获取更高收益,这样会导致比特币区块链网络更加不稳定,安全性也更低。
引用
[1] Carlsten, Miles, et al. "On the instability of bitcoin without the block reward." Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. 2016.
[2] Auer, Peter, et al. "The nonstochastic multiarmed bandit problem." SIAM journal on computing 32.1 (2002): 48-77.
[3] Arora, Sanjeev, Elad Hazan, and Satyen Kale. "The multiplicative weights update method: a meta-algorithm and applications." Theory of Computing 8.1 (2012): 121-164.
[4] 自私挖矿:https://mp.weixin.qq.com/s/MItDdKRqGdLUts1bxlkUOA
More Recommendations