扣块攻击有两种,一种是为了“双花”而发起的攻击,由比特币链上交易的第一位接受者HalFinney提出,因此这种攻击也被称为“芬尼攻击”。
第二种扣块攻击是指矿工找到合法的区块之后,私自把区块扣下不对外发布。@不能说的秘密 的提问,指的就是这一种,下面我们就来介绍这类扣块攻击。
01 扣块攻击
要说扣块攻击,得从矿池的概念说起。知矿大学在《什么是比特币矿场和矿池?》中介绍过:
矿池就相当于项目经理,接入矿池的算力就是服从项目经理工作安排的项目组员。项目是挖矿,尽快找到符合比特币系统要求的解。所有的项目组成员,都按照项目经理的安排推进工作任务,并提交工作成果,项目经理按照“多劳多得”的方式,根据项目成员完成任务的具体情况进行奖励。
扣块攻击的问题就出在提交工作成果上。
找到符合比特币系统要求的解,对于单独的矿工来说,是极小概率事件。矿池为了更好衡量矿工们的工作量,会给矿工们设置一个合理的提交工作成果(Share)的门槛。
挖矿这个过程类似一个抛256枚硬币的游戏,假设系统规定挖出新区块需要从第一枚硬币开始至少连续20枚硬币正面朝上,这个难度对于单个矿工来说太难了,矿池为了更好衡量矿工们的工作量,规定矿工只要从第一枚硬币开始至少连续10枚硬币正面朝上的结果,便计作该矿工的有效工作量证明。
扣块攻击是指,恶意矿工在找到满足矿池要求结果,但不满足比特币系统要求的结果时,正常向矿池提交工作证明;一旦得到满足比特币系统要求的结果时,也就是真的挖到区块时,则把这个结果私自扣下,不向矿池提交,矿池便因此损失了对应的奖励。
02 扣块攻击的危害
扣块攻击对矿池的伤害很大。第三次产出减半之后被扣下一个块,就损失了6.25枚BTC(忽略打包矿工费),按目前价格,约¥40万。矿池持续遭受扣块攻击,矿池的幸运值长期偏低,蒙受巨大损失,严重的甚至会导致矿池的倒闭。
为什么说发起扣块攻击对恶意矿工几乎不会有影响呢?这要从矿池的结算方式说起。目前主流的结算方式是FPPS和PPS+。矿池根据矿工提交的工作量证明,也就是按照理论产出给矿工结算收益。
欲对矿池发起“扣块攻击”的恶意矿工,肯定也是选择这样的结算方式。对于恶意矿工来说,提交满足矿池要求的工作量证明(Share)与提交满足比特币系统要求工作量证明,这两者的频次之比是相当悬殊的,初略估计前者是后者的数十万倍,也就是说,矿工向矿池提交数十万次工作量证明,才会有机会碰到一次扣块攻击,10万次有效的工作量变成了9.9999万次,这对矿工收益的影响可以忽略不计。但这个行为频次虽然很低,但每次都是数十万元的损失,这对矿池的损害特别大。
▲矿工发起扣块攻击频次示意图
那么问题来了,矿工为什么要发起扣块攻击这种“损人不利己”的行为呢?答案是矿池之前的恶性竞争。矿池是一个竞争非常激烈的赛道。有的矿池为了搞垮竞争对手,会把自己的算力“卧底”到其他矿池,意图发起扣块攻击,给对方造成经济损失,削弱竞争者的实力。
▲神鱼曾在微博上公开指责过这种恶意竞争的行为
03 扣块攻击可以预防吗?
因为比特币底层协议的原因,目前在技术层面上,矿池对扣块攻击没有有效的预防手段。矿池只能在察觉到幸运值异常之后,再去核对单个用户的出块情况。如果发现某些用户出块数据显著低于平均水平,就把这些有明显嫌疑的矿工移出矿池。当然,这种做法是有可能会错杀的,把没有发起过扣块攻击矿工判定为恶意矿工,但矿池要截断亏损,只能把嫌疑矿工踢出矿池,这也是不得已而为之。
矿池可以通过改变收益的分配模式来防止矿工发起扣块攻击。矿池把分配模式从PPS类换成PPLNS,PPLNS的分配模式下,矿池和矿工的关系相当于公司与公司合伙人,合伙人与公司是命运共同体,盈亏与公司同步。
既然这样,那矿池主流的分配模式是PPS类,而不是PPLNS呢?限于篇幅,我们就不在此展开了,后续找机会再来分解。