このページ
ルーレット(暗号化版)
このページ
概要
このページでは、暗号通貨を基盤とするカジノでよくプレイされる、暗号化されたルーレットについて解説します。読者の方は、従来のルーレットの基本ルールを既にご存知かと思います。
公正なカジノ
ボーナスコード
分析
Crypto.Gamesのルーレットでは、オンラインカジノでよくあるように、シングルゼロホイールでプレイされます。ハウスエッジは1ベットあたり1/37 = 2.70%です。公正なゲーム
以下の暗号技術の使用方法の説明は、読者が暗号技術の用語と概念にある程度精通していることを前提としています。基本的な情報については、私のサイコロ(暗号化版)のページをご覧ください。Crypto.Gamesのルーレットゲームでは、0から37までの乱数を生成し、その乱数をゲームの結果として使用します。
- いつものように、ゲームでは次の賭けのためのサーバー シードのハッシュを公開し、プレーヤーが独自のクライアント シードを選択できるようにします。
- プレイヤーは、従来のルーレットと同様に賭けをします。
- ゲームはサーバー シードとクライアント シードをこの順序で結合します。
- ゲームはステップ 3 の結合シードの SHA-512 ハッシュを取得します。
- ゲームは、ステップ 4 で、ハッシュの左から 2 つの文字を 16 進数から 10 進数に変換します。
- 手順 5 の 10 進数の末尾の 2 桁を取得します。
- ステップ 6 の結果が 0 ~ 36 の場合、それをルーレットの結果として使用します。
- ステップ 6 の結果が 37 以上の場合は、ハッシュ内で 2 つの位置を進め、ステップ 5 に戻ります。
例
まず、上記の「Fair Gaming」画面に移動します。次に、任意のクライアントシードを入力します。ランダムな文字列でも構いません。次に、以下の2つの情報をコピーして別のソースに貼り付けます。
- クライアントシード
- 次のサーバー シード ハッシュ。これは「次のサーバー シード SHA256」というラベルが付けられます。
ノンス(クライアントシードの末尾に追加される自動生成文字)を追加するかどうかはあなた次第です。カジノ側が不正行為を意図している場合、ノンスを追加しても何の保護にもならないと思います。
この例では、これが保存する必要がある証拠です。
次のサーバーのシードハッシュ = e7043dd7fe369b94518449d61162a0c960f54781a16548af63194b7fd9d6891a クライアントシード = b0x6vb0v6TYUIQWF6b0sd6f0y
次に、上記のように賭けをしました。ここでは、1枚あたり0.000001 BTC(ビットコイン)相当のチップを10枚、合計0.00001 BTC(約10セント相当)を赤色に賭けました。
結果は赤7なので、私の勝ちです。
次に、以下の手順で結果を検証します。現実世界では、負けた時だけこの点にこだわるでしょう。もしカジノが不正行為をしようとしていたら、おそらく私は負けていたでしょう。
- サーバーシードとクライアントシードを次の順序で結合します: sMDGT5P10m071HAdTQkoYCLJ8vLXnwzq6ugfloMTb0x6vb0v6TYUIQWF6b0sd6f0y
- ステップ 1 で結合したシードの SHA-512 ハッシュを取得します。
40cf0126a307d4d72900279d330499f6a5447c35ed838d6ec3fd2b53872df73ccac001686ddf05e024c5899205afa9d0551b5e19b8397af180f6de06aea429ac
- 最初の 2 文字、つまり 40 を取得します。
- 16 進数の 40 を 10 進数に変換すると、4*16 + 0*1 = 64 になります。
- ステップ4の10進数の結果には2桁の数字が含まれているので、そのままにしておきます。そうでなければ、末尾の2桁の数字を取ったはずです。
- 64 は 36 より大きいので、ルーレットの結果にはなりません。
- ハッシュ内の 2 つの文字 (cf) を進めます。
- cf を 10 進数に変換します: c*16 + f = 12*16 + 15*1 = 207。
- 207 は 2 桁以上あるので、右側の 2 つ、つまり 07 を取ります。
- 7<=36なので、これがゲームの結果になります。
- 次に、賭けの前に与えられたサーバー シード ハッシュ (e7043 で始まる) が最後の賭けのサーバー シードと一致することを確認します。何らかの理由で、このカジノは結合された文字列をハッシュするために使用される SHA-512 ではなく、SHA-256 関数を使用してハッシュすることを選択しています。
- この場合、sMDGT5P10m071HAdTQkoYCLJ8vLXnwzq6ugfloMT のハッシュは確かに e7043dd7fe369b94518449d61162a0c960f54781a16548af63194b7fd9d6891a にハッシュされ、最後の賭けに対するカジノの貢献が運命づけられていたことが保証されます。
面倒なことが山ほどあるように思われるかもしれませんが、代わりにそれを実行してくれる便利なプログラムを書きました。使い方は以下のとおりです。
- PHP サンドボックスに移動します。
- 4 行目にクライアント シードを入力します。
- 5 行目にサーバー シードを入力します。
- 6 行目に次のサーバー シードのハッシュを入力します。
- 「コードを実行」をクリックします。
- ゲームの結果を確認し、サーバーシードのハッシュが賭け前に提供されたものと一致しているかどうかを確認してください。一致しない場合は、不正行為があったことを示します。
コードのコピーも用意していますので、下のボタンをクリックすると表示されます。
[ネタバレ]
// Crypto.Games のルーレットゲーム変換 // 4 行目にクライアント シードを入力し、5 行目にサーバー シードを入力します。 $client_seed = "b0x6vb0v6TYUIQWF6b0sd6f0y"; $server_seed = "sMDGT5P10m071HAdTQkoYCLJ8vLXnwzq6ugfloMT"; $next_hash = "e7043dd7fe369b94518449d61162a0c960f54781a16548af63194b7fd9d6891a"; $color_array = 配列(0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1); $位置=0; $combined_seed = $server_seed.$client_seed; echo "結合シード = $combined_seed\n"; $combined_hash = ハッシュ('sha512'、$combined_seed); $server_hash = ハッシュ('sha256',$server_seed); echo "結合されたシードのハッシュ = $combined_hash\n"; する { $first_two=substr($combined_hash、$position、2); $hex_to_dec=hexdec($first_two); $hex_to_dec%=100; ($hex_to_dec-->36) の場合 { $位置+=2; } } ($hex_to_dec>36) の間; echo "サーバーシードのハッシュ =\t $server_hash\n"; echo "ゲームの結果 =\t$hex_to_dec "; ($color_array[$hex_to_dec]==0) の場合 { echo "緑\n"; } そうでない場合 ($color_array[$hex_to_dec]==1) { echo "赤\n"; } それ以外 { echo "黒\n"; } $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. Position を 0 に設定します。 // 2. サーバー シードとクライアント シード、およびサーバー シードをこの順序で結合します。 // 3. 手順 2 の文字列の SHA-512 ハッシュを生成します。 // 4. 手順 3 のハッシュの「位置」から最初の 2 文字を 16 進数から 10 進数に変換します。 // 5. ステップ 4 の値が 0 から 36 の場合、それがゲームの結果になります。 // 6. それ以外の場合は、位置を 2 進めて手順 4 に進みます。 ?>[/ネタバレ]