热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

隐私又公平!如何用zkSNARK做一款链上德扑游戏?

在过去一年多时间里,越来越多人意识到ZK(零知识证明)这种密码学工具的强大,我们也看到很多零知识证明应用的兴起,比如隐私社交


在过去一年多时间里,越来越多人意识到 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:

https://drive.google.com/drive/folders/1ymUL3jDT1CZdqMKGVVneMXz8uh0A-HYb



关于 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 成员,伯克利大学区块链加速器成员。

We're Hiring!
访问查看开放职位:https://jobs.lever.co/MantaNetwork

关注官方频道了解有关 Manta/Calamari 的更多信息:

Website:https://manta.network/
Github:https://github.com/Manta-Network
Twitter:https://twitter.com/MantaNetwork
Medium:https://mantanetwork.medium.co
Telegram:https://t.me/mantanetwork
Discord:https://discord.gg/ZtSuSKRy8X
Telegram 中文:https://t.me/mantanetwork_zh
Twitter 中文:https://twitter.com/manta_china

 


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
author-avatar
mobiledu2502885385
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有