このページ
ブラックジャック(暗号化版)
このページ
概要
このページでは、暗号通貨を導入しているカジノでよくプレイされる、暗号化されたブラックジャックについて解説します。読者の方は、従来のブラックジャックの基本ルールを既にご存知かと思います。
公正なカジノ
ボーナスコード
分析
Crypto.Games のゲームの場合、奇妙なルールは次のとおりです。
- 4デッキ
- 各ハンドごとにシャッフルする
- ディーラーはブラックジャックを覗き見しない
- ブラックジャックの配当は6:5
- ディーラーはソフト17でヒットする
- 2枚のカードでダブル
- スプリットエースをヒット
- 早期降伏
- スプリット後の10とエースはブラックジャックとしてカウントされます
- スプリット後のダブルは許可されます
- プレイヤーは一度だけ分割できる(と仮定)
早期サレンダーとスプリット後の10-Aをブラックジャックとしてカウントしない場合、私のブラックジャックハウスエッジ計算機は、基本戦略でハウスエッジを1.91%と算出します。しかし、ブラックジャックのルールバリエーションリストによると、計算機がサポートしていない2つのルールの値は0.74%です。これにより、全体のハウスエッジは1.17%となり、オンラインブラックジャックゲームとしてはかなり高い数値となります。
公正なゲーム
以下は、Crypto.Games がブラックジャック ゲームで 4 デッキ シューからカードをランダムに選択するために使用するプロセスです。
- 賭けが行われる前に、サーバー シードの SHA-256 ハッシュをプレイヤーに公開します。
- 賭けが行われた後、サーバー シードとクライアント シードをこの順序で組み合わせます。
- 手順 1 の結合シードの SHA-512 ハッシュを取得します。
- 手順 2 で見つかったハッシュから、左を見つめながら 2 つの文字を取ります。
- 手順3の2文字を16進数から10進数に変換します。何を言っているのか理解できない場合は、サイコロ(暗号化版)のページで16進数の計算について解説しています。
- ステップ 4 の結果が 207 以下の場合、そのカード番号を 208 枚のカード シュー内の特定のカードにマッピングします。
- 該当するカード番号がまだ手札にない場合は、特定のカードにマッピングします。その方法は次のとおりです。
- ランクを求めるには、カードの数字を13で割り、その余りを取ります。余りをランクに当てはめます。0はエース、1は2、2は3、3は4、4は5、5は6、6は7、7は8、8は9、9は10、10はジャック、11はクイーン、12はキングです。
- スートを求めるには、カードの数字を13で割り、余りを落とします。さらに、その商を4で割り、余りを取ります。さらに、その余りをスートに当てはめます。0はスペード、1はハート、2はダイヤ、3はクラブです。
- それ以外の場合、ステップ 5 の結果が 207 より大きい場合、またはそのカードがすでに見つかっている場合は、ハッシュ内のその 2 桁を無視します。
- ハッシュを2つ進めて、ステップ3に戻り、ハッシュの最後まで進みます。これで、ブラックジャックのハンドを処理するのに必要なカードよりも多くのカードが手に入るはずです。
例
以下は、例の手に対するプロセスの動作方法です。
上記の画像は「Fair Gaming」パネルから引用したもので、賭けを行う前に撮影されたものです。公正なゲームを保証するために重要なことは、新しいクライアントシード(ランダムな文字列で構いません)と、ゲームタイトルで「Next server seed SHA256」と表示される次のサーバーシードのハッシュを入力して記録することです。以下がその例です。
クライアントシード = 5v5b85n85vb856nvbn5vbn
- 次のサーバーシード SHA256 =
581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6
個人的には、このプロセスを面倒な方法で実行する場合は、これらの項目をコピーしてメモ帳に貼り付けます。
上の画像では、0.00001BTC(ビットコイン)から賭けを始めています。これは約10セントに相当します。プレイヤーはこの賭け金を使って10枚のチップを購入し、その後10枚すべてを賭ける必要があります。なぜこの手順で混乱を招いているのか、私には理解できません。
私の最初の手札は 3 に対して 11 だったので、ダブルして 3 になりました。ディーラーはホールカードに 5 を持っていて、合計は 8 でしたが、その後キングを引いて合計は 18 になりました。つまり、私は 14 対 18 で負けました。
png" />
次に、「フェアゲーミング」パネルに戻り、賭ける前にカードの順番が事前に決まっていたことから、ゲームが公正であったことを確認します。上記の手順に従います。
- Fair Gaming パネルから、サーバー シードが
Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ
であったことがわかります。 - その SHA-256 ハッシュを取得すると、 581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6 が得られます。
- ステップ2のハッシュと、ベット前に記録された「次のサーバーのシード値SHA256」を比較し、一致していることを確認します。一致しない場合は、プレイヤーが何か間違ったことをしたか、カジノが嘘をついているか不正行為をしている可能性があります。この場合は一致しています。これにより、カードの順番が予め決まっていたことが証明されます。
- 正しいカードを入手したか確認するには、サーバーシードとクライアントシードをこの順番で組み合わせてください。そうすると、 Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ5v5b85n85vb856nvbn5vbnになります。ナンスを使用する場合は、クライアントシードの末尾にナンスが入ります。
- 手順4で得られたハッシュを結合したSHA-512ハッシュを取得します。なぜ2つの異なるハッシュ関数(SHA-256とSHA-512)が使用されているのかは分かりません。結果は2b87fbc5eac7368ef393c8ab292f71a0251702f6db028ca8a855bfaa541b78df3ae996ad22ac022588a46231ed32180d5cbde86dff5d2368cbb7658332bbb9bcとなります。
- 最初の 2 文字 ( 2b ) を 16 進数に変換します。2b = 2*16 + 11 = 43。
- 43 <= 207なので、これをカードに変換します。ランク = mod(43,13) = 4 となり、5 になります。スート = mod(int(43/13),4) = mod(3,4) = 3 となり、クラブになります。これがプレイヤーに配られる最初のカード、クラブの5です。
- 手順4のハッシュを2つ進めて、 87にします。これを16進数から10進数に変換すると、8*16 + 7 = 135となります。
- 135 <= 207 であり、まだ見つかっていないので、これをカードに変換します。rank = mod(135,13) = 5 となり、6 にマッピングされます。suit = mod(int(135/13),4) = mod(10,4) = 2 となり、ダイヤにマッピングされます。これはプレイヤーに配られた2枚目のカード、ダイヤの6です。
- 手順4のハッシュを2つ進めます( fb )。これを16進数から10進数に変換します:15*16 + 11 = 251。
- 251 > 207 なので、これら 2 つの位置をスキップします。
- 手順4のハッシュを2つ進めてc5にします。これを16進数から10進数に変換します:12*16 + 5 = 197。
- 197 <= 207 であり、まだ見つかっていないので、これをカードに変換します。ランク = mod(197,13) = 2 となり、ランクは3になります。スート = mod(int(197/13),4) = mod(15,4) = 3 となり、クラブになります。これがディーラーに配られる最初の(表向きの)カード、クラブの3です。
- 手順4のハッシュを2つ進めます。これはeaです。これを16進数から10進数に変換します。14*16 + 10 = 234。
- 234 > 207 なので、これら 2 つの位置をスキップします。
- 手順4のハッシュを2つ進めてc7にします。これを16進数から10進数に変換すると、12*16 + 7 = 199となります。
- 199 <= 207 であり、まだ見つかっていないので、これをカードに変換します。rank = mod(199,13) = 4 となり、5 にマッピングされます。suit = mod(int(199/13),4) = mod(15,4) = 3 となり、クラブにマッピングされます。これはディーラーに配られる2枚目(裏向き)のカード、クラブの5です。
- 手順4のハッシュを2つ進めて、 36になります。これを16進数から10進数に変換すると、3*16 + 6 = 54となります。
- 54 <= 207 であり、まだ見つかっていないので、これをカードに変換します。rank = mod(54,13) = 2 で、3 にマッピングされます。suit = mod(int(54/13),4) = mod(4,4) = 0 で、スペードにマッピングされます。このスペードの3は、シューの次のカードであり、ダブルダウン後にプレイヤーに渡されます。したがって、プレイヤーの合計は 5+6+3 = 14 です。
- 手順4のハッシュを2つ進めて、 8eにします。これを16進数から10進数に変換します:8*16 + 14 = 142。
- 142 <= 207 であり、まだ見つかっていないので、これをカードに変換します。ランク = mod(142,13) = 12 となり、キングに相当します。スート = mod(int(142/13),4) = mod(10,4) = 2 となり、ダイヤに相当します。このダイヤのキングは、シューの中の次のカードで、ディーラーがハード8をヒットし、合計18になったときに配られました。
- プレイヤーは14対18で負けます。
- さらにカードが必要な場合は、十分な数のカードが見つかるまでこのプロセスをループし続けます。
手順が多すぎると思われるかもしれませんが、ご容赦ください。そこで、代わりにPHPスクリプトを作成しました。使い方は以下のとおりです。
- PHP サンドボックスに移動します。
- 3 行目にサーバー シードを入力します。
- 4 行目にクライアント シードを入力します。
- 5 行目に次のサーバー シードのハッシュを入力します。
- 「コードを実行」をクリックします。
プログラムは、賭ける前に提供されたサーバー シード ハッシュとゲームで配られたカードとを照合します。
コードのコピーも用意していますので、下のボタンをクリックすると表示されます。
[ネタバレ]// Crypto.Games のブラックジャック公平性チェック $server_seed = "Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ"; $client_seed = "5v5b85n85vb856nvbn5vbn"; $next_hash = "581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6"; $rank_array=配列("A",2,3,4,5,6,7,8,9,10,"J","Q","K"); $suit_array=array("スペード","ハート","ダイヤモンド","クラブ"); $cards_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); ($hex_to_dec <=207) の場合 { $繰り返し=0; ($cards_found>0) の場合 { ($i=0; $i<$cards_found; $i++) の場合 { if ( $hex_to_dec == $card_array[$i] ) { $repeat=1; } } } ($repeat==0) の場合 { $card_array[$cards_found] = $hex_to_dec; $cards_found++; $rank=$hex_to_dec%13; $suit=intdiv($hex_to_dec,13)%4; echo "カード $cards_found = \t$rank_array[$rank] / $suit_array[$suit]\n"; } } $位置+=2; ($position==128)の場合 { echo "エラー -- ハッシュにスペースがありません。\n"; $cards_found=10; } } $cards_found<20 の間; $server_seed_hash=ハッシュ('sha256', $server_seed); ($server_seed_hash==$next_hash) の場合 { echo "サーバーシードが一致しました。\n"; } それ以外 { echo "サーバーシードが一致しません!\n"; echo "サーバーシード =\t$server_seed\n"; echo "サーバーシードハッシュ =\t$server_seed_hash\n"; echo "次のハッシュとされるもの=\t$next_hash\n"; } // 手順 // 1. 「step」を 0 に、「position」を 0 にします。 // 2. サーバーおよびクライアントのシード、ステップ、サーバーのシードをこの順序で結合します。 // 3. 手順 2 の文字列の SHA-512 ハッシュを生成します。 // 4. 手順 3 のハッシュの「位置」から最初の 2 文字を 16 進数から 10 進数に変換します。 // 5. 手順 4 の結果が 0 ~ 207 の場合、それを 4 デッキ シューの特定のカードにマッピングします。 // 6. ステップ 5 の結果がまだ出ている場合は、それがゲームで次に配られるカードになります。 // 7. 手順 6 から実際のカードまでのカードの位置を取得するには、次のようにします。 // A. 手順 4 の結果を 13 で割り、余りを計算します。 // B. 手順 7A の結果を次のようにマップしてランクを取得します: 0 を A、1 を 2、2 を 3、...、9 を 10、10 を J、11 を Q、12 を K。 // C. 手順 4 の結果を 13 で割り、余りを DROP します。 // D. 手順 7C の結果を 4 で割り、余りを計算します。 // E. 手順 7D の結果を次のようにマッピングしてスーツを取得します: 0 をスペード、1 をハート、2 をダイヤモンド、3 をクラブ。 // 8. ハッシュの最後まで手順 4 ~ 7 を繰り返しますが、ゲームでこれだけのカードが必要になる可能性は低いです。 ?>[/ネタバレ]