ゼロ知識P2Pじゃんけん
ゼロ知識証明とP2P通信を組み合わせた、サーバーレスかつセキュアなジャンケンゲーム
- ゼロ知識証明
- P2P
- React
# ZK P2P Rock-Paper-Scissors
# 概要
「ZK P2P Rock-Paper-Scissors」は、ゼロ知識証明(Zero-Knowledge Proofs)とピアツーピア(P2P)通信を組み合わせた、サーバーレスなジャンケンゲームである。嘘である。実際にはゼロ知識証明は用いておらず、Commit-Reveal方式を利用し、情報を隠したまま宣言し、後からその内容を公開して証明する二段階の仕組みを用いている。中央サーバーを一切介さず、WebRTC DataChannels を利用してプレイヤー間で直接通信を行い、SnarkJS と Circom を用いた証明によって「後出し」や「不正な手」を数学的に防止する。
# 想定ユーザー / ユースケース
- プライバシーを重視するユーザー: 通信ログやプレイ履歴を残したくない人。
- Web3 / ZK技術に関心がある開発者: ゼロ知識証明のブラウザ実装や、サーバーレスなP2Pアプリケーションの実例を学びたい人。
- セキュアな対戦ゲームを求める人: 中央管理者がいない環境でも、数学的な保証によって公平な対戦を楽しみたい人。
# 使用技術(Tech Stack)
## フロントエンド
- React 19: 最新のReactライブラリを使用した、コンポーネントベースのUI開発。
- TypeScript: 型安全性による堅牢なコードベース。
- Vite: 高速な開発サーバーおよびビルドツール。
## UI / スライリング
- Tailwind CSS 4: モダンなユーティリティファーストのCSSフレームワーク。
- Lucide React: 一貫性のあるアイコンセット。
## 状態管理 / データ
- Zustand: 軽量なグローバル状態管理。
## ブラウザAPI
- WebRTC DataChannels: サーバーを介さないリアルタイムのP2P通信。
- Web Crypto API: 高速な暗号処理とハッシュ生成。
## 開発環境
- Bun: 高速なJavaScriptランタイムおよびパッケージマネージャー。
- SnarkJS / Circom: ゼロ知識証明の回路作成と証明生成・検証。
# 主な機能
- サーバーレスP2P対戦:
- WebRTCの手動シグナリングにより、サーバー不要で接続を確立。SDP(Session Description)をコピー&ペーストするだけで対戦を開始する。
- ゼロ知識証明による公平性の保証:
- Commit-Revealプロトコル: 手を出す前にハッシュ値(コミットメント)を交換し、後から手(Reveal)を公開する。
- 不正防止: 公開された手が、最初にコミットした手と一致すること、および「グー・チョキ・パー(0, 1, 2)」のいずれかであることを、手そのものを明かす前にZK証明で保証する。
- ローカル完結型の処理:
- ZK証明の生成と検証はすべてユーザーのブラウザ上で行われ、秘密鍵(Salt/Nonce)や選択した手が外部に送信されることはない。
# 技術的ポイント:詳細解説
## 1. ゼロ知識証明(ZK)を活用した対戦フロー
本ゲームでは、相手に手を知られずに「自分が選んだ手は正当である」と証明し、後から「最初に選んだのはこの手である」と証明するために Commit-Revealプロトコル を採用している。
## 2. P2P接続:サーバーレス・シグナリング
通常、WebRTC接続には仲介役のサーバーが必要ですが、本プロジェクトでは手動シグナリングによってサーバーへの依存を100%排除している。
## 3. Circom(サーコム)とは?
Circom は、ゼロ知識証明のための「計算回路(Circuit)」を作る専門の言語である。
[!TIP] > パズルに例えると...
あなたはある「難しいパズル(計算問題)」を解いたとしよう。相手に対して「正解そのもの」は見せたくないが、「確かに解いた(正解を知っている)」ということだけは信じてもらいたい...。
そのための**「魔法の解答用紙(回路)」**を作るのが Circom である。
- あなたは Circom で「正解ならOK、不正ならエラー」と答える回路を設計する。
- あなたが手元で回路に答え(秘密の入力)を入れると、**「ZK証明書」**が発行される。
- 相手はその「ZK証明書」と「回路のルール」を見るだけで、あなたの答えが正解であることを100%確信できる。
本プロジェクトの Circom 回路(hand_integrity.circom)では、以下の2点を厳格にチェックしている
- 手の正当性: 入力された値が「0(グー)、1(チョキ)、2(パー)」のいずれかであること。
- 改ざん防止: 出力されたハッシュ値が、自分の公開鍵や現在のラウンド番号、選んだ手から正しく計算されたものであること。
## 4. セキュリティ設計
- リプレイアタック対策: ハッシュ生成に
roundNumberを含めることで、過去の証明を再利用して不正を行うことを防いでいる。 - Poseidonハッシュ: ZK技術での計算効率が非常に高い、Web3時代のモダンなハッシュ関数を採用してる。
# 動作条件(重要)
- モダンなブラウザ: WebRTC および WebAssembly (for SnarkJS) が動作する最新のブラウザが必要である。
- 手動接続: 対戦相手と何らかの手段(チャットツールなど)で接続情報を一回交換する必要がある。
- 証明生成時の計算負荷: ブラウザ上で証明を生成するため、一時的にCPU負荷が高くなる場合がある(数秒程度)。
# 今後の改善案
- シグナリングの自動化: 必要に応じて、利便性向上のためのオプションとしてシグナリングサーバーへの対応。
- ターンベースから同時進行への拡張: 複数の対戦を並行して行えるスケーラブルな設計への変更。
- 他ゲームへの応用: このZK P2P基盤を、ポーカーや将棋などのより複雑なボードゲームに応用。