🀄

オンライン麻雀ゲームにおける牌操作についての現状と潔白を証明する方法を考えてみた

2022/02/24に公開
1

概要

オンラインの麻雀ゲームに常に付きまとうのが「牌操作」の問題です。
これは主に課金システムとの関係で取りだたされる事が多いです。

課金ユーザは麻雀ゲームにとって最も大事なお客様です。
牌操作はその課金ユーザが敗北により気分を損なわないように、課金ユーザに有利になる牌が来るように操作することに主に使用されていると言われています。

どの麻雀ゲームでもSNS上では牌操作があるのではないかといった疑惑が存在しています。

結論を先に書くと・・・

  • じゃんたまのMD5牌山ハッシュ検証システムだけでは牌操作が行われてないと断言できない
    • 現在の仕組みだけでは特定のユーザに有利になるような配牌の操作ができてしまう
  • 配牌の牌操作まで行われていないことを保証するには試合全体の牌山リストのハッシュ化まで必要

じゃんたま(雀魂)が行った施策

「じゃんたま(雀魂)」 では、MD5のハッシュ化により牌操作が無いことを証明する仕組みを実装しました。

これは、牌山をMD5でハッシュ化した上で対局中に表示できるようにすることで、ツモ牌が対局途中に都合の良いように変化させられないことを保証したものです。

画像のように対局中の画面左上をクリックするとMD5のハッシュ値が表示されます。

このハッシュ値は、対局後に牌山コードと突合することが可能です。

牌山コードを以下のコマンドでMD5ハッシュ化すると、対局中画面左上に表示されていたハッシュ値と同じ値が返却されます。

$ md5 -s "3z7s2m9s4s2z6m4p7p1m7m4z4m3m5m4z1m2p7z9p6z3p5s3m7m1s9p4z6p9s9s5p8s8p1m7z2z9m2m2p6s8m4s2p4z7s8p2s3z0m8p7s6z7m9p5z1z9m3p2s1s3z6m3m6s1p1z8p7p9s3s3p6z3s5p2m5s8m8s1p5z6z5m"
538faae23ea68e53cf9f4aa1087cb3eb

これにより対局途中に牌山が操作されていないことが証明されます。

じゃんたまの牌山コードMD5化によって保証されること

  • 牌山が局開始前に固定されているため、対局途中で特定のユーザが有利になるようなツモに牌を変化させられないことが保証される(対局中に牌山を変化させることができない)
    • 例えばリーチ後一発ツモができるようにツモ牌を変化させることは不可能です
  • 対局中に表示されるMD5のハッシュ値から牌山の逆変換ができないことが保証される
    • 現在のテクノロジーではMD5のハッシュ値を逆変換することは事実上不可能です。
      • ※存在しうる全ての牌山の組み合わせのハッシュ値を計算することで、ハッシュ値から牌山コードへの逆変換は可能ではあります。しかし、牌山の組み合わせは4.3×10^185通り(43×1無量大数×1無量大数×1極)も存在しており、その全ての通りのハッシュ値を事前に算出しておくことは現代技術ではどう考えても不可能です
      • 牌山にソルトを加えておくことで、MD5の逆変換を更に困難にすることも可能ですが、ここでは割愛します。

じゃんたまの牌山コードMD5化でも保証されないこと

  • 特定のユーザに有利なツモ牌が来るように牌山を対局前に調整することが可能である
    • たとえば牌山の4個おき(4人麻雀の場合)に良い牌を置いておくことは容易に可能です
      • ただし、鳴き(ポン・チー・カン)によりツモ牌が変化する可能性があるため、確実に特定のユーザに有利になるような山牌にすることは難しいと思われます(鳴き予測まですることで可能となります)
  • 特定のユーザに有利になるような配牌が来るように操作することが可能である
    • こちらについては現在の仕組みでは簡単に実装できてしまい、牌操作が疑われてしまう原因になっていると思われます。

こちらの画像は私が2週間ほど前に小四喜 字一色のダブル役満をアガったときの配牌です

私は無課金ユーザですし、そもそもじゃんたまが牌操作をしているとは思っていませんので偶然にもこのような配牌をもらっただけだと思いますが、現在の仕組みではこのように特定のユーザに有利な配牌を渡すことは容易にできてしまいます。

牌操作を疑われないために麻雀ゲームが行うべき施策

私は麻雀ゲームにも携わっているわけではなく、ただのプレイヤーでしか無いのですが、牌操作が無いことを証明する手段を考えてみます。素人考えなのでこれだけが答えではないことを念頭に置いていただきたいです。

1. 試合(1東風戦、1東南戦)に使用する牌山の一覧を事前に決定しておき、そのハッシュ値を公開する

現在のじゃんたまのシステムでは1局ごとに牌山を自由に決める権利を持っています。ですので特定のユーザに有利の牌を渡すことが容易になってしまいます。
そこで、1試合に使用する牌山100局分を対局開始前に用意しておきます。そしてその100牌山のMD5ハッシュ値をユーザに表示してあげます。
これで事前に牌山が決まるため、特定のユーザに有利な牌を渡すことができなくなります。

しかし、これにはまだ2つ問題があります。

  1. 対局開始直後(東1局0本場)の牌山は操作可能
  2. 「この牌山では誰が上がる」かをある程度事前に予測できるため、ある程度局が進んでも「この配牌を特定のユーザに渡す」という行為が不可能ではない。
  • 例えば、牌山1ではAさん、牌山2ではDさんが上がることが予測できたとすると、牌山3で東家にこの配牌を渡し南家にこの配牌を渡すといったことが不可能ではない。

ということで、もう1段対策が必要になります。

2. ユーザにどの牌山から始めるかを試合開始時に選んでもらう

ここは私が苦し紛れで考えたものですので、改善の余地があると思います。(ぜひアイディアをお待ちしております)

これは、事前に決定した100牌山の中から一つの牌山の数字を選んでもらうことで完全ランダムの牌山から対局を始められるようになります。誰かに有利な牌山にしようとしてもどの牌山から始まるかがわかりませんので操作は不可能となります。

これで牌操作がなく、完全ランダムな麻雀ゲームが楽しめるようになるのかと思います。(改善の余地はアリアリですが)

さいごに

私も麻雀は大好きで毎日のように対局しています。ただ、SNS上では牌操作が〜という話題が頻繁に盛り上がってしまいもったいなさを感じています。
牌操作が無いことを証明することはシステム上可能だと考えられます。ぜひさらなる麻雀ゲームの発展のためにこのアイディアである必要はまったくないのですが、何かしらの対策をしていただけると嬉しい限りです。

Discussion

culageculage
  1. ユーザにどの牌山から始めるかを試合開始時に選んでもらう

これは実際の麻雀と同じく、起家を決めるためにプレイヤー自身にサイコロを振らせればよいと思います。
乱数生成アルゴリズムを公開して、牌山の内容+プレイヤー自身が選択した数値(実際にはサイコロを振るフリック操作の軌道を数値に変換するなどのほうが自然でしょう)をシードとしてサイコロの目を決定すれば、不正(=アルゴリズム通りの出目にならなかった)が無いことを証明できます。

あと一部オンライン麻雀の牌山生成アルゴリズムは単純なシャッフルではないと思うので、もはや「ドラマティックな展開が起きるような牌山を生成しています」と公言してくれたほうがいいと思いますね。