15
9

More than 1 year has passed since last update.

はじめに

Ethereum のゲーム dApps を眺めていると、トークンの売り方として「セール形式」が多い印象です。

セール形式とは、運営さんが事前に発行しておいたトークン(キャラやカード)を販売する形式で、「超強いキャラは値段を高く」、「そこそこの強さであれば安く」といった売り方です。
cut01
一方で、スマホアプリでよくあるのが「ガチャ形式」です。

ガチャ形式とは、プレイヤーがガチャを引くたびにトークンが発行される形式で、トークンには内容に応じた確率が設定されます。
1回の値段は抑えめにしておき、「超強いキャラは低確率で排出」、「そこそこの強さであれば高確率で排出」といった売り方です。
cut02
ゲーム性がスマホアプリとよく似ている dApps は結構目にしますが、ガチャ形式が採用されているケースはほとんど見られません。

一体、なぜでしょうか?
色々な理由があると思うのですが、私なりの考えは下記となります。

①コントラクトで確率(乱数)を使えない
②コントラクトのバイナリが公開されるのでガチャの仕組みが解析される
③トランザクションに再現性がある(大当たりのトランザクションが再利用される)
④トークンの発行をプレイヤーに委ねるのが怖い(発行処理が直接叩かれのは不安)
⑤業界の自主規制(ブロックチェーンコンテンツ協会ガイドラインの存在)

他にも理由はあると思いますが、dApps とガチャの相性はあまり良くないと思われます。

でも、それでも、ブロックチェーンでガチャを引きたいじゃないですか…。
そんな思いにかられて、検証用のサンプル dApps を作ったので、ご覧くださいませ。

CharaMixDemo

ご紹介するサンプル dApps は「CharaMixDemo」といいます。
名前の通り、キャラ(トークン)を生成して合成する内容です。
about
オープンベータ形式で配信しておりますので、お使いのスマホに合わせて下記のリンクからインストールしていただけます。

*Android端末をお使いの方はこちら*
googleplay_icon
*iOS端末をお使いの方はこちら*
testflight_icon

ご注意

このサンプルでは、どこかで見たようなキャラ「39さん」が登場しますが、非営利の検証用に作成したものであり、製品版としてリリースするつもりはありません。ですので、「初音ミクの二次創作ガイドライン」に抵触するものではございません。
※接続するブロックチェーンも Ethereum のテストネット Rinkeby となります

後の説明のわかりやすさ & 作る本人のモチベーションのためにも、「初音ミク」オマージュのキャラを使わせていただいていおります。
ご理解くださいますようお願いいたします。

dAppsの構成と課題への対応

サンプル dApps のクライアントは、iOS / Android アプリとなります。
プレイヤーはアプリ経由で、コイン(ERC20 トークン)を消費してガチャを引き、キャラ(ERC721 トークン)を取得できます。

クライアント上でガチャが引かれるとトランザクションが発行され、ブロックチェーン側の窓口である MAIN コントラクトにより処理されます。
MAIN コントラクトはコイン(CMC)とキャラ(CMA)トークンを管理するコントラクトへアクセスし、トークンを実際に発行/焼却します。
cut03
では、この構成をもとに、課題への対応を見ていきましょう。

*課題①:コントラクトで確率(乱数)を使えない*
乱数(厳密には乱数のシード)はアプリ側で生成することにしました。
この乱数をパラメータに含めてトラザクションを発行するのですが、この時、トランザクションのパラメータを暗号化しておきます。
コントラクト側では受け取ったパラメータを複合化してシードを取り出し、乱数生成に利用します。
cut04
*課題②:コントラクトのバイナリが公開されるのでガチャの仕組みが解析される*
ガチャの結果を決定付ける乱数の暗号化さえ見破られなければ、それ以外の処理が解析されても問題ないと割り切ることにしました。
ガチャのロジックを解析するプレイヤーが出てきたとしても、それはそれでゲームを攻略する楽しみの一環だと思います。

*課題③:トランザクションに再現性がある(大当たりのトランザクションが再利用される)*
コントラクト側で、前回ガチャが引かれた時間(ブロック番号)を保持するようにしました。
アプリ側ではガチャのトランザクションを発行する際、その時点でのブロック番号をパラメータとしてトランザクションへ含めます。
ガチャ処理が呼ばれた MAIN コントラクトでは、パラメータ内のブロック番号と自身の保持するブロック番号を比較し、古いトランザクションであれば弾きます。

また、トランザクションパラメータの暗号化の際には、プレイヤーの Ethereum アドレスも反映させるようにしたため、他者のトランザクションの流用もできなくなっています。
cut05
*課題④:トークンの発行をプレイヤーに委ねるのが怖い(発行処理が直接叩かれのは不安)*
アプリの窓口となる MAIN コントラクトがアクセスされた際、真っ先にトランザクションパラメータの複合を試して、失敗した場合は処理を中断するようにしました。
パラメータの複合に成功した場合にのみ、MAIN コントラクトはトークンコントラクトの発行/焼却処理を呼び出します。
これにより、MAIN コントラクトがアプリを経由せずに直接叩かれても、トークンを発行してしまうことはありません。
cut06_1
また、トークンコントラクトの発行/焼却処理は、MAIN コントラクトからのみ呼び出せるようにしました。
直接トークンコントラクトへアクセスして、トークンの発行/焼却処理を呼び出すようなトランザクションは中断されます。
cut06_2
一方で、CMC / CMA トークンコントラクトはそれぞれ、ERC20 / ERC721 に準拠しているため、MetaMaskOpenSea といった外部ツールやマーケットにおけるトレードが可能です。

*課題⑤:業界の自主規制(ブロックチェーンコンテンツ協会ガイドラインの存在)*
以下、ネットニュースへのリンクです。
「有償ガチャ」など一部規制、ブロックチェーンコンテンツ事業「自主ガイドライン」──博報堂など参加

ある意味で、「有償ガチャに対する風当たり」が一番の課題かもしれません。

このサンプルでは、『お金を払った後に結果が出る』という一般的なガチャの流れを、『何が出るかを確認した上でお金を払う』という風に工夫しています。
具体的には、事前にガチャ結果をプレイヤー提示し、その内容に納得がいく場合に課金(コインの焼却)をしてもらう流れとなっています。
※イメージとしてはWizardryのキャラメイクで、望むキャラクタが作成できるまではお金を払わなくてもよいという感じです

以上で、実装と課題に関する説明は終わりです。

ガチャの内容

では、ガチャ内容を詳しく見ていきましょう。
このサンプルには「女の子の生成」と「女の子の合成」の2つのガチャがあります。

*生成ガチャ*
ss01_qiita
候補となる基本素体の女の子から個性(パーツ)をバラバラに抽出して新しい女の子を生成するガチャです。
この時、アプリ上でガチャの引き直し(乱数の更新)が好きなだけ行えます。
気に入ったキャラが生成されたらトランザクションを発行し、新たなトークンとして取得できます。

*合成ガチャ*
ss02_qiita
2人の女の子を合体させて個性(パーツ)をシャッフルし、性能を向上させるガチャです。
この時、アプリ上でガチャの引き直し(乱数の更新)が好きなだけ行えます。
気に入ったキャラが合成されたらトランザクションを発行し、新たなトークンとして取得できます。
合成トークン取得時には、素材となった女の子(トークン)は焼却されます。

また、合成により取得される女の子は「バージョン」の値が1つあがります。
ss03_qiita
このバージョンとは、スマホアプリのガチャにおける「レアリティ」に相当する判断基準で、バージョンが高いほど、その女の子の取得までに支払われたコストが多いことを意味します。
※バージョンの初期値は0で、同じバージョンの女の子同士でのみ合成が可能です
※バージョンNの女の子は「バージョン0のトークンを2のN乗個」消費して出来上がっていると判断できます

例えば、「バージョン」の女の子であれば、「8回バージョンアップした」=「バージョン0のトークンを256個消費した」ということが一目で分かります。
このキャラすげぇ!」とうい風にありがたがってもらうための値がバージョンとなります。

ガチャを回そう!

では、実際にガチャを回していきましょう。

まずは、生成ガチャから。
引くのは断然「39さんPickUp」です。
ピックアップされている39さんの抽出率は「25%」となります。
gacha01
…はて、「抽出率」などという見慣れない単語がでてきましたが、これはなんでしょうか?

この生成ガチャでは、「目なら目」、「口なら口」といった具合に、基本素体からパーツを選出して新しい女の子を生成します。
このパーツの選出がどのぐらいの確率で行われるかが抽出率となります。
ですので、「39さんPickUp」ガチャでは25%の確率で、39さんのパーツが選出されることを意味しています。

ところが、困ったことにトークンを構成するパーツは数十個も存在します。
成分100%の39さんを生成ガチャで引こうと思ったら、非現実的な確率(25%の数十乗)となってしまいます。
そこで、このサンプルで想定する遊びは「生成ガチャでそこそこの成分のキャラをたくさん取得」し、「合成ガチャで少しずつ純度を高めていく」というものになります。

生成ガチャで素材厳選

生成ガチャをぶん回して、素材キャラを集めていきましょう。
まずは、39さん成分40%オーバーが出るまで乱数を引き直して、キャラを8体GETしました。
gacha02
50%オーバーが4体。なかなかの引きでした。

合成ガチャで成分抽出

続いて、合成ガチャで39さん成分を抽出していきましょう。
gacha03_1
合成ガチャでは素材となる二人の女の子から、半々(50%)の確率でがパーツが選出されます。
ここでは、選択した2体のキャラの「39さん成分の平均」に対して、「+10%」ぐらいの値を目標に合成ガチャを回していくことにします。

まずは、「バージョン」の8体から1ペアずつ厳選し、「バージョン」の女の子を4体合成しました。
gacha03
続いて、「バージョン」の4体から、「バージョン」を2体厳選。
gacha04
最後に、「バージョン」のキャラを厳選してひと段落です。
これで、8体いた「バージョン」のトークンが、1体に圧縮されました。
gacha5
最終的な成分は「83%」。
ちょっとチンチクリンな見た目ですが、かなりの39さん成分を抽出できました。

目指せ39さん100%

この調子で成分100%を目指しましょう。
生成ガチャと合成ガチャをジャブジャブ回して、「バージョン」のキャラを追加で3体作成しました。
gacha06
続いて、「バージョン」のキャラから「バージョン」のキャラを厳選し…
gacha07
ついに、成分100%の39さんが完成しました!
gacha08
お〜、かなり39さんです!
ここまでに積み上げた「バージョン」のトークン数は「2の5乗=32個」で、これがこのトークンの資産的な価値ということになります。

パラメータはフレーバー程度のものですが、戦闘力「522」、個体値「80.4%」となりました(すごく強い!多分!)。
これらがこのトークンのゲーム的な価値となり、性能が高いと判断されればプレイヤー間での需要が高まるはずです。

OpenSeaへ出品

さて、実際にトークンを作り出したのであれば、マーケット上での価値も気になるところです。
サンプルアプリから「METAデータの更新」をすることで、トークンの METAデータをサーバーへアップロードして OpenSea の表示に反映させることができます。

試しに何体か出品してみましょう。
opensea02
自身の手で生み出したトークンがマーケットで売れてくれたりしたら、感慨もひとしおというものです。
※このサンプルの接続先は Rinkeby なのでリアルマネーは得られませんが…

最後に

トークンの売買が手軽に行えるのが Ethereum の面白味の1つですが、「ここにガチャ要素を入れたら楽しいにきまっている!」との思いで作ったのが今回のサンプル dApps です。

一般的なスマホアプリの「大当たりがでるまで引き続けるガチャ」とは少し毛色が違った、「小当たりを積み重ねていくガチャ」の面白みを感じていただけたのなら幸いです。

興味のある方は、是非サンプルで遊んでみてくださいませ。
ご意見ご感想などございましたら、お教えくださると嬉しいです。

では、ここまでご覧いただきありがとうございました。

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9