深度解析近期FIL攻击手法

[复制链接]
7973 |0
发表于 2019-10-22 12:00:07 | 显示全部楼层 |阅读模式
前 言

自go-fileDAC 0.5 版上线,大戏就上场了
前文在FIL可以被称重一文中提到,重力攻击开始了,而且这种攻击一旦开始,就不会停歇。因为嗅觉灵敏的准矿工们,犹如游弋的鲨鱼,对血腥味十分敏感。在食物被咬一口之前,往往发现不了,但一旦开始滴血,就都来了。
尽管大多数人都希望看到一个稳定的 user-devnet,但事实上我们看到的是一次次的重复攻击。从第一次攻击开始到目前为止,攻击次数应该在10~20次之间,有一些得逞,也有没有得逞的。


我曾预言,会再次出现 go-fileDavinci user-devnet 0.2.2版出现的情况,而事实,确实如此。
我并不期望鲨鱼能够自觉遵守期望的秩序,编队前行。在问题解决之前,任何一个人的尝试和冒犯都会对整个网络产生影响,最好的策略就是随他去,干点正事:分析一下代码、跟踪一下变化、考虑一下如何迎接测试网等等。
我的本意是待问题修复后再进行分析,但是,就目前情况而言,很多人已领会,公开或不公开,网络都不容易恢复。
另外,Lotus的发布,使得大家的注意力转向Lotus,而这里提到的重量计算问题在Lotus网络其实并不存在。
另一个考虑是:在攻击连续发生时,有人@我,虽然我也希望网络尽快恢复,但没有谁能阻止攻击发生。
所以,@我的目的,可能更多的是希望我做个分析,这就是本文启稿的原因。

正 文
重量计算 – 没那么简单

在 go-fileDavinci 0.5.7 版本中,重量的计算方法已经发生调整,用以解决利用重量进行长程攻击的问题;也就是说,解决的是 go-fileDavinci项目中的 Issue #3502。
在新的重量算法中,引入了三个不同的因素用以兼顾分叉后短距离攻击和长距离攻击的问题。 这三个因素分别是:

       
  • 总算力因素
           
  • 当轮出块因素
           
  • 空块因素

    公式大致如此:

    这里几个因素都牵涉到不同的参数设置的问题,具体如何设置更加合理,是需要进行理论的推算及实验的验证。
    另外,尽管目前算法进行了改变,#3502问题得到了解决,但算法的完善工作还在进行之中,go-fileDAC 0.5.7版重量计算方法仍与设计中不一致,在接下来的版本中如算法再次改变,也绝不出乎意料。

    露个破绽 – 不公平的原型设计

    go-fileDavinci 0.5.7之前的重力算法,按设计者预想,那是一个原型设计,并不是真正要使用的算法。
    那,这个算法的问题出在哪里呢?
    其实相关问题早已被部分爱好者发现;比如我有一次在交流预期共识的算法的时,有人提到:这个算法偏向算力高的矿工,高算力矿工能增加更多的重量。
    也有人提出,这不公平吗。但问题的讨论就到此为止了,其实稍微深挖一点,就知道这里存在较多的问题。
    首先来看一下原来的重量计算方法(摘自我早期制作的Populous):


    注意公式里的 miner_power_ratio,即爆块矿工的算力占比。
    一个矿工的算力占比在0到1之间,因此,每一轮重量增加大约10~110之间(仅考虑期望值,单轮由于可能多块,可能超过110)。
    那么显然,爆块矿工算力越高,其能够增加的重量越大;按照最重链原则,算力高的矿工在分叉聚合的过程中会有优势。

    利用规则 – 最简单的分叉攻击

    经过前面的介绍,我们知道,大矿工因自己能够增加较大的重量,如果利用这一点,可以通过分叉来攻击网络。
    一个简单易行的做法是这样的(仅技术探讨,请勿模仿)
    [ol]
           
  • 加入网络,尽量想办法增加算力(没有那么重要啦);
           
  • 待拥有一定算力后,脱离网络,单独运行,继续增加算力(这个很重要),提高自己在私网中的算力占比(因与主网隔开了,别人都不能增加算力,所以自己的比例越来越高,达到绝对统治地位,但这个过程相当费时);
           
  • 观察公网和私网的链重量,待私网链重量大于公网一定数量时,再次接入网络。
    [/ol]
    根据最重链法则,这时候公网链和私网加入的链就会进行战斗,由于私网链更重一些,大家根据规则开始跟随你在私网里产生的这条链。,等同步完成,攻击成功。

    惩罚实现 – 为攻击助力

    问题来了:为什么在 go-fileDAC 0.5 版本,重力攻击如此盛行、如此容易?近20次的攻击说来就来?
    YES,因为0.5版本实现的一些新功能,使得重力攻击变得非常容易。
    其中最为重要的一个功能就是惩罚机制在0.5版本中实现了。其中实现的最主要的一个机制就是,当一个矿工在自己的证明区间里,如果不能完成并发送时空证明(PoSt),其算力就会清零。
    这在重力攻击中意味着什么?
    请看上一节的第二步,当你的节点从主网中脱离出来之后,因为其他节点不能再往你的私网发送消息,对于你维护的私链而言,他们不能完成时空证明。
    所以,在一个证明周期的时间内,其他所有矿工的算力全部清零,网络中仅有你有算力,那么你就是100%。 这样带来的“好处”是:
    [ol]
           
  • 每次都能爆块;
           
  • 每次都增加算力110;
    [/ol]
    回到主网,由于那里有很多矿工,如果都是诚实矿工,每一位算力都不大,每轮增加的重量可能是10+或20+,这样两个链的重量增加差别很大,很快重量就会拉开。
    这里不同网络增加算力的不同可以参考前期文章:FIL链的生命和性感(注:此文的算法目前已过时,持续跟踪,近期更新)。
    其实,为重力攻击助力的新功能不仅仅是惩罚机制,还有其他
    如:为了调试网络,把证明区间改为300;
    如:···  (涉及到其他攻击方式,暂且保密);

    这还没完 – 有人玩的更嗨

    看到这里,是不是认为重力攻击这么简单?
    不,劝君请勿尝试,当下尝试,不会令你满意。首先,网络高度已然不低,你需慢慢积累算力、需要时间;并且,现在的网络中这样操作,已经无效。

    有人做出了更有意思的玩法,那就是 go-fileDavinci 项目中 Issue #3523 中提到的【连弩齐发】:
    一个高度可以增加数万重量,把自己吃成一个超级大胖子。
    这也是重力攻击,但这已不是利用重量算法的漏洞。
    这些操作已经没有太多意义,因为理论上每一轮重量的增加几乎可以无限,如果大家都如此,这个网络就没有下限了。除了在“江湖”上刷一下存在感,没有其他任何益处。
    现在 Lotus 出世,大家可以好好‘赏莲’,不必折腾 go-fileDAC,让它安静的修复被玩坏了的BUG。
    —END—


    本文由IPFS原力区 Steven Li (胡飞瞳)原创

    201910220352506451.jpg

    201910220352506451.jpg
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表