zkSNARKを使ってオンチェーンのポーカーゲームを作るには?
著者: マンダロリアン、Manta Network Protocol
過去1年以上の間に、ますます多くの人々がZK(ゼロ知識証明)という暗号学的ツールの強力さを認識するようになり、プライバシーソーシャル、プライバシー投票、プライバシーDAOなど、ゼロ知識証明のアプリケーションの台頭を目にしています。実際、ゼロ知識証明の応用は非常に広範で、オンチェーンのプライバシー需要があるアプリケーションはすべてゼロ知識証明を利用する可能性があります。
最近終了したETHSanFrancisco 2022のETHGlobalハッカソンイベントでは、Manta Networkの暗号学開発チームの仲間たちが、わずか36時間の間にzkSNARKに基づくテキサスホールデムポーカーゲームを作成し、ApeCoin、ENS、SKALE、Optimismが主催する4つの競技部門で賞を受賞しました。
多くの人が知っているDark Forest(ダークフォレスト)は、zkSNARKに基づくリアルタイム戦略(不完全情報)ゲームです。不完全情報ゲームとは、プレイヤーがすべての状態を把握していないゲームのことです。例えば、ポーカーでは、プレイヤーの手札は秘密の情報であり、カードを引くプロセスも完全にプライベートです。不完全情報の面白さは、一連の複雑なゲーム戦略を生み出すことができる点にあります。
公共のブロックチェーン上では、オンチェーンデータの公開性と透明性のため、不完全情報ゲームを構築することは難しいです。しかし、ゼロ知識証明技術を使用することで、プレイヤーはプライバシーを保持しながら、検証可能な有効なアクションを公開することができます。
今回のハッカソンイベントでは、Manta NetworkがzkSNARKに基づいてオンチェーンのテキサスホールデムのシャッフルと配布システムを構築しました。このシステムは、オンチェーンテキサスホールデムゲームにおける2つの問題を主に解決します:どのように公平にシャッフルを行うか、そしてどのようにプレイヤー間で配布を隠密に行うか(さもなければ、ゲームはMEV問題のために続行できなくなる可能性があります)。
本質的に、ゼロ知識証明に基づくオンチェーンテキサスホールデムは、配布主体を分散化し、ディーラーが配布を制御することでゲームを支配することを防ぎます。
Web2の中央集権的クライアントでテキサスホールデムをプレイしていると、非常に可能性の低いカードがちょうどあなたに配られるという状況に遭遇することがあります。高確率で得られるカードが出てこないこともあります。
目的は、配布を操作してゲームを支配し、相手がオフラインで勝つ確率が極めて低い状況で、オンラインでちょうどあなたに勝つことです。
これが、私たちが分散型テキサスホールデムを必要とする理由です。
ZKShuffleシステムには3つの機能があります:
ZKShuffle.setup:各プレイヤーは鍵ペアを生成し、各人の対応する公開鍵をまとめて一組の集約公開鍵を生成します。
ZKShuffle.shuffleencrypt:シャッフルを行う際、各プレイヤーは順番にshuffleencryptを呼び出す必要があります。
暗号化と復号化が任意の順序で行えるようにするため、ここでは同型暗号方式(Homomorphic Encryption scheme)を使用します。例えば、このゲームには3人のプレイヤーがいる場合、1ラウンドの暗号化を経た後、各カードには3つの暗号ロックが付けられます: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を使用してテキサスホールデムのデモを構築しました。これは、Solidity、React、Ether.jsに基づく分散型アプリケーションです。このデモでは、新しいゲームが始まるたびに、すべてのプレイヤーが一回の設定を行い、オンチェーンのこのポーカーデッキが公平にシャッフルされていることを保証します。その後、各プレイヤーは一回の復号化を行い、2枚のカードを取得します。これにより、プレイヤーはEVMブロックチェーン上でテキサスホールデムをプレイできるようになります。
Mantaは現在、このDAppをOptimism Goerli、Ethereum Goerli、Skaleブロックチェーンにデプロイしています。
実現原理
全体のプロジェクトは3つの部分で構成されています:
ZK回路;
復号化とシャッフルを検証するためのスマートコントラクト、ZKShuffleコントラクトとゲームロジックコントラクト、DAppフロントエンドはReactとether.js、Circomlib JSライブラリを使用して構築されたデモ;
Circomlib暗号学JSライブラリ。
Circomの実装では、ElGamal暗号方式を採用し、既存のCircomライブラリ(例えば、poseidon hashes)を使用しています。
暗号化回路には87308のR1CS制約(constraints)があり、DAppにおける証明生成時間は4.5秒です。復号化回路には1522のR1CS制約があり、DAppにおける証明生成時間は0.1秒です。SnarkJsを使用してDApp内のゼロ知識証明を生成します。
スマートコントラクトは2つの部分で構成されています:ZKShuffleフレームワークコントラクトとテキサスホールデムゲームロジックコントラクト。ZKShuffleコントラクトはZKP検証ロジックと2つの回路を簡易にラップしています。ロジックコントラクトは状態機械をデプロイし、RPCノードからゲームの現在の段階とどのプレイヤーの順番かを取得します。
DAppはReactフレームワークとEther.jsを使用して実装され、テキサスホールデムのテーブルと各プレイヤーのアクションアニメーションを表示します。プレイヤーがアクションを行う必要があるとき、そのプレイヤーはUI内のボタンをクリックし、metamaskを使用して取引署名を行うだけです。
Manta Networkについて
Manta Networkは、プライバシー保護を通じてより良いWeb3の世界を構築することに取り組んでいます。Mantaの製品設計は第一原理から出発し、zkSNARKなどの先進的な暗号学アーキテクチャを通じてブロックチェーンユーザーにエンドツーエンドのプライバシー保護を提供します。プライバシーを保護しながら、Mantaは相互運用性、利便性、高性能、監査可能性を兼ね備え、ユーザーが任意のパラレルチェーン資産間でプライバシー転送と取引を行うことを可能にします。Mantaのビジョンは、ブロックチェーン全体により便利なプライバシー保護サービスを提供することです。
Mantaの創設チームは、複数の暗号通貨の専門家、教授、学者で構成されており、彼らの経験にはハーバード大学、マサチューセッツ工科大学、Algorandが含まれています。Mantaの投資機関には、Polychain、ParaFi、Binance Labs、Multicoin、CoinFund、Alameda、DeFiance、Hypersphereなどがあります。Mantaはまた、Polkadot公式のWeb3財団からの資金提供を受けており、Substrate Builder Programのメンバーであり、バークレー大学のブロックチェーンアクセラレーターのメンバーでもあります。