このページ
スロットマシン(暗号化)
このページ
概要
このページでは、暗号化された公正なゲームプロセスに基づく特定のスロットマシンの仕組みについて説明します。結局のところ、すべてのスロットマシンの結果は乱数の抽選に基づいています。暗号化されたゲームの場合、乱数はランダムな文字列に基づいています。
公正なカジノ
ボーナスコード
分析
Crypto.Gamesでプレイするスロットマシンは、非常にシンプルです。5リール1ラインのゲームです。プレイヤーは10クレジットをベットする必要があります。10クレジットの価値はプレイヤー次第です。各リールには、リンゴ、バナナ、チェリー、ブドウ、イチゴ、オレンジ、ビットコイン、桃の8種類のシンボルが描かれています。各リールの結果は、他のリールとは独立しています。
以下はCrypto.Gamesスロットマシンのペイテーブルです。シンボルの位置は関係ありません。例えば、プレイヤーがビットコインシンボルを2つ揃えた場合、ペイライン上の位置に関係なく配当が支払われます。すべての配当は「1対1」です。同じフルーツが4つ揃い、ビットコインが1つ揃った場合、ゲームのヘルプファイルにはこの状況に関する説明がありませんが、おそらく4つ揃いのうち高い方の配当のみが支払われると思われます。
ペイテーブル
イベント | 支払う |
---|---|
5ビットコイン | 10000 |
5枚の同じもの | 1500 |
4ビットコイン | 700 |
フォー・オブ・ア・カインド | 100 |
3ビットコイン | 70 |
2ビットコイン | 25 |
1ビットコイン | 11 |
ゲーム分析
Crypto.Gamesのスロットマシンの本来の動作は、各シンボルに均等な重み、つまり確率が与えられるはずだったと思います。もしこれが真実だとしたら、以下の表は私の分析結果を示しています。リターンの列は(勝利)*(確率)/10です。10で割るのは、プレイヤーが10クレジットを賭ける必要があるためです。右下のセルはリターンが98.03%であることを示しています。
リターンテーブル - 均等重み付け
イベント | 支払う | 組み合わせ | 確率 | 戻る |
---|---|---|---|---|
5ビットコイン | 10,000 | 1 | 0.000031 | 0.030518 |
5枚の同じもの | 1,500 | 7 | 0.000214 | 0.032043 |
4ビットコイン | 700 | 35 | 0.001068 | 0.074768 |
フォー・オブ・ア・カインド | 100 | 245 | 0.007477 | 0.074768 |
3ビットコイン | 70 | 490 | 0.014954 | 0.104675 |
2ビットコイン | 25 | 3,430 | 0.104675 | 0.261688 |
1ビットコイン | 11 | 11,970 | 0.365295 | 0.401825 |
敗者 | - | 16,590 | 0.506287 | 0.000000 |
合計 | 32,768 | 1.000000 | 0.980286 |
しかし、フェアゲーミングの仕組み上、一部のシンボルは他のシンボルよりも重み付けが高くなります。具体的には、リンゴ、バナナ、チェリー、ブドウ、イチゴはそれぞれ重みが26ですが、オレンジ、ビットコイン、桃は重みが25です。リールが特定のシンボルで停止する確率は、その重みに比例します。ゲームのリターンの大部分はビットコインシンボルから得られます。ビットコインの重み付けは25で、全体の平均は25.625なので、リールがビットコインで停止する確率は8分の1弱です。これは、次の表に示すように、ゲームのリターンを低下させます。右下のセルは、リターンが95.06%であることを示しています。
リターンテーブル - 不均等な重み付け
イベント | 支払う | 組み合わせ | 確率 | 戻る |
---|---|---|---|---|
5ビットコイン | 10,000 | 9,765,625 | 0.000027 | 0.026973 |
5枚の同じもの | 1,500 | 78,938,130 | 0.000218 | 0.032705 |
4ビットコイン | 700 | 3億5156万2500 | 0.000971 | 0.067972 |
フォー・オブ・ア・カインド | 100 | 2,748,092,600 | 0.007590 | 0.075904 |
3ビットコイン | 70 | 5,062,500,000 | 0.013983 | 0.097880 |
2ビットコイン | 25 | 36,450,000,000 | 0.100677 | 0.251691 |
1ビットコイン | 11 | 130,836,733,750 | 0.361377 | 0.397515 |
敗者 | - | 186,513,035,520 | 0.515157 | 0.000000 |
合計 | 362,050,628,125 | 1.000000 | 0.950639 |
公正なゲーム
Crypto.Gamesが各リールの停止位置を決定するために使用するプロセスを以下に示します。これは、読者がハッシュと16進法の基礎を理解していることを前提としています。そうでない場合は、サイコロ(暗号化版)のページで詳しく説明しています。
- サーバー シードとクライアント シードを結合します。最初にサーバー シードを結合します。
- ステップ 1 の SHA-512 ハッシュを取得します。
- 左側から始めて、ステップ 2 のハッシュから 2 つの文字を取得します。
- 手順 3 の 2 つの文字を 16 進数から 10 進数に変換します。
- ステップ 4 の結果の末尾の桁を取得します。
- ステップ 5 の結果が 1 ~ 8 の場合、次のようにシンボルにマッピングします。
- 1 = リンゴ
- 2 = バナナ
- 3 = チェリー
- 4 = ブドウ
- 5 = イチゴ
- 6 = オレンジ
- 7 = ビットコイン
- 8 = ピーチ
- ステップ 6 が 1 ~ 8 の範囲にあった場合は、左から順にそのシンボルをリールに割り当てます。
- シンボルが見つかったかどうかに関係なく、ハッシュ内で 2 つの位置を進め、1 ~ 8 の範囲で 5 つの数字 (各リールに 1 つずつ) が見つかるまで手順 3 に戻ります。
例
以下は、例の手に対するプロセスの動作方法です。
上の画像はProvably Fairパネルのものですが、ここでは独自のクライアントシードを選択しました。次に、サーバーシードとクライアントシードのハッシュをコピーして別の場所に貼り付けます。「Next server seed SHA256」というラベルが付いています。この場合、以下のようになります。
クライアントシード: sdf96dsf9876s9dd78f6 次のサーバーシードハッシュ: bdfa300164ebbd77ce9a3c3c58863688c4537df91173088915afdd4c9b6b302c
賭けて遊んでみました。結果は、左から順に、チェリー、アップル、バナナ、ストロベリー、バナナで、バナナは負けました。
クライアントシードを選択したら、結果が確実に確定していることを確認するために、Provably Fairパネルに戻ります。手順は以下のとおりです。
- まず、最後のサーバー シードについて言及します。これは次のとおりです。
ylVWazQHJoxoG9TAcLmDj1n6q1UkJgyFW4oTJhUhL
これをSHA-256ハッシュプログラムにかけました。シードのハッシュは次のとおりです。
bdfa300164ebbd77ce9a3c3c58863688c4537df91173088915afdd4c9b6b302c
これは、賭けをする前に与えられた次のサーバー シード ハッシュと一致するため、クライアント シードを選択した後、賭けをする前に結果が運命づけられていたと確信できます。
しかし、私が知りたいのは、なぜ結果がチェリー・アップル・バナナ・ストロベリー・バナナになったのかということです。確認方法は次のとおりです。
- サーバー シードとクライアント シードをこの順序で組み合わせて、ylVWazQHJxoG9TAcLmDj1n6q1UkJgyFW4oTJhUhLsdf96dsf9876s9dd78f6 を取得します。
- 手順 1 のSHA-512 ハッシュを取得すると、3F8CEF835C55B60C8682C580C1A0C6DCA5013F4614A82A6797273495CCE46418EA044CCD964B83D0765C9CE6A174F93E20DB56E118CF8AE82B2D0864FC09B066 が取得されます。
- 最初の 2 文字 3F を 16 進数から 10 進数に変換します。3*16 + 15 = 48 + 15 = 63。
- 63の最後の桁である3を取ります。これは1から8の範囲にあるため、上記の「公正なゲーム」の指示に従ってシンボルにマッピングします。この場合、3はチェリーにマッピングされます。
- 手順 2 のハッシュで 2 つのシンボル (8C) を進めます。
- 8C を 16 進数から 10 進数に変換します: 8*16 + 12 = 140。
- 140 の最後の桁は 0 であり、これは何にもマッピングされないため、8C はスキップします。
- 手順 2 のハッシュで 2 つのシンボル (EF) を進めます。
- EF を 16 進数から 10 進数に変換します: 14*16 + 15 = 239。
- 239 の最後の数字は 9 ですが、これは何にもマッピングされないため、EF はスキップします。
- 手順 2 のハッシュで 2 つのシンボル (83) を進めます。
- EF を 16 進数から 10 進数に変換します: 8*16 + 3 = 131。
- 131の最後の桁である1を取ります。1は1から8までの範囲にあるため、上記の「公正なゲーム」の指示に従ってシンボルにマッピングします。この場合、1はリンゴにマッピングされます。
- 手順 2 のハッシュで 2 つのシンボル (5C) を進めます。
- 5C を 16 進数から 10 進数に変換します: 5*16 + 12 = 92。
- 92の最後の桁である2を取ります。2は1から8までの範囲にあるため、上記の「公正なゲーム」の指示に従ってシンボルにマッピングします。この場合、2はバナナにマッピングされます。
- 手順 2 のハッシュで 2 つのシンボル (55) を進めます。
- 55 を 16 進数から 10 進数に変換します: 5*16 + 5 = 85。
- 85の最後の桁である5を取ります。5は1から8までの範囲にあるため、上記の「公正なゲーム」の指示に従ってシンボルにマッピングします。この場合、5はイチゴにマッピングされます。
- 手順 2 のハッシュで 2 つのシンボル (B6) を進めます。
- B6 を 16 進数から 10 進数に変換します: 11*16 + 6 = 182。
- 182の最後の桁である2を取ります。2は1から8までの範囲にあるため、上記の「公正なゲーム」の指示に従ってシンボルにマッピングします。この場合、2はバナナにマッピングされます。
- 5 つのシンボルが見つかったため、チェリー、リンゴ、バナナ、イチゴ、バナナが賭けの結果として中央のペイライン上のプレイヤーに表示されます。
公正なゲーム規約
これだけの手順を踏むのは大変そうに思えるなら、私も同感です。そこで、皆さんに代わってPHPプログラムを作成しました。リンクをクリックして、以下の手順に従ってください。
- 4 行目にサーバー シードを入力します。
- 5 行目にクライアント シードを入力します。
- 6 行目に次のサーバー シード ハッシュを入力します。
- 「実行」をクリックします。
サーバー シードの検証と賭けの結果は、下の結果ボックスに表示されます。
コードのコピーも保存しており、下のネタバレボタンをクリックすると見ることができます。
[ネタバレ]// Crypto.Games のスロットマシン変換 $server_seed = "ylVWazQHJxoG9TAcLmDj1n6q1UkJgyFW4oTJhUhL"; $client_seed = "sdf96dsf9876s9dd78f6"; $next_server_seed_hash = "bdfa300164ebbd77ce9a3c3c58863688c4537df91173088915afdd4c9b6b302c"; $reel_strip_array=array("エラー","アップル","バナナ","チェリー","ブドウ","イチゴ","オレンジ","コイン","ピーチ"); $win_array=配列(10000,1500,700,100,70,25,11,0); $server_seed_hash=ハッシュ('sha256', $server_seed); ($server_seed_hash==$next_server_seed_hash) の場合 { echo "サーバーシードが一致しました。\n"; } それ以外 { echo "サーバーシードが一致しません!\n"; echo "サーバーシード =\t$server_seed\n"; echo "サーバーシードハッシュ =\t$server_seed_hash\n"; echo "次のハッシュとされるもの=\t$next_server_seed_hash\n"; } $reels_found=0; $位置=0; $combined_seed = $server_seed.$client_seed; echo "結合シード = $combined_seed\n"; $combined_hash = ハッシュ('sha512'、$combined_seed); echo "結合されたシードのハッシュ = $combined_hash\n"; する { $first_two=substr($combined_hash、$position、2); $hex_to_dec=hexdec($first_two)%10; (($hex_to_dec>=1)&&($hex_to_dec<=8)) の場合 { $reels_array[$reels_found] = $hex_to_dec; $reels_found++; echo "リール $reels_found =\t$reel_strip_array[$hex_to_dec]\n"; } $位置+=2; ($position==128) の場合 { echo "エラー -- ハッシュにスペースがありません。\n"; $reels_found=5; } } while ($reels_found<5); $coins=0; for ($i=0; $i<=4; $i++) { if ($reels_array[$i]==7) { $coins++; } } if ($coins==5) { $win=0; } elseif ( ($reels_array[0]==$reels_array[1]) && ($reels_array[0]==$reels_array[2]) && ($reels_array[0]==$reels_array[3]) && ($reels_array[0]==$reels_array[4])) { $win=1; } // 5枚揃い elseif ($coins==4) { $win=2; } elseif ((($reels_array[0]==$reels_array[1]) && ($reels_array[0]==$reels_array[2]) && ($reels_array[0]==$reels_array[3])) || (($reels_array[0]==$reels_array[1]) && ($reels_array[0]==$reels_array[2]) && ($reels_array[0]==$reels_array[4])) || (($reels_array[0]==$reels_array[1]) && ($reels_array[0]==$reels_array[3]) && ($reels_array[0]==$reels_array[4])) || (($reels_array[0]==$reels_array[2]) && ($reels_array[0]==$reels_array[3]) && ($reels_array[0]==$reels_array[4])) || (($reels_array[1]==$reels_array[2]) && ($reels_array[1]==$reels_array[3]) && ($reels_array[1]==$reels_array[4]))) { $win=3; } // フォー・オブ・ア・カインド elseif ($coins==3) { $win=4; } elseif ($coins==2) { $win=5; } elseif ($coins==1) { $win=6; } else { $win=7; } echo "Win =\t$win_array[$win]\n" // 手順 // 1. 「position」を 0 に、「reels found」を 0 にします。 // 2.サーバーとクライアントのシード値とサーバーのシード値をこの順序で結合します。 // 3. 手順 2 の文字列の SHA-512 ハッシュを生成します。 // 4. 手順 3 のハッシュの「位置」から始まる最初の 2 文字を 16 進数から 10 進数に変換します。 // 5. 手順 4 から末尾の数字を取得します。 // 6. 手順 5 の結果が 1 ~ 8 の場合、以下の表に従ってそれをシンボルにマッピングし、「見つかったリール」を 1 増やします。 // 7. 5 つのリールが見つかった場合は停止し、それ以外の場合は「位置」を 1 増やして手順 4 に戻ります。 // 8. 5 つのリールが見つかったら、ハッシュで見つかった順に左から右に表示します。 // 9. シンボル マップ: // 1 = リンゴ // 2 = バナナ // 3 = チェリー // 4 = ブドウ // 5 = イチゴ // 6 = オレンジ // 7 = コイン // 8 = 桃 ?>
[/ネタバレ]