2012/02/24(金)。
グリーの「探検ドリランド」で運営側の意図しない手段でゲーム内のカードを複製することができたためにいろいろ問題が大きくなっています。
流れはこういうことらしい。
・トレード機能で、ある操作を行ってカードを複製できた
↓
・レアなカードを複製してヤフオク等で大儲けする人が出現
↓
・…というのがだいぶ前からあったらしいが、複製方法は知ってる人が知ってる状況だったため、特に大きな問題になっていなかったようである。
↓
・2月に、複製方法がバレてしまう
↓
・みんながやった結果、ヤフオクに大量にレアカードが出品される事態に。
↓
・グリー『「探検ドリランド」のトレード機能を一時停止する!』
↓
・グリー『修正したので再開!』
↓
・グリー『貴様ら、許さんぞ!』
↓
・グリー『複製したカード全没収するからな!アカウント停止もする!!』
↓
・没収&アカウント停止発生
↓
・綺麗さっぱり没収された人から、全然没収されない人まで様々。
・アカウント停止も1週間の人や1か月の人などバラバラ。
↓
2/24時点でこんな感じらしい
・グリー、不具合と違反行為で「探検ドリランド」のトレード機能を一時停止 -INTERNET Watch
・グリー、「探検ドリランド」の複製カード回収--アカウント停止も - CNET Japan
・日々是遊戯:グリー、「探検ドリランド」バグについて「業績に与える影響は軽微」と正式にコメント発表 - ねとらぼ
トレード機能ってざっくり書くと、こういう処理をやっているのだと思うのだけれど……
1.相手のデータからトレードカードの情報を取得
2.自分のデータにカードを追加
3.相手のデータからトレードカードの情報を削除
トレード機能を使ってカードを増やすという事象が発生したのであれば、
(1) 排他処理を実施してなくて、
(2) エラー処理に伴うロールバックを行っていない
というのが考えられますな。
(1)の排他制御は同時に処理が行われないようにするための制御方法です。
排他制御がされていないとどうなるかというと、
例えば、あるカードをトレードする際に、同時に2回処理(処理A、処理B)を行ったとしましょう。
処理Aは1.の処理を行って、あるカードがトレード対象であるという情報を取得します。
処理Bも1.の処理を行って、あるカードがトレード対象であるという情報を取得します。
なぜなら、処理Aはまだ3.の処理を行っていないために、トレード情報を削除していないからです。
次に2.の処理を、処理Aと処理Bはそれぞれ行い、自分のカード情報に、処理Aから1枚、処理Bから1枚合計2枚の情報が追加されます。
最後に3.の処理を、処理Aと処理Bが実施します。
処理Aと処理Bのどちらが先に実施するかはわかりませんが、どちらかがデータを削除して、もう片方は削除しようとして失敗するはずなのですが。普通ならここでエラー処理を行って、追加したカードを削除するということをするのでしょうが、それが無いってことはそういうことなのでしょう。(3)はそういうことです。
排他処理をしていれば、同時に処理が行われても、1.の時点で後の処理が待たされます。排他処理をしてなくても、エラー処理さえきちんとしていれば、複数手に入ることはないはず。
データベースは、データの正当性をどう担保するかでいろいろな仕組みがありますが、そういった仕組みを使ってガチガチにすればするほど使い勝手とパフォーマンスが悪くなります。なので、どういうデータなのか、どういう処理を行うのかを精査した上で、どこまでなら無茶できるかを検討します。
上に書いた(1)(2)はあくまでも予想でしかありませんが、テストすればすぐわかることなので、テストをしなかったか、あるいはテストして問題は認識していたがそれをいったんは良しとしたということでしょう。この手の携帯電話向けのゲームは、リリースして遊んでもらうことを最優先にしているため、致命的なもの以外、許容される範囲の不具合は修正を後回しにしてリリースしてしまう、と以前聞いたことがあります。
さて、今回の件、根っこが深そうというか、「これ、ドリランドだけなのかな?」とか思ってしまうんですよね。
携帯電話向けのWEBベースのゲームがどのように作られているかは知りませんが、おそらくはベースとなるフレームワークがあって、それをカスタマイズしてるのではないかと予想してます。とすると、データベースの処理だの通信部分だのというのはフレームワークとして用意されているものを使うわけだから、同じようなフレームワークを他のゲームでも使って開発されているのであれば、今回の探検ドリランドで発生した問題は、他のゲームにも同様なのではないか、と。
少なくともヤマトはゲフン、ゲフン……