奶酪巫師的黑客樂園 - 第一個進行硬分叉的區塊鏈遊戲?

導讀:10月14日,Cheeze Wizards在以太坊主網上線。不到24小時內,玩家@samczsun向官方反映,遊戲合約存在一個嚴重的Bug,使用這個bug可以利於不敗之地。隨後Cheeze Wizards決定採用分叉的解決方案來保護用戶的權益。Cheeze Wizards已經修復了此Bug並部署了新的智能合約,獎池中損失的178ETH也已經被補上,但CW並沒有關閉有問題的遊戲而是讓它成爲了一個黑客樂園。

640?wx_fmt=gif

獨孤求敗的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)

640?wx_fmt=png

不難發現,二者的區別在於在第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

640?wx_fmt=png

好消息是,該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方法

640?wx_fmt=png

需要注意的是: 未殺菌版芝魔師並不適合所有玩家。參與者需要完全意識到風險。很多玩家將會運行自動化腳本來保證自己率先觸發rTODs方法,不管是作爲誠實方還是不誠實方。玩家需要想想自己是否有膽量來玩這個有趣的遊戲。所以,找到適合自己的方式再來參與未殺菌版芝魔師吧。

接下來讓我們深入到代碼層面。

在代碼層面檢視bug

事情的起因是,兩位玩家在戰鬥中相互提交招式,其中一位有意或無意地不揭示他放出的招式。這時,爲了讓另一個玩家可以結束這場漫長的戰鬥,Cheeze Wizards允許玩家發起一個"單邊揭示"的交易。這其實是一個特殊情況,正常的遊戲中不會遇見。

rTOD漏洞只在一種情況下發生,也就是在戰鬥中。一位玩家已經揭示了招式,另一位玩家一直不揭示招式直到時間截止(90分鐘)。當只有一邊揭示招式然後另一邊等待到時間截止時,任何一個懷有惡意的用戶,都可以用錯誤的方式調用rTOD合約,以此來凍結誠實玩家的能量

假設誠實的玩家A正在使用號碼#1000芝魔師與使用號碼#2000芝魔師的玩家B作戰,玩家B打算使用”死亡之鈴“bug。兩位巫師都選擇了自己的招式進入決鬥。玩家A展示了自己的出招,而玩家B等待決鬥超時,並調用resolveTimedOutDuel(1000,1000)。讓我們來看一下智能合約中的部分代碼:

640?wx_fmt=png

最終,智能合約執行一次能量轉移,認爲該合約將全部能量轉移給獲勝的芝魔師,然後抽乾失敗的芝魔師的能量。然而,由於雙方 wiz1並wiz2都指向一個索引(#1000),所以先翻倍了#1000芝魔師的能量......然後抽乾了他。‍值得慶幸的是,通過在函數頂部添加一個簡單的require語句來確保兩個芝魔師ID是不同的,可以輕鬆修復此錯誤。

require(wizardId1!= WizardId2,“Same Wizard”)

這個智能合約已經過Sigma Prime的正式安全審查,Cheeze Wizards相信沒有其他問題可以阻止比賽按預期進行。

看到這裏,想必大家已經瞭解,要玩轉未殺菌版Cheeze Wizards還是需要一定技術門檻的。如果你是一個想要黑吃黑的黑客,請跳到unp.cheezewizards.com。普通玩家請依然在cheezewizards.com參賽吧。最後,對Cheeze Wizards感興趣的小夥伴趕緊後臺回覆Party加入DappReview的芝魔師羣吧!

 ------------
點擊“閱讀原文”,查看全球最大的Dapp數據排行榜
支持11大主鏈,超過3500+Dapps
DappReview必讀文章索引

  |  |  
  
 UGC

後臺回覆“遊戲”,獲取遊戲類文章合集
後臺回覆“觀點”,獲取觀點類文章合集
後臺回覆“行業”,獲取行業類文章合集
後臺回覆“解謎”,獲取解謎類文章合集

關於Dapp的一切,都在這裏
640?wx_fmt=jpeg
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章