自由研究

オンライン麻雀ゲームの牌山イカサマの検証について

投稿日:

今日、雀魂のアップデートがあり、牌山の検証システムに使われるハッシュ値がMD5からSHA-256にアップデートされました。
で、牌山検証とはなんぞや、というと、オンライン麻雀はシステムがイカサマをしているんじゃないかという懸念を払拭するために提供されている仕組みのことなのです。

さて雀魂に搭載されている検証システムはどういうものか、というとですね。

  1. 対局開始時にシステムが牌山を決定し、牌山を文字化した「牌山コード」とその牌山コードの「ハッシュ値」が生成される。
  2. 対局中、プレイヤーは「ハッシュ値」を確認できる。
  3. 対局終了後、プレイヤーは「牌山コード」を見ることができ、「牌山コード」と「ハッシュ値」の一致を検証できる。

という仕組みです。
これによって、たとえば「誰かがリーチしたら、牌山の中が入れ替わって俺のツモに当たり牌が来るんだよ!」という、コンピューター麻雀あるある(大昔のゲームにはマジでこういうものがあったらしいです)のイカサマが行われていないことが分かる、というわけです。
つまり、「雀魂は牌山の中が入れ替わって変なツモを掴まされることは無い」んです。

やりましたね。これで全てのイカサマは封じられました。
……そうでしょうか?

  • リアル麻雀よりも高い確率で天和がアガれるようになっているのでは?
  • 配牌で国士手が来たら、么九牌をツモりやすいような牌山になっているのでは?
  • 特定のプレイヤーを優遇/冷遇した配牌になるように調整されているのでは?
  • 終盤のラス目には一発逆転手が来やすいようになっているのでは?

など、牌山の時点で積み込みを行うイカサマは防げていないのです。

一応立場を表明しておきますが、私は雀魂がイカサマを行っていると考えているわけではなく、「雀魂はイカサマをしていない(はずな)のに、それがきちんと証明できていない」ということを怒っているのです。

さて、ではどうすれば良いか。
牌山に積み込み的なイカサマが無いことを証明するには、牌山の生成方法を公開するしかないでしょう。
しかも、単にランダムな生成アルゴリズムですよと言い張るだけでは、「都合の悪い牌山を捨てる」というイカサマが有り得てしまいます。
雑に言えば「雀魂が牌山のリセマラをするかもしれない」ってことです。
というわけで、牌山生成にユーザーが介入して、雀魂に牌山リセマラをさせないようユーザーの手で制御しなければいけません。

一方で、「牌山生成をユーザーが操作したら、それは牌山丸見えと同じだろ」と思われるでしょう。
もちろん普通に公開すれば丸見えになります。
なので、「生成アルゴリズムは公開するし、イカサマがないことを保証できるようにするが、牌山丸見えにはならない」ようにする必要があります。
話がちょっと学術の範囲に踏みこんでますが、実際のところそんなに難しくはありません。

  1. 牌山生成アルゴリズムは公開しておく。
  2. 対局前に、プレイヤーがそれぞれランダムな数字(P1~P4)を作成する。
  3. 対局開始時に、システムはプレイヤーから得た数字を組み合わせた数字(たとえばP1⊕P2⊕P3⊕P4)を作り、その乱数を元に牌山を生成する。
  4. 対局中は自分の作成した数字以外は見られない。これで牌山丸見えを防ぐ。
  5. 対局終了後、全プレイヤーの作成した数字(P1~P4)を見ることができ、「P1~P4」と「牌山生成アルゴリズム」から、不正なく牌山が生成されたことを検証できる。

などとすれば良いはずです。
ちなみに牌山の全パターンは2の600乗以上あるらしい(参考:麻雀の数学)ので、各プレイヤーはそれを超える範囲の乱数、たとえば1024bitの乱数を持ち寄るべきですね。
あと、この方法を使うとプレイヤーの手で「牌山の乱数調整」が可能になってしまいますが、この対応は例えば「P1~P4に加えて5分ごとに切り替わる乱数値P5も用いて後で公開する」などで対応できるかと思います。

と、いうわけで、「どうせ検証可能にするならここまでやってくれよ」という話でした。おしまい。

-自由研究

執筆者:

関連記事

【自由研究】宝くじの中央値っていくらなの?

もくじ1 前置き2 中央値ってなんだ3 実際に出してみる3.1 シミュレーション設定3.2 宝くじを1枚だけ買ったとき3.3 10枚買ったとき3.4 100枚買ったとき3.5 1000枚買ったとき3. …

no image

FIDOについてなるべく平易にまとめてみる

この記事は情報系の学生ぐらいの知識を想定しています。なるべく平易に書きますが、わからないことがあったら自分で調べながら読んでください。 もくじ1 話の枕2 強固な認証の必要性3 3つのFIDO4 FI …

no image

VTuberのネットワークグラフを作ったぞ2024

今回、実に4年ぶりにVTuberのネットワークグラフを作りました。 前回の記事はこれ。 もくじ1 グラフ1.1 [追記分]2 作り方2.1 VTuberの一覧を作れない2.2 チャンネルの表記が増えた …

ツイートを狙ってバズらせるテクニック

みなさんTwitterやってますか? 自分のツイートがバズったことありますか? 私はある。 ドヤ。 ドヤはともかくとして、人にはバズらないといけない時があって、そういうときのためのテクニックを紹介しま …

no image

MagicaVoxelでUnity用の人間モデルを作ろう(東北ずん子配布もあるよ)

もくじ1 概要1.1 目標1.2 手順1.3 作成モデル2 MagicaVoxel2.1 パーツ分割2.2 出力3 Blender3.1 インポート3.2 モデルの初期調整3.2.1 重複する頂点の削 …