Nesta página
Máquina caça-níqueis (criptografada)
Nesta página
Introdução
Esta página explica como funciona uma máquina caça-níqueis específica baseada no processo de jogo justo criptografado. Em última análise, o resultado de todas as máquinas caça-níqueis é baseado em um sorteio de números aleatórios. No caso de jogos criptografados, os números aleatórios são baseados em uma longa sequência de caracteres aleatórios.
Cassinos comprovadamente justos
Código de bônus
Análise
No caso da máquina caça-níqueis jogada no Crypto.Games, o jogo é bastante simples. Trata-se de um jogo de cinco cilindros e uma linha de pagamento. O jogador deve apostar 10 créditos. O valor de cada 10 créditos é determinado pelo jogador. Cada cilindro possui oito símbolos diferentes: maçã, banana, cereja, uva, morango, laranja, Bitcoin e pêssego. O resultado de cada cilindro é independente dos demais.
A seguir, apresentamos a tabela de pagamentos da máquina caça-níqueis Crypto.Games. A posição dos símbolos não importa. Por exemplo, se o jogador conseguir dois símbolos de Bitcoin, ele receberá o pagamento independentemente de onde eles estiverem na linha de pagamento. Todos os ganhos são calculados "para um". No caso de quatro frutas iguais e um Bitcoin, presumo que o jogador receba apenas o pagamento correspondente ao maior valor entre quatro símbolos iguais, embora o arquivo de ajuda do jogo não mencione essa situação.
Tabela de Pagamento
| Evento | Paga |
|---|---|
| Cinco bitcoins | 10000 |
| Cinco de um tipo | 1500 |
| Quatro bitcoins | 700 |
| Quatro de um mesmo tipo | 100 |
| Três bitcoins | 70 |
| Dois bitcoins | 25 |
| Um bitcoin | 11 |
Análise do Jogo
Acredito que, de acordo com o projeto original da máquina caça-níqueis Crypto.Games, cada símbolo teria o mesmo peso, ou probabilidade. Se isso for verdade, a tabela a seguir demonstra minha análise. A coluna de retorno é (ganho)*(probabilidade)/10. A divisão por 10 se deve ao fato de o jogador precisar apostar dez créditos. A célula inferior direita mostra um retorno de 98,03%.
Tabela de retorno — Ponderação igual
| Evento | Paga | Combinações | Probabilidade | Retornar |
|---|---|---|---|---|
| Cinco bitcoins | 10.000 | 1 | 0,000031 | 0,030518 |
| Cinco de um tipo | 1.500 | 7 | 0,000214 | 0,032043 |
| Quatro bitcoins | 700 | 35 | 0,001068 | 0,074768 |
| Quatro de um mesmo tipo | 100 | 245 | 0,007477 | 0,074768 |
| Três bitcoins | 70 | 490 | 0,014954 | 0,104675 |
| Dois bitcoins | 25 | 3.430 | 0,104675 | 0,261688 |
| Um bitcoin | 11 | 11.970 | 0,365295 | 0,401825 |
| Perdedor | - | 16.590 | 0,506287 | 0,000000 |
| Total | 32.768 | 1.000000 | 0,980286 |
No entanto, devido ao funcionamento do processo de Jogo Justo, alguns símbolos têm um peso maior do que outros. Especificamente, a maçã, a banana, a cereja, as uvas e o morango têm um peso de 26 cada, enquanto a laranja, o Bitcoin e o pêssego têm um peso de 25. A probabilidade de um rolo parar em qualquer símbolo é proporcional ao seu peso. Grande parte do retorno do jogo vem dos símbolos do Bitcoin. Como o peso de um Bitcoin é 25 e a média geral é 25,625, há uma probabilidade ligeiramente inferior a 1 em 8 de um rolo parar em um Bitcoin. Isso reduz o retorno do jogo, como mostrado na tabela a seguir. A célula inferior direita mostra um retorno de 95,06%.
Tabela de retorno — Ponderação desigual
| Evento | Paga | Combinações | Probabilidade | Retornar |
|---|---|---|---|---|
| Cinco bitcoins | 10.000 | 9.765.625 | 0,000027 | 0,026973 |
| Cinco de um tipo | 1.500 | 78.938.130 | 0,000218 | 0,032705 |
| Quatro bitcoins | 700 | 351.562.500 | 0,000971 | 0,067972 |
| Quatro de um mesmo tipo | 100 | 2.748.092.600 | 0,007590 | 0,075904 |
| Três bitcoins | 70 | 5.062.500.000 | 0,013983 | 0,097880 |
| Dois bitcoins | 25 | 36.450.000.000 | 0,100677 | 0,251691 |
| Um bitcoin | 11 | 130.836.733.750 | 0,361377 | 0,397515 |
| Perdedor | - | 186.513.035.520 | 0,515157 | 0,000000 |
| Total | 362.050.628.125 | 1.000000 | 0,950639 |
Jogo Justo
A seguir, descrevo o processo que o Crypto.Games usa para determinar onde cada rolo para. Isso pressupõe que o leitor conheça os conceitos básicos de Hashing e matemática de base 16. Caso contrário, explico isso na minha página sobre Dados (Versão Criptografada) .
- Combine a semente do servidor e a semente do cliente, começando pela semente do servidor.
- Pegue o hash SHA-512 da etapa 1.
- Começando pelo lado esquerdo, selecione dois caracteres do Hash obtido na etapa 2.
- Converta os dois caracteres da etapa 3 de hexadecimal para decimal.
- Pegue o dígito final do resultado da etapa 4.
- Se o resultado da etapa 5 for de 1 a 8, então associe-o a um símbolo, da seguinte forma:
- 1 = Maçã
- 2 = Banana
- 3 = Cereja
- 4 = Uvas
- 5 = Morango
- 6 = Laranja
- 7 = Bitcoin
- 8 = Pêssego
- Se o passo 6 estiver no intervalo de 1 a 8, atribua esse símbolo a um rolo, começando pela esquerda.
- Independentemente de ter sido encontrado um símbolo ou não, avance duas posições no Hash e retorne ao passo 3, até que cinco números no intervalo de 1 a 8 sejam encontrados (um para cada rolo).
Exemplo
A seguir, descrevemos como o processo funciona para uma mão de exemplo.
Na imagem acima, do painel Provably Fair, escolhi minha própria Semente do Cliente. Em seguida, copiei e colei em outro lugar a Semente do Servidor e o Hash da Semente do Cliente, com o rótulo "Próxima Semente do Servidor SHA256". Neste caso, são:
Semente do cliente: sdf96dsf9876s9dd78f6 Hash da semente do próximo servidor: bdfa300164ebbd77ce9a3c3c58863688c4537df91173088915afdd4c9b6b302c
Fiz uma aposta e joguei. Meu resultado, da esquerda para a direita, foi cereja-maçã-banana-morango-banana, que perdi.
Depois de escolher minha Semente do Cliente, volto ao painel da Provably Fair para garantir que o resultado estava predestinado. Aqui estão os passos que sigo:
- Primeiramente, observo a última seed do servidor, que, segundo eles, foi:
ylVWazQHJxoG9TAcLmDj1n6q1UkJgyFW4oTJhUhL
Eu usei um programa de hash SHA-256 para gerar essa semente. O hash dessa semente é:
bdfa300164ebbd77ce9a3c3c58863688c4537df91173088915afdd4c9b6b302c
Isso corresponde ao hash da semente do próximo servidor que me foi fornecido antes de fazer a aposta, então posso ter certeza de que o resultado estava predestinado depois que escolhi uma semente do cliente, mas antes de fazer a aposta.
No entanto, o que eu quero saber é por que o resultado foi cereja-maçã-banana-morango-banana. Veja como verificar isso:
- Combine a semente do servidor e a semente do cliente, nessa ordem, para obter ylVWazQHJxoG9TAcLmDj1n6q1UkJgyFW4oTJhUhLsdf96dsf9876s9dd78f6.
- Utilize o hash SHA-512 da etapa 1 para obter 3F8CEF835C55B60C8682C580C1A0C6DCA5013F4614A82A6797273495CCE46418EA044CCD964B83D0765C9CE6A174F93E20DB56E118CF8AE82B2D0864FC09B066.
- Pegue os dois primeiros caracteres, 3F, e converta-os de hexadecimal para decimal: 3*16 + 15 = 48 + 15 = 63.
- Pegue o último dígito de 63, que é 3. Como ele está no intervalo de 1 a 8, associe-o a um símbolo de acordo com as instruções de Jogo Justo acima. Nesse caso, um 3 corresponde a uma cereja.
- Avance dois símbolos no Hash da etapa 2, que são 8C.
- Converter 8C de hexadecimal para decimal: 8*16 + 12 = 140.
- O último dígito de 140 é 0, que não corresponde a nada, então ignore o 8C.
- Avance dois símbolos no Hash da etapa 2, que são EF.
- Converter EF de hexadecimal para decimal: 14*16 + 15 = 239.
- O último dígito de 239 é 9, que não corresponde a nada, então ignore o EF.
- Avance dois símbolos no Hash da etapa 2, que são 83.
- Converter EF de hexadecimal para decimal: 8*16 + 3 = 131.
- Pegue o último dígito de 131, que é 1. Como 1 está no intervalo de 1 a 8, associe-o a um símbolo de acordo com as instruções de Jogo Justo acima. Nesse caso, 1 corresponde a uma maçã.
- Avance dois símbolos no Hash da etapa 2, que são 5C.
- Converter 5C de hexadecimal para decimal: 5*16 + 12 = 92.
- Pegue o último dígito de 92, que é 2. Como 2 está no intervalo de 1 a 8, associe-o a um símbolo de acordo com as instruções de Jogo Justo acima. Nesse caso, um 2 corresponde a uma Banana.
- Avance dois símbolos no Hash da etapa 2, que são 55.
- Converter 55 de hexadecimal para decimal: 5*16 + 5 = 85.
- Pegue o último dígito de 85, que é 5. Como 5 está no intervalo de 1 a 8, associe-o a um símbolo de acordo com as instruções de Jogo Justo acima. Nesse caso, um 5 corresponde a um morango.
- Avance dois símbolos no Hash da etapa 2, que são B6.
- Converter B6 de hexadecimal para decimal: 11*16 + 6 = 182.
- Pegue o último dígito de 182, que é 2. Como 2 está no intervalo de 1 a 8, associe-o a um símbolo de acordo com as instruções de Jogo Justo acima. Nesse caso, um 2 corresponde a uma Banana.
- Foram encontrados cinco símbolos, portanto, uma cereja, uma maçã, uma banana, um morango e outra banana são mostrados ao jogador na linha de pagamento central como resultado de sua aposta.
Código de Jogo Justo
Se tudo isso parece um processo muito trabalhoso, eu concordo. Por isso, escrevi um programa em PHP para fazer isso para você. Basta clicar no link e seguir as instruções:
- Insira a semente do servidor na linha 4.
- Insira a Senha do Cliente na linha 5.
- Insira o próximo hash de seed do servidor na linha 6.
- Clique em "executar".
A verificação da Semente do Servidor e o resultado da aposta serão exibidos na caixa de Resultados abaixo.
Eu também mantenho uma cópia do código, que você pode ver clicando no botão de spoiler abaixo.

// Conversão de máquinas caça-níqueis para Crypto.Games $server_seed = "ylVWazQHJxoG9TAcLmDj1n6q1UkJgyFW4oTJhUhL"; $client_seed = "sdf96dsf9876s9dd78f6"; $next_server_seed_hash = "bdfa300164ebbd77ce9a3c3c58863688c4537df91173088915afdd4c9b6b302c"; $reel_strip_array=array("Erro","Maçã","Banana","Cereja","Uvas","Morango","Laranja","Moeda","Pêssego"); $win_array=array(10000,1500,700,100,70,25,11,0); $server_seed_hash=hash('sha256', $server_seed); se ($server_seed_hash==$next_server_seed_hash) { echo "A semente do servidor corresponde.\n"; } outro { echo "SEED DO SERVIDOR INCOMPATÍVEL!\n"; echo "Semente do servidor =\t$server_seed\n"; echo "Hash da semente do servidor =\t$server_seed_hash\n"; echo "Suposto próximo hash=\t$next_server_seed_hash\n"; } $reels_found=0; $position=0; $combined_seed = $server_seed.$client_seed; echo "Semente combinada = $combined_seed\n"; $combined_hash = hash('sha512', $combined_seed); echo "Hash da semente combinada = $combined_hash\n"; fazer { $first_two=substr($combined_hash,$position,2); $hex_to_dec=hexdec($first_two)%10; se ($hex_to_dec>=1)&&($hex_to_dec<=8)) { $reels_array[$reels_found] = $hex_to_dec; $reels_found++; echo "Carretel $reels_found =\t$reel_strip_array[$hex_to_dec]\n"; } $position+=2; se ($posição==128) { echo "Erro -- Não há mais espaço no hash."\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; } // cinco de um tipo 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; } // quadra elseif ($coins==3) { $win=4; } elseif ($coins==2) { $win=5; } elseif ($coins==1) { $win=6; } else { $win=7; } echo "Ganho =\t$win_array[$win]\n" // Procedimento // 1. Zere a "posição" e o número de "rolos encontrados" para 0. // 2. Combine a semente do servidor e a semente do cliente, nessa ordem. // 3. Gere um hash SHA-512 do string da etapa 2. // 4. Converta os dois primeiros caracteres, começando na "posição" do hash da etapa 3, de hexadecimal para decimal. // 5. Pegue o dígito final de 4. // 6. Se o resultado da etapa 5 for de 1 a 8, mapeie-o para um símbolo, de acordo com a tabela abaixo, e incremente "rolos encontrados" em 1. // 7. Se cinco rolos forem encontrados, pare; caso contrário, incremente a "posição" em 1 e volte para a etapa 4. // 8. Depois que cinco rolos forem encontrados, exiba-os da esquerda para a direita, na ordem em que foram encontrados no Hash. // 9. Mapeamento de símbolos: // 1 = Maçã // 2 = Banana // 3 = Cereja // 4 = Uva // 5 = Morango // 6 = Laranja // 7 = Moeda // 8 = Pêssego ?>


