8月22号下午2点,沉默已久的Fomo3D再次引发大家的关注,被认为永不终结的赌局,结束了!!!获奖者创建神秘合约攻击(攻击合约),前后使用很多不同的地址向神秘合约发起交易,最终大奖由黑客(地址 0xa169)获得,该黑客累计仅投入0.8个ETH,奖金额高达10,469.66ETH,近300万美金,投资回报率高达13000倍!!!
Fomo3D的最后时间
通证数据于昨日发现 Fomo3D 大奖获得者采取一些“特殊攻击技巧”,使得游戏临近结束时,矿工打包入区块内的交易数量骤减(涉及连续多个区块),从而起到加速游戏结束和提高胜率的作用。
如上图所示,高度为 6191896 的区块中打包了 Fomo3D 游戏中奖者最后购买 key 的交易,该区块共包含 92 笔交易,交易数量正常。
而在该区块后的连续 11 个区块(6191898~6191908),每个区块包含交易数量都骤降,在6191898这个区块中,出现了一个0x18e1b664c6a2e88b93c1b71f61cbf76a726b7801的地址,有2笔交易与其有关。
紧接着,区块6191899中,3笔交易与其有关;区块6191900中,3笔;区块6191901中,2笔;区块6191901中,2笔;区块6191902中,4笔;区块6191903中,2笔。
接下来,区块6191904,该区块一共只打包了3笔交易,全部来自0x18e;区块6191905中,全部7笔交易中的3笔;最少的一个区块6191906中,仅包含了3笔交易,并且交易均发往同一合约(调用同一个神秘合约),三笔交易手续费之和超过 4 个以太币。
而该神秘合约(0x18e1)创建者正是中奖者(0xa169)!
区块6191907中,全部4笔交易中的3笔;区块6191908中,全部5笔交易中的4笔。
终于,到了区块6191909,0x18e消失了。
摆脱0x18e的区块一口气打包了166笔交易,与Fomo3D相关的交易包含其中,但它们被耽搁的太久,游戏结束了。
经过相关分析后我们发现,矿池会挑选交易进入区块的策略为手续费(TxFee)高的优先。这也解释了为何上文提到的连续11个区块,都仅打包了很少量的交易,却能获得超出正常区块的手续费。
这些区块分别由 SparkPool、Nanopool、Ethermine、BitClubPool、MiningPoolHub 等矿池打包,显然挑选高手续费交易优先打包,是符合矿池利益的策略,是行业通行的方案 [1]。
黑客的“神秘合约”究竟做了什么?
通过观察我们发现这些异常区块内发往神秘合约(攻击合约)的异常交易,最终状态均为失败。
如上图所示,交易最终状态为失败,并且 Etherscan 有 Bad instruction 错误提示,最终导致耗光 Gas Limit (4200000),约为正常区块 Gas Limit 的一半,因此打包该交易的矿池也收到了高额的手续费。
以太坊区块 Gas Limit 这一概念,代表单个区块中最多允许的 Gas 总量上限,以此来决定单个区块中具体打包多少笔交易。区块 Gas Limit 由矿工间通过一定策略协商设定,目前区块常见值约为 8000000 [2]。
以太坊上每笔交易也包含一个 Gas Limit 概念,由交易发起者自行设定,代表该笔交易可最多消耗的 Gas 上限,实际 Gas 消耗以交易具体执行消耗为准。一个区块中所有交易花费的 Gas 不能超过区块的 Gas Limit [3]。
我们知道,以太坊智能合约还存在一个指令assert(),用于断言。当 assert 的结果不满足条件时,则会耗光交易的 Gas。Etherscan 针对这种情况的交易通常提示Bad instruction,实际则为 EVM 执行过程中遇到了一个未定义的操作符0xfe[4]。
获奖者(黑客)就是利用这个特性,实现少量交易就能占用整个区块的 Gas Limit。
黑客更为犀利的操作
进一步,我们发现神秘合约会调用 Fomo3D 游戏的 getCurrentRoundInfo() 接口,用于获取当前轮次比赛信息,如剩余时间、最后一位购买者的信息(最有可能获奖者)等奖池详尽信息(如下图)。
获奖者(黑客)通过神秘合约,在合约内调用该接口查询游戏信息,重点关注剩余时间和最后一位购买者地址。当游戏剩余时间达到一个阈值,并且最后一个购买者是自己时,则通过 assert() 让整个交易失败,并耗光所有 Gas;当剩余时间很长或最后一个购买者不是自己时,则不做任何操作,仅消耗很少的 Gas。
获奖者(黑客)利用这种方法,发起大量类似的可变神秘交易:在自己极有可能成为中奖者时,利用这些高额手续费的神秘交易,吸引矿池优先打包,占满后续区块,从而使得其他玩家购买 key 的交易无法被正常打包,最终加速游戏结束,并极大地提高自己的中奖概率。
极具细腻的心思背后是什么?
从以下几点就能看出,这是一场被精心策划过的战役:
首先,Fomo3D 获奖者(黑客)创建过多个类似神秘合约(攻击合约),并且前后曾使用很多不同地址向神秘合约发起交易,来分散大众注意力,降低自己的“特殊技巧”被发现的可能性。而每个攻击合约都有大量交易记录。上文提到的最终导致黑客获奖的攻击合约(0x18e1)有多达 5000 多笔交易,可见黑客暗地里做过不少尝试。
获奖者(黑客)控制的地址批量调用神秘合约(攻击合约)时,会给交易设置各种 Gas Limit,从 170000 到 4800000 不等,这同样是一个技巧。
Fomo3D 获奖者(黑客)0xa169 最后一次购买 key 后(区块 6191896),连续十余个区块,都无任何与购买 Fomo3D 游戏 key 相关的交易,这才最终导致游戏倒计时结束,获得最终大奖。
这轮游戏的获奖者(黑客),并未联合多家矿池作恶,反而巧妙利用了所有矿池优先挑选交易打包策略的共性。
获奖者(黑客)部署的神秘合约(攻击合约),简直是智能合约作为攻击武器的典范示例,精确制导,有的放矢。比起盲目地使用自动脚本在临近游戏结束时调高 Gas Price 发起参与游戏交易,黑客的攻击手法显然高明许多 。广播至各矿池的攻击交易,如导弹一般部署在内存池中,根据游戏状况,伺机而动。
一场战役的胜利,并不是巧合,这场战役的表面是有人用0.8个ETH赢了Fomo3D,赢走了近300万美金,但它背后的策划确实如此的细腻,从创建神秘合约到调用神秘合约,又从调用到利用矿池的打包策略的共性,层层部署,再根据游戏状况,伺机而动。
·END·
通证数据
专注数据分析
对空投基金感兴趣的可以关注:
温馨提示
如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。