区块链当中的自私挖矿是怎么回事
扫描二维码
随时随地手机看文章
工作量证明(PoW)区块链实现了一种形式的状态机复制系统(State Machine Replication,SMR)。不像传统的 SMR 协议,PoW 区块链是开放的,即,任何人都可以加入这个协议,而且系统也会用经济利益来激励参与者(也叫 “矿工”)遵守协议。
因此,同样迥异于传统 SMR 协议的地方是,在推理区块链的安全性时,仅仅假设恶意参与者的数量往往并不能得到答案。关键是要问一问,矿工是否真的有足够的动机来遵守所在的协议。这就是本文要讨论的东西。
为使讨论更具体一些,我们把讨论的语境限定为中本聪的比特币协议。Ling 已经提供了一些相关的背景知识,以及一个对恶意敌手的安全性分析。在我们的分析中,我们准备把这个系统描述为矿工之间的一个游戏(game,亦可称 “博弈”)。
游戏
游戏玩家就是出块的矿工。这个游戏是按回合(round)来进行的,每一回合都有一个矿工可以出一个区块,其他矿工可以发布(publish)这个区块。同时,游戏中的消息是同步(synchronous)传播的,因此,所有矿工都会收到上一轮发布的区块。
这样当然是简化了现实,例如,这个模型忽略了系统中挖矿总算力的缓慢变化,也忽略了偶尔会发生的出块冲突(即分叉)(这种情况虽然少见,但还是会发生的)。虽然如此,这个模型作为一阶近似,也足够了。
协议的规定是让每一个矿工都在最长链上出块,或者,如果分叉中的两条链长度相同,他们就跟随自己先接收到的那条链。
游戏中的每一个玩家都致力于最大化自己的收益 —— 这个就是 TA 的效用函数(uTIlity funcTIon)了。具体来说,我们还假设这是一个 infinite-horizon 游戏,即,随着游戏时间不断趋近于无限,一个矿工的收益就是其平均出块比例。这就代表,密码学货币形式的奖励是按矿工所出的区块发给出块矿工的。注意,主链之外的区块不会进入矿工的收益。
重要观察
主链上的出块比例就是对矿工收益的实时模拟。
假设系统中的挖矿总算力是静态不变的,系统每 10 分钟出一个区块,攻击在一次难度调整完成后立即发动。假设一种出块策略会导致网络中一定比例的区块被抛弃,比如所有矿工出的块中有 20% 的块会产生在主链之外,而且这个比例是稳定的。那么,虽然这个系统仍然是每 10 分钟出一个块,但只有 80% 会出在主链上,也就是主链的生长速度会变成每 12.5 分钟延长一个块,而不是每 10 分钟延长一次。比特币协议每出 2016 个块会调整一次难度,如此一来,调整难度所需的时间也会比一般情形要长(是 12.5×2016 分钟,而不是 10×2016 分钟)。
一旦难度调整发生,难度又会下降,使得主链的出块间隔重新变回 10 分钟。这就意味着系统的整体出块速度更高了,每 8 分钟就能出一个块。
所以,一个矿工如果有算力占全网比例为 α,且在主链上出块的占比为 α′ 》 α,则其每小时收益会与 α′ 成比例(而不是与 α 成比例)。
自私挖矿算法
自私挖矿(Selfish Mining)是一种投机挖矿算法,用于证明前述协议对小矿工并不公平(not an equilibrium)。我们先来看看自私挖矿的机制,然后讨论看看自私挖矿为什么以及何时会产生这样的效果。
一开始,自私的矿工会在最长链上挖矿,就像协议希望的那样。不过,一旦 TA 挖出了一个区块,TA 会先把这个区块藏起来,而不是立即发布出去,然后尝试在这个秘密块后继续出块,形成一个 “秘密分支”。
与此同时,其它矿工会延长公开的那条链,这条链最终会变得更长(概率为 1),因为他们的挖矿算力占大头。而自私挖矿的矿工会继续延长其秘密分支,直到公开分支落后一个区块。然后自私矿工就会把自己的秘密分支发布出来。
因为秘密分支更长,那么另一方就会认为这条才是主链,从这时开始,所有人都会跟随自私矿工的分支,而其他矿工挖出的区块会被抛弃 —— 被忽略,并使得出块矿工一无所获。
但这种策略也不是万无一失 —— 从开始秘密挖矿时起,自私矿工就一直承担着风险。如果 TA 出了一个秘密区块同时别的矿工也出了一个区块,TA 就不能靠发布这个秘密区块来变成最长链;相反,此时会变成两个同样长的分支在竞争最长链。
自私矿工会尝试延长自己的分支;为简化分析,我们假设其他矿工也会尝试延长自己所在的分支。如果 TA 能抢先出下一个块,则 TA 的分支会变成最长链,然后下一次攻击会在这条最长链的末端重新开始。如果其他矿工生出,那么自私矿工就属于不利地位(TA 的链更短)。在这种情况下,TA 会放弃这次攻击,寻找下一次机会。在这次攻击中,TA 的秘密分支会变成一条较短的分叉,使 TA 一无所获。
自私挖矿分析
乍一看,这种攻击应该不会奏效 —— 自私矿工的算力只占少数,必定是赢少输多。不过,一个细致的分析表明,并不总是如此。这个游戏可以自然而然地描述成一个 Markov Chain(译者注:马尔可夫链,在状态转换的过程中是 “无记忆性” 的,即新一回合中的得益跟以往任何一回合的得益都无关)。通过计算自私矿工的出块和其他矿工的出块情况,我们可以计算出自私矿工的区块(及收益)在主链上的比例,其实就是其算力规模的函数。
我们可以看出,算力占比超过 1/3 的自私矿工可以通过违反协议及执行自私挖矿算法来提高自己的收益。
结论
上述分析表面,当自私矿工的算力超过 1/3 时,自私挖矿的策略比诚实挖矿的策略收益高,但这是在乐观的假设下的结果。想要更深度的分析(包括更弱的模型以及加强协议的路径),请看 Financial Crypto 2013 上的论文以及 ACM 2018 会议上的论文。
后续的 研究,包括最近的一个,都使用马尔可夫方法来确定诚实挖矿策略占优的算力阀值(就跟本文使用的方法一样)。
感谢 Ittai Abraham 富有教益的反馈。