証明可能な公平性(Provably Fair)をわかりやすく解説
dond.win が Deal or No Deal のどのラウンドにも不正がないことを証明する仕組み。ケースを選ぶ前に公開される SHA-256 コミットメント、シャッフルに混ぜられるあなたのクライアントシード、終了後に公開される両方のシード、そして 25 個すべてのケースを再計算する検証ページ。
証明可能な公平性が解決する問題
ふつうのオンラインゲームでは、運営が正しくシャッフルし、あなたが選んだあとに高額賞金を動かしていないと信じるしかありません。証明可能な公平性(Provably Fair)は、その信頼を計算に置き換えます。運営はあなたが行動する前にシャッフルの結果をコミットし、あなた自身の入力をシャッフルに反映させ、終了後にすべてを公開して確認できるようにします。
1 ラウンドの流れ
- コミットメント。 あなたがケースを選ぶ前に、サーバーは秘密のサーバーシードを生成し、その SHA-256 ハッシュを公開します。このハッシュはゲーム内でコミットメントとして表示されます。あとからシードを差し替えるとハッシュが変わるため、サーバーは変更できません。
- あなたの入力。 あなたにはクライアントシードがあります。初期値はランダムですが、ラウンド開始前に賭け金パネルで自分の値を入力することもできます。サーバーはそれを予測できません。
- シャッフル。 25 個の賞金ラダーを Fisher-Yates でシャッフルします。乱数のバイト列は、サーバーシードを鍵、クライアントシードをメッセージとする HMAC-SHA256 で生成されます。どちらか一方だけで配置を決めることはできません。
- 公開。 ラウンドが終わると、コミットメントとクライアントシードの横にサーバーシードが公開されます。
- 検証。 サーバーシードをハッシュ化してコミットメントと照合します。次に両方のシードでシャッフルをやり直し、すべてのケースを実際に見た内容と照合します。検証ページはこの両方をブラウザ内で行い、データはどこにも送信されません。
正確なアルゴリズム
- commitment = SHA-256(utf8(serverSeed))、16 進表記。
- block[i] = HMAC-SHA256(key = serverSeed, msg = clientSeed + “:” + i)、i = 0, 1, 2 …
- 各 block からビッグエンディアンの 32 ビット整数を 8 個取り出します。r = 値 / 2^32。block を使い切ったら次の block を使います。
- 固定のラダーに対する Fisher-Yates:i を 24 から 1 まで減らしながら j = floor(r × (i + 1)) を求め、ladder[i] と ladder[j] を入れ替えます。ケース k には ladder[k] が入ります。
どのプログラミング言語でも数行で実装でき、同じ配置が得られます。
証明できること、できないこと
配置があなたの選択より前に確定していたこと、そしてサーバーだけで決めたものではないことが証明されます。あなたが見たすべてのオファーが実際のボードから計算されていたことも証明されます。一方、確率が変わるわけではありません。ラダーと手数料は決まったとおりで、それらも公開されています。ここでいう公平とは、画面に表示されているゲームが、実際に行われているゲームそのものだということです。
過去のラウンドを確認する
シードとコミットメントは、ラウンド終了画面と履歴に表示されます。いつでも検証ページに貼り付けて確認できます。
よくある質問
dond.win の Deal or No Deal はイカサマではありませんか?
すべてのラウンドの配置は、あなたがケースを選ぶ前に SHA-256 ハッシュでコミットされ、あなた自身のクライアントシードと混ぜられ、ラウンド終了時に公開されます。検証ページで 25 個すべてのケースを自分で再計算できます。不正に操作された配置はこの照合を通りません。
クライアントシードとは何ですか?変更したほうがいいですか?
シャッフルに対するあなた側の入力です。初期値はランダムで、それだけでサーバーが配置を自由に決めることを防げます。自分の値を設定すれば、自分だけが選んだ値でそのラウンドを再現できます。
サーバーが運営に有利なシードを選ぶことはできますか?
コミットする時点では最終的な配置がわかりません。あなたのクライアントシードがあとから混ぜられるからです。あとでシードを差し替えることもできません。ハッシュが一致しなくなるためです。
ラウンドの検証に特別なソフトは必要ですか?
いいえ。検証ページは SHA-256 と HMAC-SHA256 をブラウザ内で実行します。この 2 つの関数を備えたプログラミング言語なら、どれを使っても自分で確認できます。