如何用 zkSNARK 做一款鏈上德撲遊戲?

277次閱讀

 

作者:曼達洛人,Manta Network Protocol

在過去一年多時間裡,越來越多人意識到 ZK(零知識證明)這種密碼學 工具 的強大,我們也看到很多零知識證明應用的興起,比如隱私社交、隱私投票、隱私 DAO 等等。實際上,零知識證明的應用非常廣闊,有鏈上隱私需求的應用都可能會用到零知識證明。

在剛剛結束的 ETHSanFrancisco 2022 期間的 ETHGlobal 黑客松活動中,Manta Network 密碼學開發團隊的小夥伴們就在短短 36 個小時的時間裡做出了一款基於 zkSNARK 的德撲游戲,並在 ApeCoin、ENS、SKALE、Optimism 主辦的四個競賽單元拿到獎項。

很多人所熟知的 Dark Forest(黑暗森林)就是基於 zkSNARK 的一款實時策略(非完全資訊)游戲。非完全資訊游戲即玩家不掌握全部狀態的游戲,比如在撲克中,玩家手中的牌是私密資訊,摸牌的過程也是完全隱私的。非完全資訊的有趣之處就在於可以催生一系列複雜的游戲策略。

在公共區塊鏈上,由於鏈上數據的公開透明,很難構建非完全資訊游戲。但是,通過零知識證明技術,玩家可以保持在保持隱私狀態的同時,公開提交可驗證的有效動作。

在此次的黑客松活動中,Manta Network 基於 zkSNARK 構建了一款鏈上德撲洗牌和發牌系統。這套系統主要解決了鏈上德撲游戲中存在的兩個問題:如何公平地進行洗牌以及如何隱蔽地在玩家間發牌(否則游戲可能會因為 MEV 問題而玩不下去)。

本質上,基於零知識證明的鏈上德撲,讓發牌主體 去中心化,莊家無法通過控制發牌來控制牌局。

在 Web2 中心化客戶端裡玩德撲,會遇到這樣的情況,可能性極小的牌,剛好就發給你了。大概率能得到的牌,卻出不來。

目的就是借發牌操縱牌局,讓你的對手,在線下贏牌概率極低的情況下,在線上恰好贏你。

這就是為甚麼我們需要去中心化德撲。

ZKShuffle 系統有三個功能:

ZKShuffle.setup:每位玩家都生成一個密鑰對,並將每個人對應的公鑰放在一起生成一副聚合公鑰。

ZKShuffle.shuffle_encrypt: 在進行洗牌時,每位玩家都需要依次調用 shuffle_encrypt。

為了保證加密和解密可以任意順序進行,這裡我們用到的是同態加密方案(Homomorphic Encryption scheme)。比如說,本局游戲中有三位玩家,在經過一輪加密後,每張牌都會有三個加密鎖:Card{Alice, Bob, Charlie}。

ZKShuffle.decrypt: 如果想要向一位指定玩家發牌,每個玩家都需要調用解密功能。比如說,如果游戲的邏輯是要將牌發給 Charlie,正確的順序應該是:Alice 拿到加密牌 Card{Alice, Bob, Charlie},用她的密鑰進行解密,然後將解密後的牌 Card{Bob, Charlie} 在鏈上進行提交,同時提交一個零知識證明來驗證解密的有效性。

Bob 在鏈上拿到 Alice 提交的這張部分解密的牌 Card{Bob, Charlie}後,再用自己的密鑰進行解密,並在鏈上提交這張牌 Card{Charlie} 以及驗證解密有效性的零知識證明。最後 Charlie 就拿到了 Card{Charlie},只用他自己的密鑰解密就可以查看他的牌了。

Manta Network 密碼學開發團隊用 ZKShuffle 構建了一套德州撲克 demo,這是一個基於 Solidity, React 和 Ether.js 的去中心化應用。在這個 demo 中,每當一輪新的游戲開始,所有的玩家都要進行一輪設定,以保證在鏈上的這幅撲克牌是公平洗過的。然後,每位玩家都需要進行一輪解密後拿到兩張牌。這些,玩家就可以在一條 EVM 區塊鏈上玩德州撲克啦。

Manta 目前已將這個 DApp 部署在了 Optimism Goerli, Ethereum Goerli 和 Skale 區塊鏈上。

實現原理

整個項目由 3 部分組成:

  • ZK 電路;

  • 用於驗證解密和洗牌的 智能合約,包括 ZKShuffle 合約和游戲邏輯合約 DApp 前端,使用 React 和 ether.js 以及 Circomlib JS 庫構建的 Demo;

  • Circomlib cryptographic JS 庫。

在 Circom 的實現中,採用 ElGamal 加密方案,並使用現有的 Circom 庫,如 poseidon hashes。

加密電路有 87308 個 R1CS 約束(constraints),在 DApp 中的證明生成時間為 4.5 秒。解密電路有 1522 個 R1CS 約束,在 DApp 中的證明生成時間為 0.1 秒。使用 SnarkJs 來生成 DApp 中的零知識證明。

智能合約由兩部分組成:ZKShuffle 框架合約和德撲游戲邏輯合約。ZKShuffle 合約簡易封裝了 ZKP 驗證邏輯和兩個電路。邏輯合約部署了一個狀態機,從 RPC節點 獲得游戲當前階段和輪到哪個玩家的次序。

DApp 使用 React 框架和 Ether.js 實現,展示德撲桌面以及每位玩家的動作動畫。當需要玩家做出動作時,這個玩家只需點擊 UI 中的按鈕,使用 metamask 進行交易簽名即可。

觀看 Demo

關於 Manta Network

Manta Network 致力於通過隱私保護構建一個更好的 Web3 世界。Manta 的產品設計從第一性原理出發,通過 zkSNARK 等領先的密碼學架構為區塊鏈用戶提供端對端的隱私保護。在保障隱私的同時,Manta 兼具互操作性、便捷性、高性能以及可審計性,允許用戶進行任意平行鏈資產間的隱私轉賬和交易。Manta 的願景是為整個區塊鏈世界提供更便捷的隱私保護服務。

Manta 的創始團隊由多位 加密貨幣 資深人士,教授和學者組成,他們的經驗包括哈佛大學,麻省理工學院和 Algorand。Manta 的投資機構包括 Polychain、ParaFi、Binance Labs、Multicoin、CoinFund、Alameda、DeFiance 以及 Hypersphere 等。Manta 也是波卡官方 Web3 基金會資助獲得者,Substrate Builder Program 成員,伯克利大學區塊鏈加速器成員。

 

鏈訊星球
版權聲明:本站原創文章,由 鏈訊星球 2022-11-15發表,共計2467字。
轉載說明:除特殊說明外,本站文章如需轉載請註明出處。