Nesta página
Blackjack (Versão Criptografada)
Nesta página
Introdução
Esta página trata da versão criptografada do blackjack, frequentemente jogada em cassinos que utilizam criptomoedas. Pressupõe-se que o leitor já esteja familiarizado com as regras básicas do blackjack convencional.
Cassinos comprovadamente justos
Código de bônus
Análise
No caso do jogo no Crypto.Games, o conjunto bizarro de regras é o seguinte:
- 4 baralhos
- Embaralhe após cada mão.
- O crupiê não dá uma espiada para ver se tem blackjack.
- Blackjack paga 6:5.
- O revendedor acerta no Soft 17
- Dobre em quaisquer duas cartas.
- Acertou ases divididos
- Rendição antecipada
- Um dez e um ás após dividir contam como blackjack.
- Dobro após divisão permitido
- O jogador pode dividir apenas uma vez (eu suponho).
Sem considerar a desistência antecipada e a contagem de 10-A após dividir como blackjack, minha calculadora de vantagem da casa no blackjack indica uma vantagem de 1,91% com a estratégia básica. No entanto, minha lista de variações das regras do blackjack mostra que o valor das duas regras não contempladas pela calculadora é de 0,74%. Isso resulta em uma vantagem da casa total de 1,17%, o que é bastante alto para um jogo de blackjack online.
Jogo Justo
A seguir, descrevemos o processo que a Crypto.Games utiliza para escolher aleatoriamente cartas de um conjunto de quatro baralhos para o seu jogo de blackjack.
- Revele ao jogador o hash SHA-256 da seed do servidor antes da aposta ser feita.
- Após a aposta ser feita, combine a Semente do Servidor e a Semente do Cliente, nessa ordem.
- Calcule o hash SHA-512 da semente combinada da etapa 1.
- Selecione dois caracteres do Hash encontrado na etapa 2, apontando para a esquerda.
- Converta os dois caracteres da etapa 3 de hexadecimal para decimal. Se você não entendeu o que estou explicando, eu menciono matemática de base 16 na minha página sobre Dados (Versão Criptografada).
- Se o resultado da etapa 4 for 207 ou menos, associe esse número de cartão a um cartão específico no baralho de 208 cartões.
- Se esse número de carta ainda não foi encontrado na mão, associe-o a uma carta de baralho específica. Veja como fazer isso:
- Para obter o valor da carta, divida o número da carta por 13 e calcule o resto. Associe o resto a um valor, da seguinte forma: 0 para ás, 1 para 2, 2 para 3, 3 para 4, 4 para 5, 5 para 6, 6 para 7, 7 para 8, 8 para 9, 9 para 10, 10 para valete, 11 para dama, 12 para rei.
- Para descobrir o naipe, divida o número da carta por 13 e descarte o resto. Em seguida, divida esse quociente por 4 e considere o resto. Depois, atribua esse resto a um naipe, da seguinte forma: 0 para espadas, 1 para copas, 2 para ouros, 3 para paus.
- Caso contrário, se o resultado da etapa 5 for maior que 207, ou se o cartão já tiver sido encontrado, ignore esses dois dígitos no Hash.
- Avance duas posições no Hash e depois volte ao passo 3, até chegar ao final do Hash. Isso deve lhe dar muito mais cartas do que você precisa para processar uma mão de blackjack.
Exemplo
A seguir, descrevemos como o processo funciona para uma mão de exemplo.
A imagem acima, do painel de Jogo Justo, foi tirada antes de fazer uma aposta. As ações importantes para garantir um jogo justo são inserir e registrar uma nova Semente do Cliente (uma sequência de caracteres aleatórios serve) e o Hash da próxima Semente do Servidor, que o jogo chama de "Próxima semente do servidor SHA256". Aqui estão eles:
Semente do cliente = 5v5b85n85vb856nvbn5vbn
- Próximo seed do servidor SHA256 =
581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6
Pessoalmente, eu copio e colo esses itens no Bloco de Notas, se for fazer esse processo da maneira mais difícil.
Na imagem acima, começo com uma aposta de 0,00001 BTC (Bitcoin), o que equivale a cerca de 10 centavos de dólar. Eles fazem o jogador usar essa aposta para comprar dez fichas e depois apostar as dez inteiras. Por que complicam as coisas com essa etapa, eu não sei.
Minha mão inicial era um total de 11 contra um três, então dobrei a aposta e recebi um 3. O crupiê tinha um 5 na mão fechada, totalizando 8, e então sacou um rei, totalizando 18. Portanto, perdi por 14 a 18.
png" />
Em seguida, volto ao painel de Jogo Justo para garantir que o jogo foi justo, conforme evidenciado pela ordem das cartas predeterminadas antes de eu fazer a aposta. Seguindo os passos acima:
- No painel Fair Gaming, vemos que a seed do servidor era
Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ. - Calculamos o hash SHA-256 disso para obter 581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6 .
- Comparamos o hash da etapa 2 com o "SHA256 da próxima semente do servidor" registrado antes da aposta e verificamos se eles coincidem. Se não coincidirem, ou você fez algo errado, ou o cassino está mentindo/trapaceando. Neste caso, eles coincidem. Isso verifica se a ordem das cartas estava predestinada.
- Para verificar se você obteve os cartões corretos, combine a Semente do Servidor e a Semente do Cliente, nessa ordem. Isso resultará em Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ5v5b85n85vb856nvbn5vbn . Se você optou por usar um nonce, ele deve estar no final da Semente do Cliente.
- Calcule o hash SHA-512 do hash combinado da etapa 4. Não faço ideia do porquê de usarem duas funções de hash diferentes (SHA-256 e SHA-512). Isso resultará em 2b87fbc5eac7368ef393c8ab292f71a0251702f6db028ca8a855bfaa541b78df3ae996ad22ac022588a46231ed32180d5cbde86dff5d2368cbb7658332bbb9bc.
- Pegue os dois primeiros caracteres, que são 2b , e converta-os para hexadecimal: 2b = 2*16 + 11 = 43.
- Como 43 <= 207, converta para uma carta: valor = mod(43,13) = 4, que corresponde a um 5. Naipe = mod(int(43/13),4) = mod(3,4) = 3, que corresponde a paus. Esta é a primeira carta distribuída ao jogador, o 5 de paus.
- Avance duas posições no Hash a partir da etapa 4, que são 87. Converta isso de hexadecimal para decimal: 8*16 + 7 = 135.
- Como 135 <= 207 e ainda não foi encontrado, converta para uma carta: valor = mod(135,13) = 5, que corresponde a um 6. Naipe = mod(int(135/13),4) = mod(10,4) = 2, que corresponde a ouros. Esta é a segunda carta distribuída ao jogador, o 6 de ouros.
- Avance duas posições no Hash a partir da etapa 4, que são fb . Converta isso de hexadecimal para decimal: 15*16 + 11 = 251.
- Como 251 > 207, pulamos essas duas posições.
- Avance duas posições no Hash a partir da etapa 4, que são c5 . Converta isso de hexadecimal para decimal: 12*16 + 5 = 197.
- Como 197 <= 207 e ainda não foi encontrado, converta para uma carta: valor = mod(197,13) = 2, que corresponde ao valor 3. Naipe = mod(int(197/13),4) = mod(15,4) = 3, que corresponde a paus. Esta é a primeira carta (com a face para cima) distribuída ao carteador, o 3 de paus.
- Avance duas posições no Hash a partir da etapa 4, que são ea . Converta isso de hexadecimal para decimal: 14*16 + 10 = 234.
- Como 234 > 207, pulamos essas duas posições.
- Avance duas posições no Hash a partir da etapa 4, que são c7 . Converta isso de hexadecimal para decimal: 12*16 + 7 = 199.
- Como 199 <= 207 e ainda não foi encontrado, converta-o para uma carta: valor = mod(199,13) = 4, que corresponde a um 5. O naipe = mod(int(199/13),4) = mod(15,4) = 3, que corresponde a paus. Esta é a segunda carta (virada para baixo) distribuída ao carteador, o 5 de paus.
- Avance duas posições no Hash a partir da etapa 4, que são 36. Converta isso de hexadecimal para decimal: 3*16 + 6 = 54.
- Como 54 <= 207 e ainda não foi encontrado, converta-o para uma carta: valor = mod(54,13) = 2, que corresponde a um 3. O naipe = mod(int(54/13),4) = mod(4,4) = 0, que corresponde a espadas. Este, o 3 de espadas, é a próxima carta no baralho, que foi para o jogador após a dobrada. O total do jogador é, portanto, 5+6+3 = 14.
- Avance duas posições no Hash a partir da etapa 4, que são 8e . Converta isso de hexadecimal para decimal: 8*16 + 14 = 142.
- Como 142 <= 207 e ainda não foi encontrado, converta-o para uma carta: valor = mod(142,13) = 12, que corresponde a um rei. O naipe = mod(int(142/13),4) = mod(10,4) = 2, que corresponde a ouros. Este, o rei de ouros, é a próxima carta no baralho, que foi para o carteador quando ele teve que pedir carta com um 8 rígido, totalizando 18.
- O jogador perde por 14 a 18.
- Caso fossem necessárias mais cartas, continuaríamos repetindo esse processo até encontrarmos cartas suficientes.
Se isso parece um processo demorado, eu concordo. É por isso que escrevi um script PHP para fazer isso por você! Para usá-lo, siga estes passos:
- Acesse o ambiente de testes PHP (Sandbox) .
- Insira o valor da seed do servidor na linha 3.
- Insira a Senha do Cliente na linha 4.
- Insira o Hash da próxima Seed do Servidor na linha 5.
- Clique em "Executar código".
O programa irá variar os hashes da semente do servidor de acordo com o que foi fornecido antes da sua aposta e com as cartas distribuídas no jogo.
Eu também tenho uma cópia do código, que você pode ver clicando no botão abaixo.

// Verificação de imparcialidade do blackjack para Crypto.Games
$server_seed = "Yt5IDwsb3Ldc5vyusvcQNfLqqjoYmCHGRkasqXNQ";
$client_seed = "5v5b85n85vb856nvbn5vbn";
$next_hash = "581b31f8cd6e5d4bb510ac0e53a440af7baab92f8f1f220eff14e20201e0b1f6";
$rank_array=array("A",2,3,4,5,6,7,8,9,10,"J","Q","K");
$suit_array=array("spades","hearts","diamonds","clubs");
$cards_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);
se ($hex_to_dec <= 207)
{
$repeat=0;
se ($cards_found>0)
{
para ($i=0; $i<$cards_found; $i++)
{
se ($hex_to_dec == $card_array[$i])
{ $repeat=1; }
}
}
se ($repeat==0)
{
$card_array[$cards_found] = $hex_to_dec;
$cards_found++;
$rank=$hex_to_dec%13;
$suit=intdiv($hex_to_dec,13)%4;
echo "Carta $cards_found = \t$rank_array[$rank] de $suit_array[$suit]\n";
}
}
$position+=2;
se ($posição==128)
{
echo "Erro -- Não há mais espaço no hash.\n";
$cards_found=10;
}
}
enquanto ($cards_found<20);
$server_seed_hash=hash('sha256', $server_seed);
se ($server_seed_hash==$next_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_hash\n";
}
// Procedimento
// 1. Defina o "passo" como igual a 0 e a "posição" como 0.
// 2. Junte as seeds do servidor e do cliente, passo a passo e seed do servidor, nessa ordem.
// 3. Gere um hash SHA-512 da string da etapa 2.
// 4. Converta os dois primeiros caracteres, começando na "posição" do símbolo de cerquilha (#) da etapa 3, de hexadecimal para decimal.
// 5. Se o resultado da etapa 4 for de 0 a 207, associe-o a uma carta específica em um sapato de quatro baralhos.
// 6. Se o resultado da etapa 5 já tiver aparecido, essa será a próxima carta a ser distribuída no jogo.
// 7. Para obter a posição de uma carta da etapa 6 e convertê-la em uma carta real, faça o seguinte:
// A. Divida o resultado da etapa 4 por 13 e pegue o resto.
// B. Mapeie o resultado da etapa 7A para obter a classificação, da seguinte forma: 0 para A, 1 para 2, 2 para 3, ... , 9 para 10, 10 para J, 11 para Q, 12 para K.
// C. Divida o resultado da etapa 4 por 13 e DESCARTE o restante.
// D. Divida o resultado da etapa 7C por 4 e pegue o resto.
// E. Mapeie o resultado da etapa 7D para obter o naipe, da seguinte forma: 0 para espadas, 1 para copas, 2 para ouros, 3 para paus.
// 8. Continue repetindo os passos 4 a 7 até chegar ao final do hash, embora seja improvável que tantas cartas sejam necessárias no jogo.
?>

