【Zypher Research】zk-Shuffle SDK:优化链上卡牌游戏的 Gas 成本
简介
本研究文章解释了我们如何通过优化的密码学(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 Rumble、z2048、zAce 等支持 0 Gas的游戏。敬请关注!
关于 Zypher Network
Zypher Network 正在构建下一代自治世界基础设施,包括从主权 Layer 3 Rollups 到 ZK-as-a-service SDKs 的一系列 ZKP 驱动的游戏引擎。我们的技术为去中心化游戏提供了所需的可组合性、可编程性、可扩展性和密码学原语。它赋予游戏开发者创造丰富、互动的链上世界的能力,强调可扩展性、公平性和游戏策略的复杂性。