モナダム(Knights of Monadom)とは、モナカードを用いた対戦カードゲームです。
ChatGPTと組み合わせて、ユニークなバトルを繰り広げ、ユーザーを楽しませてくれます。
(…という説明で良いのかしら)
リアルタイム対人戦イベントが毎週水曜に行われており、Xのハッシュタグではそのユニークな戦歴を見せあって交流が行われています。
こういうのを作りたい・欲しい
しばらくぶりにブロックチェーン界隈だったので、だいぶ景色が変わってしまったんじゃないかと、思ってまずは色々と追いかけてみました。
結論から言えば、正直言って、この数年で思ったほどに何かが変わったり、浸透したようには思えませんでした。
まぁAIブームが来てしまったせいでしょう。そういうことにしておこう。
そう思いながらアレコレみていたら、やはりモナ界隈、モナカードがあったのは知っていましたが、面白そうなことをやっていたではないですか。
勉強のために遊んでみて、ウォレットを用いた署名によるログインを始め、色々と参考になりました。
もし、そんなのとっくにサービスに組み込んでやってるよ!って人が居たら申し訳ないのですが、実にWeb3というか暗号通貨界隈っぽくていいなぁと感じました。
他には単純にそれで楽しんで遊んでくれているユーザーがいるというのはとても羨ましい。
そして、得られた着想と自分の考えを盛り込んだ「SymBreak(仮称)」を作っていこうと思いました。
「SymBreak(仮称)」とは
"SymBreak<シン・ブレイク>"とは、あらゆる世界の戦士達がぶつかり合い、戦いを繰り広げるTRPG風ゲームです。
先に雰囲気とリンクをお見せしてしまいましょう。
分かるようなら遊び始めてしまっても構いません。
ごくシンプルなことしか出来ていないのですが、簡単に表現すると、
「アドレスが保有するモザイクを用いて、それに設定されたフレーバーを用いて、AI(gemini)に物語を作ってもらう」ということをしています。
言ってしまうとこれくらいの仕組みなのですが…作り出される独特な物語を楽しんでもらえたらと思います。
ログイン
ログインはSymbolアカウントの署名によって行います。
アドレスか公開鍵を入力し、各ログイン方法で署名をしてください。
なおネットワークは現在「テストネット」を使用しているため、対応したアカウントをご用意ください。
なお、一度でもネットワークに認識されたアカウントのアドレスでないと、情報を引けないため、新しいアカウントを用いる場合は、公開鍵でログインを行ってください。
外部アプリケーションによる署名は「SSS」、「KeyStone」に対応しています。
秘密鍵を直接扱う事自体は推奨できるような方法ではありませんが、一番簡単な方法として、用意しています。
捨てアカウントでお願いします。
ガチャ
キャラクターが居ないと遊べないので、とりあえず15分ごとに引けるガチャを用意しました。
なお、完全ランダムで、ダブっても合成とかはないです。
ガチャで出たキャラクターはそのモザイクがログイン中のアドレスへ送信されます。
転送が完了してから一覧に表示されるようになります。
1分ほど経ったら、「所有情報を更新」ボタンを押下してみてください。
一覧から、「⚡️」のアイコンを押下すると、冒険の使用するキャラクターを決定できますので、誰か一人を選択してください。
探索
使用するキャラクターを設定したら、探索してみましょう。
敵のキャラクターと遭遇し、バトルが始まります。
戦歴は履歴から表示できるので、これまでの物語を見返すこともできます。
キャラクター作成
「設定」>「キャラ作成」から、キャラクターの作成登録申請を出せます。
自分でたくさん作るにはシンドいので、どうぞ皆さんお好きな設定と画像でキャラクターを登録してください。
なお、申請を受け付けてチェックしてからの登録になるので、ご了承ください。
やたらにセンシティブや不謹慎なものでなければ通しますので、楽しくやっていただければ。
登録したキャラは、100モザイク分発行され、90はガチャへ、10はログイン中のユーザーへ転送されます。
画像はどこぞのストレージへアップロードして、URLを貼ってもらいたいのですが、手軽にアップロードできるサービスを活用していただければと思います。
アップロードして、画像への直接URLを手に入れて、貼り付けてください。
https://www.image2url.com/jp
https://imgbob.net/ja
https://bashify.io/ja
https://imgbb.com/
ぜひ遊んでみてね
どうにかアドカレ中にねじ込もうと突貫で作ったので、操作感や導線が良くなかったり、最悪はデータが壊れる脆弱性があるかもわかりませんが…。
α版であることとテストネットでの稼働ということで、大目に見つつ、素直に楽しんでもらえれば幸いです。
また、モナダムはもっとパラメタなどでゲームとしてより複雑に楽しめるようにしているとのことなので、こちらもぜひ遊んでみてください。
構成や技術的な要素
ソースコードは現時点で書き散らしとバイブコーディングで見せられたものではないので、あくまでも現時点での試験的なものであり、後々変わっていくかもしれませんが、特筆すべきところを簡単に記述します。
ブロックチェーンの利用
このゲームにおいて、ブロックチェーン(上のデータ)は次の要素で利用しています。
アカウント
Symbolアカウントをシステム上のアカウントのIDとして用いるために署名によるアカウント所有の証明に用いています。
この事自体は公開鍵認証でしかないのでブロックチェーン特有というわけではありませんが、故にトランザクションを用いなくても所有の確認をすることに利用できます。
今回の構想においてのログインでは、転送トランザクションへの署名とその検証によって、アカウントの所有確認を行っています。
SSSやKeyStone、aLiceなどの署名用アプリケーションには、任意の値に署名をする機能があり、おそらくこういった用途を想定してのことだと思われますが、転送トランザクションというごく基本のトランザクションへの署名さえでき、その署名済みトランザクションが手に入れば、確認は可能であるので、こちらを流用したほうが汎用性を持たせられると考えたからです。
ただし、正規の転送トランザクションでもあるため、間違ってネットワークに承認されてしまわないように、deadlineやfeeを0にし、ネットワークに取り込まれるにはinvalidなトランザクションになるように工夫しています。
モザイク
モザイクはキャラクターの定義に利用しています。
今回の実装では次のようにプロパティを設定しています。
シンプルに、転送可能としただけです。
| プロパティ | フラグ |
|---|---|
| 第三者への譲渡可否 | ◯ |
| 供給量変更の可否 | ✗ |
| 制限設定の可否 | ✗ |
| 発行者からの還収可否 | ✗ |
プロパティの設定の仕方で仕様を決定する、という方法もあると思います。
今回は、ユーザー間でキャラクターの交換や受け渡しができることを可能とすべくこうしましたが、
- 他人には譲渡出来ないことで、ゲーム運営から直接配布でしか手に入らないキャラクターとする
-
revokableに設定することで、一定の期間のお試しキャラクターや条件を満たさなかった場合に回収されてしまう - 制限フラグを有効にして、アカウントが特定の条件を満たしていないと受け取れない
などの色々な条件を付けることもできるでしょう。
モザイクメタデータ
モザイクにはそれが何なのかという定義とゲーム用の定義のメタデータをもたせることにしました。
メタデータキーごとに、JSONオブジェクトを文字列として格納しています。
基本情報(entity)
{
"v": "{バージョン表記}",
"name": "{名称}",
"flavor": "{フレーバーテキスト}",
"url": "{画像URL}",
"digest": "{画像ダイジェスト}",
"phash": "{画像PHash}"
}
最低限キャラクターとしての意味づけを行う属性を定義するものです。
digestは画像のSHA-256ハッシュを取ったもので、同一性を確認するものです。
phashは画像のperceptual hashを取ったもので、こちらもある程度の同一性を確認するものです。
この定義において、画像はいわゆるフルオンチェーンとはなっていません。
現時点で対応しきれていないのですが、参照先の画像自体が差し替えられたことを、この値でのチェックすることができます。
単にURLの示す先が重要なので、どこかのサーバに置いたものでも、IPFS上でも、オンチェーンにしたものでもいいかもしれません。
(読み込みに対応する必要があるとは思いますが)
メタデータは更新することができるため、これらの内容の変更も可能です。
データを扱う側は、扱いを始めた時点の内容だけを扱うようにし、変更を受け入れるかどうかはモザイク作成者との確認で実施するものとしています。
ゲーム情報
{
"v": "{バージョン表記}",
"role": "{役割}",
"equip": "{装備}",
"skill": "{能力}"
}
ゲーム側で利用したい属性の定義です。
これらはあくまでもゲーム側の都合で持たせるものとしています。
この情報をモザイク側に持たせた場合は、ゲーム側からそのパラメタについてリードオンリーとなるため、運営側で管理する必要がなくなります。
逆に、運営側でモザイクに対してパラメタをマッピングするのであれば、それは当然運営の責任が発生することになります。
これをどうするかは、運営のスタンスや設計、責任範囲の問題ということになります。
もし、新たな属性が必要な場合は、運営が作成者に依頼して、メタデータの追記を行ってもらうためにコンタクトを取る必要があるでしょう。
データ管理の責任範囲
メタデータとして持たせるか、運営が管理するかはどのようなことをやりたくて、どちらが適切かを判断する必要があります。
値の管理をブロックチェーン上に極振りすれば、冪等性のある単なる関数だけのゲームを構築できるかもしれません。
その場合は単にソースコードを管理するだけでも良くなりますね。
現実的には成果やログの記録が必要かもしれませんが、それが無くてもいい、一時的なストレージ上でしばらく生きていればよい、と割り切ったり、はたまたチェーン上に記録すればいい、という判断もできるでしょう。
つまり、どのようなデータをブロックチェーンに載せるのか、そうでないデータはどれくらいにするか、どう扱うか、そういう判断が求められ、それをうまくチューニングすることでSymbolブロックチェーンをうまく使いこなせるという状態にできると思っています。
メタデータの取得
API経由で取得できるメタデータは、最後の更新、つまり最新のものしか取得できません。
ある時点のメタデータを指定する、ということが出来ないのです。
(API経由では。ノードのデータから直接取り出すなら、何らかのハッシュ値で可能かもしれない)
アカウントのトランザクションから遡ったり、手段がないというわけではなさそうですが、回りくどく呼び出すAPIも多くなり、現実的ではありません。
今回の構想では、メタデータの内容についてはサーバ側で保持し、それと突合させることで、変わっているかどうかについてを確認する想定です。
(まだ出来てはいませんが…)
もし特定のハッシュやキー値で取得できるなら、チェーン上の値は不変であるため、そのような仕組みも不必要になるでしょう。
技術スタック
今回はそんなに複雑でも難しいものでもなく、至ってシンプルに普通というレベルです。
- Svelte5.x
- Firebase
- gemini API
ざっくりいうとこんな感じです。
Svelteは最近気に入ってます。ただそれだけの理由ですが、周辺のライブラリも必要十分に質が良いものも出揃っているし、サードパーティライブラリも対応していることが多いです。
FirebaseはHosting,Firestore,Functionsと一通り動かすための機能が全部揃っていてアレコレ考えなくてもいいので気に入っています。
プッシュメッセージもできるので、おいおい組み込みたいところです。
物語生成にはGemini 2.5 Flash-Liteを用いています。
これは現時点で比較的安くて、性能的に十分だからという理由です。
以下、書き散らした自己満足のポエムです。
ご興味のある人は読み進めて貰えれば。
しかし、その理念に共感し、より発展、改善していけたら幸いです。
もっと大きな経済圏へ(以下ポエム
このゲームという範疇だけで語るなら、せいぜい上記の話を拡大していき、ゲームとして面白いものを作っていけばいいということにはなりますが、それならブロックチェーンを使わない方がいいとすら思います。
いわゆるNFTの問題点
一斉を風靡し、数々の金の奪い合いで笑ったもの・泣いたものと残った電子ゴミで埋め尽くされたNFT界隈であるわけですが、貴重なものとしての保有コストが安すぎるということが問題なのではないかと思いました。
暗号通貨界隈、秘密鍵を守ることは前提ですが、守るといっても流出・漏出させない程度の話であって、極論それだけなので、事実上コストは0といっても過言ではありません。
(偶然、同じ鍵を引き当てる、という可能性については考えない)
現実世界では、どんなに貴重なモノでも、それを色々な脅威から所有を守るために、セキュリティにお金を投じたり、法的な管理体制が必要だったり…とにかく資産の維持をするために資金・資産が必要です。
だから、その周囲にお金が流れて潤うし、所有者もそれに見合うコストを掛けたり、それが難しいようなら、納得の行く金額で手放したりすることで、お金の流れが生まれるでしょう。
しかし、NFTはそういうものが無い。無いから結局握り続けて、マネーゲームで遊ばれて、笑う人・泣く人を作るだけで終わってしまう。
だから、動かないトークンには価値がない、トークンは動いてこそ価値があるものだと思っています。
(結局、マキシマリストのような人から言わせれば旧態依然のアナロジーだと揶揄されるでしょうが、そもそも結局我々の生活や認知はそれほど進化していないでしょう)
モザイクに価値を、動かす動機を
だからNFTに限らず、モザイク(トークン)は動いてなんぼのものなので、Symbol経済圏に参入するなら、その動かすための動機をぜひ提供していただきたい。
例えば、このゲームでキャラクターとして定義されているモザイクAがあるとして、
このモザイクAを転送してくれたら一品無料にするよ!というサービスをある居酒屋が始めたとする。
すると、所有者には「このキャラクターを手放したくない」「一品無料になるなら行ってみたい」という葛藤が発生することになります。
このように、ある場所やシステム上で機能しているモザイクに勝手に後付けで価値をつけ、そのモザイクを奪うということがあってもいいし、むしろそういった動機を作り出さないとモザイクの移動が起こりえません。
これは、例えばバーコードバトラーやモンスターファーム、食玩のような世界観に近いかもしれません。
ある別の動機のために、本来の価値や機能には興味がないが、それを手に入れたいという欲求です。
そうやって、ゲーム間でキャラクター情報が共通して使われてもいいし、そのモザイクを手放すことで別のモザイクを渡すよ、という選択肢を提供したりしても面白いだろうし、そうやってユーザーとモザイクの奪い合いが生まれたら、どんどん活性化していくでしょう。
いや、考えてみたら普通のことか
色々書き散らかしたものの、だんだん、新製品が発売されたら、それを法定通貨を使って手に入れる、というだけの、そもそも普通のこととあまり変わらないことに気が付きました。
(まだNintendo Switch 2をそこら辺のヤマダデンキで買えないのかよ…)
そう、普通の経済活動でした。
別にモザイクだからといって特別なものでもなんでも無かった。
(まぁ現実問題、ガッツリ金融的な価値が付くようなことをしてしまうと、法的な問題に抵触しかねませんが)
でも、Symbolは、その所有を簡単にかつグローバルに扱えるという点に価値があると、その仕組みを使うことで、既存経済を塗り替えるものではなく、あくまでも既存経済と融合し、より新しい経済(New Economy Movement)を生み出すためのものだと思っています。
なんかそういうふうにならねぇかな
というわけで、適当に書き散らかしただけのポエムなので、もう飽きてこんなところを読んでいるひとは居ないかもしれませんが、SymBreak(仮称)はほそぼそと妥当Knights of Monadomを目指して作っていきたいし、オークションやロッタリーシステムも実現したいし、それらのコードは公開して、その仕組みを使うことで本業をブーストできるような世界観にもしていきたいし、そうなって欲しい。
nemについてははっきり言って、Symbolがリリースされた時点で無価値になったと思っている派なので、正直どうでもいいまであるっちゃあるのですが、生きている以上は、Symbolとの互換性はそこそこあるし、活用できる部分があるなら、活用したらいいんじゃねーかな、法定通貨換算で安く済むなら、そっちを使う、とかって考えもあるし。
ブロックチェーンの文脈では割と永久・恒久的にデータが保存できることを推しがちですが、自分は数日、数週間、数カ月スパンで正当性が確認できれば十分くらいの雑さで使えるものくらいで、ちょろっと、しかしたくさん使うっていうのがいいんじゃないかなと思ってますけどね。
というわけで、これからもGOOD LUCK! Symbol/nem
![FireShot Capture 009 - Knights of Monadom - [knightsofmonadom.monatoka.com].png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2353%2F03be850e-951d-4c87-af8d-58c007897d85.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7c7b1c0efface20d101a3322857770d4)

![FireShot Capture 010 - Symbreak - [symbreak-50cf4.web.app].png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2353%2F7181ad7c-e9e2-43cd-9f86-5aa9d60d9d0a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=1138671b122a266c226cd8b5720e90e0)


![FireShot Capture 011 - Symbreak - [symbreak-50cf4.web.app].png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2353%2Fec958116-88ac-4329-af04-90d5cd86662c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=63dea51837d804f346cc27f6cd4f0ac6)

![FireShot Capture 007 - Symbreak - [localhost].png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F2353%2F1d7ab93e-7042-4d5a-974e-5d6dac69bed0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=be77db2811aa7a921c920a04e29c931c)
