LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > Cheeze Wizards:第一个硬分叉的区块链游戏,原 Dapp 成黑客乐园

Cheeze Wizards:第一个硬分叉的区块链游戏,原 Dapp 成黑客乐园

2019-10-19 区块律动BlockBeat 来源:区块链网络

原文标题:《奶酪巫师的黑客乐园 - 第一个进行硬分叉的区块链游戏》

原文来源:Dappreview



10 月 14 日,Cheeze Wizards 在以太坊主网上线。不到 24 小时内,玩家 @samczsun 向官方反映,游戏合约存在一个严重的 Bug,使用这个 bug 可以利于不败之地。随后 Cheeze Wizards 决定采用分叉的解决方案来保护用户的权益。Cheeze Wizards 已经修复了此 Bug 并部署了新的智能合约,奖池中损失的 178ETH 也已经被补上,但 CW 并没有关闭有问题的游戏而是让它成为了一个黑客乐园。



独孤求败的 Bug


我们先来看看一场正常的芝魔师对决是如何进行的:
1. 玩家 A 挑战玩家 B
2. 玩家 B 接受并提交出招
3. 玩家 A 回应并提交出招
4. 玩家 A 揭示出招
5. 玩家 B 揭示出招
6. 智能合约裁决战斗结果

7. 决斗动画在 cheezewizards.com 上生成,玩家可以看结果


再来看看如果玩家 B 利用「死亡之铃」Bug 后的对决方式:
1. 玩家 A 挑战玩家 B
2. 玩家 B 接受并提交出招
3. 玩家 A 回应并提交出招
4. 玩家 A 揭示出招
5. 玩家 B 故意超时而不揭示出招(90 分钟)
6. 玩家 B 恶意调用 resolveTimedOutDuel(rTOD)函数,将两名参赛者都变为玩家 A,导致玩家 A 既是胜利者又是失败者的 bug


恶意调用:函数 resolveTimedOutDuel(WIZARD-A,WIZARD-A)
正常调用:函数 resolveTimedOutDuel(WIZARD-A,WIZARD-B)




不难发现,二者的区别在于在第 5 步,本该揭示出招的玩家 B 采用拖延战术耗完时间,然后恶意调用上述函数(一个解决对决时间耗尽的函数),实现稳赢。


恶意调用函数将耗尽芝魔师 A 的能量,玩家 A 被判定为负,不过芝魔师 B 也将处于无效状态。这时玩家 B 再次调用 resolveTimedOutDuel(WIZARD-B, WIZARD-B) 修复该错误状态。


此时,芝魔师 A 的能量消失的事实无法更改,而芝魔师 B 毫发无损。(请注意,在利用这个 bug 的过程中,能量没有从 A 转移到 B)。当然,恶意第三方也可以调用 rTOD 合约来消灭芝魔师 A 的能量,不一定非得由玩家 B 触发。


Cheeze Wizards 的智能合约是经过精心设计的,因此一旦发布,将无法取出奖池内的奖金(或以其他方式更改任何锦标赛状态)。因此,解决这个 bug 的唯一方法是部署新合约。


问题合约中已有 150 个钱包地址中的芝魔师,总价值 175 ETH。现在,40,000 美元已锁定在该合约中,在当前的战斗逻辑下赢得锦标赛是取出这笔奖金的唯一办法。


坏消息是,目前在编号 6133 以下的一些芝魔师受到了影响。游戏官方提供了 Txhash 供玩家参考:
https://etherscan.io/tx/0x0d497ea959406909edad945d332d0aa1ed2a41273c694ad385910720af2f86f3




好消息是,该 bug 并不会破坏整个游戏,作为一名普通玩家,你几乎不受任何影响。而且在允许上述这种肮脏的战斗方式存在的情况下,芝魔师锦标赛依然可以继续进行。官方称其为 Cheeze Wizard:未杀菌版(Unpasteurized)。


所谓的未杀菌版是指 Dapper Labs 于 2019 年 10 月 14 日部署的 Cheeze Wizards 智能合约的版本。未杀菌版包含上述的 bug,恶意玩家可以利用该 bug 攻击普通玩家的能量,尤其是那些使用 Web 界面访问游戏的玩家。但 Cheeze Wizards 官方表示,此 bug 对某些喜欢耍花招的技术型玩家来说,会让游戏变得更加有趣。

出了 bug 哪里"有趣"?


如上所述,似乎玩家 A 一直只能是受害者。他们按规则地展示了自己之前提交的游戏招式,然后他们的能量竟然就没了。当然玩家 B 并不能吸收这些能量,但是他成功地淘汰了对手让玩家 A 无法再继续参与游戏了。

除非……有趣的地方来了。


玩家 B 冒着风险没有揭示自己的招式,按照 Cheeze Wizards 的规则,不揭示已经成功提交的招式意味着自动弃权。


这种时候,如果在玩家 B 恶意调用 rTOD 之前,玩家 A 或者系统使用正确的方式调用 rTOD 方法,提交正确的参数: function resolveTimedOutDuel(WIZARD-A, WIZARD-B),玩家 A 将会取得胜利并且获得玩家 B 的所有能量!
所以新的游戏玩法诞生了。如果玩家判断对手准备利用 bug 来对付自己,那么就可以反过来利用正确调用 rTOD 的方法来夺走对手的能量。胜负的关键在于谁率先调用 rTOD(DR 小伙伴注: 即便是同一时刻调用,gas fee 高的交易会更快被矿工打包)。


不过诚实的玩家更有优势: 他们获胜时可以淘汰掉不诚实玩家并吸收他们的能量,而不诚实玩家即便获胜了,也只是将诚实玩家淘汰,并不能让自己获得更多能量。


而且不要忘了,Cheeze Wizards 官方一直运行着后台程序监测有没有超过 90 分钟未揭示招式的比赛,一旦发现会自动触发正确的 rTODs 方法。




需要注意的是: 未杀菌版芝魔师并不适合所有玩家。参与者需要完全意识到风险。很多玩家将会运行自动化脚本来保证自己率先触发 rTODs 方法,不管是作为诚实方还是不诚实方。玩家需要想想自己是否有胆量来玩这个有趣的游戏。所以,找到适合自己的方式再来参与未杀菌版芝魔师吧。


接下来让我们深入到代码层面。

在代码层面检视 bug


事情的起因是,两位玩家在战斗中相互提交招式,其中一位有意或无意地不揭示他放出的招式。这时,为了让另一个玩家可以结束这场漫长的战斗,Cheeze Wizards 允许玩家发起一个"单边揭示"的交易。这其实是一个特殊情况,正常的游戏中不会遇见。


rTOD 漏洞只在一种情况下发生,也就是在战斗中。一位玩家已经揭示了招式,另一位玩家一直不揭示招式直到时间截止 (90 分钟)。当只有一边揭示招式然后另一边等待到时间截止时,任何一个怀有恶意的用户,都可以用错误的方式调用 rTOD 合约,以此来冻结诚实玩家的能量。


假设诚实的玩家 A 正在使用号码#1000 芝魔师与使用号码#2000 芝魔师的玩家 B 作战,玩家 B 打算使用」死亡之铃「bug。两位巫师都选择了自己的招式进入决斗。玩家 A 展示了自己的出招,而玩家 B 等待决斗超时,并调用 resolveTimedOutDuel(1000,1000)。让我们来看一下智能合约中的部分代码:




最终,智能合约执行一次能量转移,认为该合约将全部能量转移给获胜的芝魔师,然后抽干失败的芝魔师的能量。然而,由于双方 wiz1 并 wiz2 都指向一个索引 (#1000),所以先翻倍了 #1000 芝魔师的能量...... 然后抽干了他。?值得庆幸的是,通过在函数顶部添加一个简单的 require 语句来确保两个芝魔师 ID 是不同的,可以轻松修复此错误。


require(wizardId1!= WizardId2,「Same Wizard」)


这个智能合约已经过 Sigma Prime 的正式安全审查,Cheeze Wizards 相信没有其他问题可以阻止比赛按预期进行。


看到这里,想必大家已经了解,要玩转未杀菌版 Cheeze Wizards 还是需要一定技术门槛的。如果你是一个想要黑吃黑的黑客,请跳到 unp.cheezewizards.com。普通玩家请依然在 cheezewizards.com 参赛吧。



原文地址:https://mp.weixin.qq.com/s/N8_5pPu4bc8cj5JLD_vzvg


—-

编译者/作者:区块律动BlockBeat

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...