要玩轉未殺菌版 Cheeze Wizards 還是需要一定的技術門檻。

原文標題:《奶酪巫師的黑客樂園 - 第一個進行硬分叉的區塊鏈遊戲?》
作者: DR 小夥伴

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 參賽吧。

來源鏈接:mp.weixin.qq.com