Fomo3D的死亡3分钟
作者:李画、史远
8月22号下午2点,沉默已久的Fomo3D再次引发大家的关注,被认为永不终结的赌局,结束了。
在2点48分22秒,一个地址为0xa169df5ed3363cfc4c92ac96c6c5f2a42fccbf85的玩家往Fomo3D的奖池里投下了0.0055个ETH。
令人奇怪的是,直到倒计时结束也没人购买下一把key。
这位玩家成为了Fomo3D第一轮游戏的最后一个下注者,顺利拿走了奖池里的10469个ETH,近300万美金。
0xa169这个地址在8月15号才有第一笔交易,且在当天就开始了Fomo3D的游戏,之后的有效交易也几乎全部与Fomo3D有关,可以肯定是冲着最后的大奖而来。
但0xa169效率很高,有媒体统计在取得最后的胜利之前,该玩家累计仅投入0.8个ETH,投资回报率高达13000倍。
为什么没有人与0xa169争夺最后的30秒?从该游戏的设计机制上看,这个游戏的宿命更应该是“永不结束”。
1
Fomo3D的最后3分钟
从Eetherscan去看看最后的30秒究竟发生了什么。Eetherscan上的数据表明,问题不仅是出在最后30秒,而是最后3分钟——在这个时间以秒记的游戏里,整整3分钟没有下一个玩家出现。
交易图显示,在2点48分之前和2点51分之后,每一分钟都会有多个玩家买入Fomo3D,但独独在48分和51分之间,交易完全停止了。
黄框内为最后的赢家0xa169
以太坊在这3分钟发生了什么?
2点48分,0xa169买key的交易完成,区块高度是6191896;3分钟后,2点51分,下一笔Fomo3D交易产生,区块高度6191909,但这笔交易来的太迟,永远错过了Fomo3D第一轮的竞争。
在区块6191896和区块6191909之间,是死亡三分钟,也是所有问题的答案。
2
区块的秘密
区块6191896,一切正常,0xa169的这笔交易也赫然在列。区块6191897在6秒之后被挖出,基本正常。
但在下一个区块,6191898,出现了一个0x18e1b664c6a2e88b93c1b71f61cbf76a726b7801的地址,有2笔交易与其有关。
紧接着,区块6191899中,3笔交易与其有关;区块6191900中,3笔;区块6191901中,2笔;区块6191901中,2笔;区块6191902中,4笔;区块6191903中,2笔。
接下来,区块6191904,该区块一共只打包了3笔交易,全部来自0x18e;区块6191905中,全部7笔交易中的3笔;区块6191906中,全部的3笔交易。
区块6191907中,全部4笔交易中的3笔;区块6191908中,全部5笔交易中的4笔。
终于,到了区块6191909,0x18e消失了。
摆脱0x18e的区块一口气打包了166笔交易,多笔与Fomo3D相关的交易包含其中,但它们被耽搁的太久,游戏结束了。
0x18e有什么特别?为何死亡三分钟里以太坊上所有的区块都包含与它有关的2到4条交易?原因就出在它对gas的消耗上。
0x18e的一笔交易需要耗费360万或420万的gas,两笔交易加起来是780万gas,而ETH一个区块目前能容纳的gas总量是800万左右。
这样一样,因为0x18e总gas费高,会被优先选择打包,又因为它占的gas量大,所以两笔交易就能填满整个区块,容不下其他的交易。
于是,在交易消失的3分钟里,在区块6191896与区块6191909之间,所有的节点都在打包与0x18e相关的交易。而所有与Fomo3D有关的交易,同以太坊上其他的交易一起,被留在了交易池排队等候。
3分钟很短,但足够结束一个以30秒为倒计时的游戏。
3
诡异的0xa169与0x18e
在0xa169买入最后一个key后,0x18e“堵塞”了以太坊3分钟。是巧合吗?不是。
0x18e在8月18号被创建,晚0xa169地址3天,之后两者频繁互动,应该是在测试攻击模型。
8月21号,两者间的互动结束,8月22号,0xa169发起了最后一役,它主攻,0x18e掩护。
看看0x18e掩护0xa169的时间点。
在最后一次攻击中,0xa169在6点48分22秒完成交易,0x18e在6点48分43秒至6点52分01秒之间发起攻击,堵塞网络。
但这不是他们第一次配合,0xa169曾在5点50分42秒发起一笔交易,0x18e在5点51分10秒至5点52分57秒之间发起攻击;在此之前,0xa169在5点35分46秒发起交易,0x18e在5点36分49秒至5点37分28秒间发起攻击。
0x18e为0xa169争取到最多时间的一次,就是它们成功的一次。在0xa169拿走奖金之后,0x18e这个地址再无任何动作。
所以,如果你真以为有人用0.8个ETH赢了Fomo3D,未免天真。这是一场投入技术、金钱,被精心策划、全力以赴的战役。
不过,如果说这场胜利完全与幸运无关也不全对。因为0xa169能拿走奖金还跟它的对手,一个倒霉的人有关。
4
错失胜利的人
讲讲这个运气不好的家伙。地址是0x32ad247B94E46bB75caC37B81e6CB53173002370,就是0xa169上方的这一位。
0x32ad是个狠角色,因为在这个地址上,它总共就出手一次,而且几近成功。
它算准在最后的时刻出击,用极高的gas单价被选中进入区块打包(单个交易,gas费551美金),它也是整个死亡3分钟内唯一闯入区块打包环节的Fomo3D交易(区块6191907)。
但它失败了,缘于一个有趣的不幸。它设置的Gas Limit是379000,但交易耗费的gas超过了379000。
在Fomo3D中,几乎没有gas超过379000的交易,但这一次,最重要的一次,偏偏就超了。