遇到的問題
PopCraft 是一款全鏈上的消除游戲,每局游戲時長 4 分鐘,玩家在規(guī)定時間內(nèi)消除棋盤上所有元素,會獲得代幣獎勵。
由于全鏈上的特性,玩家在游戲過程中的每次操作都需要跟區(qū)塊鏈交互。以太坊二層的區(qū)塊時間通常為 2 秒,導(dǎo)致玩家在游戲中每次操作需要至少等待 2 秒才能完成,這遠遠超過同類 Web2 游戲中的等待時間,從而使 PopCraft 游戲體驗欠佳。
PopCraft 游戲主界面
設(shè)想的方案
我們設(shè)想在 PopCraft中利用零知識證明技術(shù)(以下簡稱 ZKP),減少玩家在游戲過程中與區(qū)塊鏈的交互次數(shù)。
預(yù)期的方式是:游戲過程不上鏈,但有機制可以確保無作弊風(fēng)險。玩家在游戲中每一步操作都會生成 ZKP,后一步操作的 ZKP 基于前一步的 ZKP 來生成,從而形成一種類似區(qū)塊鏈結(jié)構(gòu)的自包含 ZKP,游戲結(jié)束時將最后一步操作的 ZKP 發(fā)送到鏈上,交由智能合約驗證其結(jié)果。
方案調(diào)研與推導(dǎo)
1. 游戲過程與結(jié)果的防作弊:僅對游戲結(jié)果生成 ZKP 是不夠的,因為游戲的過程同樣存在作弊可能。因此,既要對游戲結(jié)果生成 ZKP,也要對游戲過程進行驗證。
2. 逐步生成 ZKP 的技術(shù)挑戰(zhàn):為了防作弊,需要對玩家在游戲中的每一個操作都生成 ZKP,在游戲結(jié)束時將最后一個 ZKP 上鏈進行驗證。這個過程中,每一步的 ZKP 都會依賴于前一步的 ZKP,直到游戲結(jié)束為止。
但難點是:
1> 新的 ZKP 生成需要依賴前一步的 ZKP,這使得驗證過程復(fù)雜且不確定能否可實現(xiàn)。此外, ZKP 驗證通過智能合約(鏈上)來做,后一步生成 ZKP 時該如何去驗證前一步的 ZKP 是正確的。
2> 在通過智能合約驗證每一步的 ZKP 是否正確時,如何確保每個 ZKP 與前一個 ZKP 的連貫性,該問題不確定是否有方案可以解決。
3. 公開游戲數(shù)據(jù)的問題:PopCraft 的游戲數(shù)據(jù)是公開的,因此通過 ZKP 做信息隱藏沒必要。如果上述驗證步驟均可實現(xiàn)的話,下一步需要考慮在合約端保存游戲數(shù)據(jù)。然而問題在于 ZKP 的性質(zhì)無法解出具體的游戲數(shù)據(jù),此時也不可直接相信客戶端傳給智能合約的游戲結(jié)果數(shù)據(jù),這意味著智能合約無法直接存儲這些數(shù)據(jù)。
4.PopCraft 中消耗游戲道具(消耗Token)的問題:當游戲過程涉及到通過游戲道具完成孤立元素的消除時,本質(zhì)上對應(yīng)的是 Token 消耗,需要將用戶錢包中對應(yīng)的 Token 轉(zhuǎn)移,如何處理這一步 ZKP 生成和驗證也是一個問題。
1> 一個可能的解決方案是:這一步繼續(xù)按照之前的流程生成 ZKP,驗證消耗的 Token 數(shù)量并最終發(fā)送給智能合約。然而,由于智能合約無法通過ZKP 得到具體游戲數(shù)據(jù),因此無法判斷應(yīng)該轉(zhuǎn)移的 Token 數(shù)量。
此外,假設(shè)玩家擁有 3 個 Token A,卻嘗試在游戲中消耗 4 個 Token A,這種錯誤會在游戲結(jié)束時才被發(fā)現(xiàn),而不是在用戶操作實時被發(fā)現(xiàn)。
2> 另一個可能的解法是:在使用 Token 完成孤立元素的消除時,直接與智能合約交互完成消除,然后更新玩家的 Token 余額。生成的 ZKP 只負責(zé)保存此時游戲操作和狀態(tài)的證明。
那么此時在轉(zhuǎn)移 Token 成功之后,還需要像前面操作一樣繼續(xù)生成 ZKP,如果不生成,那么在轉(zhuǎn)移 Token 操作的上一步生成的 ZKP 與下一次生成的 ZKP 中間,多了一次與智能合約交互的步驟,那么 ZKP 中的游戲狀態(tài)就會沖突,這樣游戲結(jié)束時生成的 ZKP 是否有效也是一個懸而未決的問題。
5. ZKP 的數(shù)據(jù)隱藏問題:對于 PopCraft 這種不需要隱藏游戲數(shù)據(jù)的場景來說,通過 ZKP 做數(shù)據(jù)隱藏是多余的,且增加了游戲數(shù)據(jù)獲取的難度以及工程實現(xiàn)方案的不確定性。PopCraft 只需確保游戲過程和結(jié)果無作弊風(fēng)險即可,并不需要隱藏游戲過程數(shù)據(jù)。
結(jié)論
在 PopCraft 這樣的游戲中,游戲數(shù)據(jù)不需要隱藏,因此通過 ZKP 做信息隱藏沒有必要。為了通過縮短響應(yīng)時間來提升游戲體驗,可以考慮游戲過程不上鏈,僅將最終結(jié)果上鏈。關(guān)鍵在于找到一種方法,可以確保從玩游戲的第一步到最后一步都沒有作弊可能,最后將正確的結(jié)果上鏈驗證即可。
如果通過 ZKP 進行信息隱藏,反倒是增加了工程實現(xiàn)難度。其次是如何確保游戲過程無作弊風(fēng)險,使用 ZKP 能確保單個游戲操作無作弊風(fēng)險,但為了減少跟區(qū)塊鏈的交互次數(shù),又不能生成一次 ZKP 就提交一次。所以從游戲開始的第一步操作到游戲結(jié)束整個過程,又該如何保證無作弊風(fēng)險,目前看來 ZKP 無法解決該問題。
從我們的調(diào)研來看,游戲領(lǐng)域 ZKP 適合做兩類事情:
- 非完全信息博弈類游戲的信息隱藏,比如:黑暗森林、德州撲克、狼人殺、爐石傳說等。
- 游戲過程為單步的游戲結(jié)果證明,比如:彩票、猜數(shù)字、石頭剪刀布、骰子游戲等。
由于我們在零知識證明技術(shù)上的儲備有限,本文內(nèi)容可能存在事實性錯誤或不合理的工程設(shè)想,懇請具備豐富經(jīng)驗的零知識證明領(lǐng)域?qū)<遗u指正。
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。