【Zypher Research】zk-Shuffle SDK:優化鏈上卡牌遊戲的 Gas 成本

Zypher Research
2024-04-28 10:22:29
收藏
在Zypher即將推出的 0GAS Alpha Net 上重新體驗全鏈卡牌遊戲。

简介

本研究文章解釋了我們如何通過優化的密碼學(PlonK)實現高效、完全的鏈上洗牌,包括:

  • "Mental Poker"和 zk-shuffle 保證遊戲內公平性

  • Zypher 的 shuffle SDK 作為其 Secret Engine 的核心組件

  • 使用 SNARK 優化"Reveal"流程

  • 使用"局部"存儲優化"Shuffle"流程

  • Zypher 即將推出的 ZERO GAS Alpha Net,支持洗牌作為預編譯合約

什麼是 Zypher Secret Engine?

顧名思義,Zypher Secret Engine 保護了"鏈上隱私"。

由於可預測的遊戲機制,在過去,區塊鏈固有的透明性使得全鏈策略遊戲變得不切實際。

Secret Engine 支持加密計算的安全執行,確保策略元素在鏈上的"隱私"。社交欺騙、戰爭迷霧、洗牌、隨機性、secret placing 等機制現在可以集成到鏈上遊戲中並具有可證明性。

目前,該引擎提供兩個核心組件:

  • zk-Shuffle SDK

  • zk-Matchmaking SDK

Mental Poker/紙牌遊戲的鏈上洗牌

1979年,Rivest、Shamir 和 Adleman 提出了一个挑戰:如何在沒有實體撲克牌、沒有可信第三方,並且所有參與者都被假設為不誠實(即存在作弊行為)的情況下,確保互聯網上撲克遊戲的公平性?這個問題也被稱為"Mental Poker"。

在 Mental Poker 遊戲中,確保公平性至關重要,zk-shuffle 是關鍵步驟。然而,洗牌時間顯著影響用戶體驗。Re-mask 操作涉及橢圓曲線密碼學,導致洗52張牌的電路很大。為了減小電路的尺寸,我們重新設計了 PlonK 電路門,將 zk-shuffle 算法嵌入到基礎層(約束系統)。

在實踐中,除了 zk-shuffle,我們還面臨鏈上驗證的高 gas fee 問題。本文將主要討論我們的優化見解,以降低 gas 成本。

優化 "Reveal" 流程

zk-shuffle 包括兩個動作:

1)置換卡牌,

2)Re-masking 卡牌。

假設掩碼卡牌為:

隨機編號:

在掩碼卡牌 C 上的 remask 操作是:

其中 G:群元素,即 Baby Jubjub,H 是聚合公鑰。

完成上述 remask 操作後,我們獲得了一張新的掩碼卡牌:

實際上獲得掩碼卡牌的掩碼因子:

因此,為了揭示卡牌,每個玩家需要提供他們的掩碼因子。此外,還有另一種不需要提供掩碼因子的方法,即本節討論的 reveal 方法。

假設玩家的公私鑰對為:

當揭開一張牌時,玩家只需要計算:

雖然開牌只是一個簡單的點乘運算,但需要注意的是,我們不能確保玩家是誠實的,我們不能確保玩家實際執行了開牌操作。因此,我們需要玩家在開牌的同時提供證據來證明自己的開牌行為。

Geometry Research 實現的 Mental Poker 協議中,他們基於 Chaum Pedersen 協議構建了開牌證明。然而,這個證明在鏈上驗證的成本極其昂貴,主要是因為整個 Chaum Pedersen 協議基於 Baby Jubjub 曲線,EVM 目前不支持將其作為預編譯合約。因此,我們必須在合約中原生實現點加和點乘運算,如 GitHub 上詳細介紹的,導致驗證開牌證明的 Gas 成本非常高。雖然驗證開牌證明只涉及少量點乘法和加法運算,但測試結果顯示,原生驗證的 Gas 成本高達 7,629,888,這顯然是不可接受的。

考慮到 Baby Jubjub 是 BN254 的嵌入曲線,我們可以使用 SNARK 進行開牌證明。根據 Groth16 驗證 gas 成本,使用 Groth16 進行開牌證明的鏈上驗證只需要大約200,000,這幾乎比原生驗證方法少了30倍。與原生驗證方法相比,這似乎是一個非常好的選擇。開牌電路如下:

優化"Shuffle"流程

讓我們以德州撲克遊戲為例。在遊戲中,我們需要將 "Shuffle"的結果存儲在鏈上。這不僅充當當前的 Shuffle 結果,而且還充當後續"Shuffle"的公共輸入,如 set deck 操作中所示。最初,設定的牌組默認存儲初始化的牌組。然而,眾所周知,鏈上存儲成本高昂,尤其是大數據量。一副 52 張卡總共包含 208 個 uint256 類型數據,因此存儲成本成為一個重要的考慮因素。

我們的解決方案是在洗牌後只在鏈上存儲部分數據,具體來說,我們只需要存儲 2n+5 張牌,其中 n 是玩家的數量。由於我們的遊戲最多支持 6 名玩家,因此最多只使用 17 張卡牌。這意味著我們最終只需要將這 17 張卡牌存儲在鏈上。

雖然我們最終只需要在鏈上存儲 17 張牌,但前面提到的鏈上存儲的另一個目的是這些牌也將作為後續洗牌的公共輸入。因此,如果只存儲17張牌,就無法驗證洗牌的正確性。

為了解決這個問題,我們的 zk-shuffle 電路將額外輸出整副牌的哈希值作為公共輸入,也存儲在鏈上。驗證 zk-shuffle 時,用戶將預洗牌的牌作為公共輸入上傳,電路將計算用戶上傳的牌的哈希值,並將其與鏈上存儲的哈希值進行比較。

最後,由於只有部分數據被保存在鏈上,用戶可能需要獲取完整的52張牌。為此,我們可以使用合約事件。事件是一種極其低成本的通信方式,允許用戶通過監聽事件獲取完整的遊戲數據。

綜上所述,本次優化不僅有效降低了存儲成本,也保證了遊戲的公平性和完整性。所有相關代碼都可以在uzkge 存儲庫(根據 GPLv3 開源的 Secret Engine 的早期版本)中找到。

Zypher Alpha Net:革新鏈上紙牌遊戲

正如 Risc Zero 合作夥伴公告中所強調的,ZACE的開發團隊正在開發一個由 Zypher 的 zk-Shuffle SDK 提供支持,用於公平的鏈上洗牌,而 Risc Zero zkVM 用於可證明的遊戲邏輯的全鏈上德州撲克遊戲,目前正在 opBNB測試網進行遊戲測試階段,明顯優化了延遲和 gas 成本。

為了進一步為遊戲提供 Web 2.0 體驗,我們很快將推出由 Zytron Kit (Zytron One Pager) 提供支持的 Alpha Net,Zytron Kit 是我們的遊戲專用 Sovereign Rollup Stack,具有 0 Gas、0.2s Blocktime、增強的加密預編譯、Zypher 遊戲引擎等預編譯合約等等。 Alpha Net 將推出一些先鋒的全鏈遊戲,包括 Crypto Rumblez2048、zAce 等支持 0 Gas的遊戲。敬請關注!

關於 Zypher Network

Zypher Network 正在構建下一代自治世界基礎設施,包括從主權 Layer 3 Rollups 到 ZK-as-a-service SDKs 的一系列 ZKP 驅動的遊戲引擎。我們的技術為去中心化遊戲提供了所需的可組合性、可編程性、可擴展性和密碼學原語。它賦予遊戲開發者創造豐富、互動的鏈上世界的能力,強調可擴展性、公平性和遊戲策略的複雜性。

鏈捕手ChainCatcher提醒,請廣大讀者理性看待區塊鏈,切實提高風險意識,警惕各類虛擬代幣發行與炒作,站內所有內容僅係市場信息或相關方觀點,不構成任何形式投資建議。如發現站內內容含敏感信息,可點擊“舉報”,我們會及時處理。
banner
ChainCatcher 與創新者共建Web3世界