Commit-Reveal Scheme を応用したフルオンチェーンPvPコマンドバトルゲーム
GameFi では Earn できることからそのエコシステムがゲーム内に閉じておらず、外の世界に影響が伝播する。故にゲームの都合だけで状態を巻き戻すことが困難なため、普通のゲーム以上に不正や改竄の検知が重要になる。そのためフルオンチェーンでゲームを行いたいが、ブロックチェーンの公開台帳的な性質によって得られる”透明性”と情報を完全に公開しないことでゲームの面白さを引き出す”表現力”のトレードオフが発生する。オンチェーンに載せるという制約によってゲーム内で実現できる表現の幅が狭まり、ゲームの面白みが失われる可能性があるのだ。
今回我々はフルオンチェーンでも表現力を担保するために、Commit-Reveal Scheme を応用した新しいプロトコルを考案した。そしてこのプロトコルを用いて“同時に出す”、”隠す”という要素を盛り込んだフルオンチェーンPvPコマンドカードバトルゲームPOLYLEMMAを開発した。このプロトコルは GameFi に限らず、オンチェーンにおける改竄耐性や不正検知能力といった”透明性”の高さを生かしつつ、同時に”表現力”も保ちたい幅広い場面に応用できるプロトタイプとなっている。
- 「Commit-Reveal Schemeを用いてオンチェーンで同期を実現したコマンドバトル」の解説はこちら。
- 「Commit-Reveal Scheme を応用した新しいプロトコル」の解説はこちら。
上記アイデアの元となっているCommit-Reveal Schemeのわかりやすい解説はこちら。Commit-Reveal Schemeをご存知でない方はまずはこちらをお読みいただきたいです。
(プロダクト全貌は以下の詳細にて解説しています。)
Mumbai Testnet
- PLMCoin contract: "0xA0dcb1F996CB1335D4356C944C7168EE75a94953"
- PLMToken contract: "0xCF8D3345dd90B218b9F428562fe5985dC4AcDd56"
- PLMDealer contract: "0x38CE8D774a9fcb04Fa9AfeE5B0d0B82B7824857f"
- PLMMatchOrganizer contract: "0xD60a1442Fd07b45f8161515A3E8f392DdcCD1661"
- PLMBattleField contract: "0xa8F64D2Cd2F0597B586BFcfc940a49C9f2ea1247"
ガチャでゲットしたキャラクターを確認できます! https://testnets.opensea.io/collection/polylemma-v4
Solidity, Foundry, Anvil, Cast, NodeJS, EtherJS, React
-
バックエンドの開発
- Kosei Teramoto (terapoon)
- Shue Shiinoki (nokinoki)
-
フロントエンドの開発
- Nobuho Hashimoto (hassy)
- Atsushi Kato (a_kato)
こちらの順で読んでいただくことで、プロダクトの全貌が理解しやすくなっておりますが、本プロジェクトの肝である新しいプロトコルに関する解説はバトルシステム以降で説明しております。
- 前提知識
- ゲームの要素とその実現方法について
- バトルシステム
foundry (solidity 開発ツール) を使用してローカル環境にノードを立ち上げ、疑似的なチェーン上でゲームをテストできます。その手順を以下に示します。
$ curl -L https://foundry.paradigm.xyz | bash
$ foundryup
anvil (foundryの機能の1つ)を使ってテストチェーンノードを立ち上げ. localhost:8545 (デフォルト) に立ち上がる.
$ anvil
この時出力される使用可能なアドレスのprivate keyを1つメモしておく。
$ git clone https://github.com/team-tissis/polylemma
$ cd polylemma
.envファイルを作成し、以下のようにしてPRIVATE_KEYにanvilで作成されたアカウントの秘密鍵をセットする。
PRIVATE_KEY={先ほどメモした秘密鍵}
以下を叩いて環境変数をアクティベート。
$ source .env
##デプロイ 以下コマンドでローカルノードにスマコンをデプロイ。
$ forge script script/PLMGachaScript.s.sol:PolylemmagachaScript --fork-url http://localhost:8545 --broadcast
クライアント側は下記のtestnetと同様ですので、記載のリポジトリを参照ください。
本レポジトリはゲーム本体であるスマートコントラクトが格納されています。
ゲームをプレイするためのクライアント用ソフトウェアは下記の我々が作成した別レポジトリに格納されています。
スマートコントラクトは既にmumbai testnetにデプロイされており、この別リポジトリにあるクライアントソフトウェアを使用することでスマートコントラクトとやりとりしてゲームをプレイすることが可能です。
クライアントインストール方法もそちらのREADMEにありますので、ご確認ください。
https://github.com/team-tissis/polylemma-client/
スマートコントラクト同士の関係図。矢印はどのような操作を依頼するかを表している。