これは普通に一回のガチャにかかる時間を長くしたのとかわりなかったです! もっとよい方法を考えてみたいと思います。
新しい手法を開発しました。
僕が(ほとんどを考えた)公平なガチャシステム
はじめに
最近のソーシャルゲームは、インストールしたボーナスとして有料のガチャを限定で引くことができる機能を実装していることが多いが、これを逆手にとって、自分の欲しいカードなどが出るまでアプリケーションをインストールしてはアンインストールし、再びインストールするという、いわゆる「リセットマラソン(リセマラ)」が横行している。これを防ぐ方法として、チュートリアルを異常に長くするとか、一般のユーザーにとっての快いプレイを妨げるような対策が取られることもあるらしい。この文章では、この問題を解決する(たぶん)新しい方法について述べる。
プロトコル
次のような方法で、ユーザーは初回のガチャなど無料のガチャを実行する。この計算量を利用したアクセスのコントロールはどこかのCTFで出題されたと友人から聞いて、それを使っている。
- ユーザーがガチャを引こうとすると、アプリケーションがサーバーへそのことを通知する
- サーバーは、無作為な文字列Aと$n$バイトのデータBと現在時刻$T_1$をデータベースへ書き込み、AとBをアプリケーションへ送信する
- アプリケーションはAに任意の文字列を追加して、文字列Cを生成する
- アプリケーションは文字列Cのハッシュ値を計算し、末尾の$n$バイトがBと一致するか判定する
- 一致しなかった場合は(3)からやり直す
- アプリケーションはAとBとCをサーバーへ送信する
- サーバーは次のことを検証する
- サーバー側のデータベースにAとBが記録されているか
- 文字列Cの中にAが含まれているか
- 文字列Cのハッシュ値を計算すると、末尾の$n$バイトがBと一致するか
- サーバーは次の値を計算する
- 現在時刻$T_2$を取得する
- (1)から(6)までに掛った時間を計算する($T = T_2 - T_1$)
- あらかじめサーバー側に保存してある、他のユーザー達が(1)から(6)までにかかった平均時間$A$を取得する
- $k = floor(T \div A)$
- サーバーに保存してある平均時間$A$を$T$を使って更新
- ユーザーは$k$回ガチャを引くことができる
このように、掛った時間を使うことで、高性能なコンピューターやハッシュ値を計算する専用のハードウェアによる攻撃を回避している。
FAQ
ハッシュ値のかわりにビットコインを使ったらどうか
運営は儲かりそうだが、バレたら叩かれるかもしれない。
はじめから、ガチャを引くのにかかる時間を長くする処理をサーバーに実装すればいいのではないか
まったくその通りでした。でも、この計算量を利用したプロトコルは何かの役には立つんじゃないかと思っています。
質問など
1時間くらいで考えたやつなので、容易に問題がみつかると思う。何か弱点をみつけた場合は、気軽にコメントで指摘して欲しい。