Justiça no KAKALOT Originals: verifique cada rodada você mesmo
Todo jogo KAKALOT Originals foi feito para que você possa conferir que cada resultado foi definido antes de você jogar e não foi alterado depois. Esta página explica a ideia e os passos, para que você não precise confiar apenas na palavra do site.
A ideia: travar primeiro, revelar depois
Antes de você jogar, o sistema cria um valor secreto chamado semente do servidor e mostra a você apenas o compromisso dele (o SHA-256 da semente do servidor). O compromisso funciona como um envelope lacrado: o site não consegue mudar o segredo depois sem que o hash deixe de bater.
Cada resultado é calculado a partir da semente do servidor, da semente do cliente (o valor do seu lado) e do número da rodada (nonce) com HMAC-SHA256. Quando você clica em "Trocar semente", a semente antiga do servidor é revelada, e você mesmo pode recalcular todas as rodadas jogadas com ela.
Como verificar uma rodada
- Antes de jogar, anote o compromisso da semente atual (hash da semente do servidor), a semente do cliente e o nonce.
- Jogue normalmente. Cada rodada tem um ID de rodada e aparece no seu histórico de apostas.
- Clique em "Trocar semente e revelar a antiga". A semente do servidor do par anterior é mostrada.
- Confira se o SHA-256 da semente do servidor revelada é igual ao compromisso que você viu antes de jogar. Se bater, o site não mudou o valor depois que você começou.
- Calcule o HMAC-SHA256 com a semente do servidor como chave e o formato de mensagem daquele jogo (tabela abaixo) e compare com o resultado da rodada.
- Ou clique em "Verificar" na página do jogo: o seu navegador recalcula tudo para você, sem confiar no resultado do servidor.
Formatos de mensagem usados por cada jogo
Os exemplos usam a semente do cliente clientSeed e o nonce 7; os seus valores reais aparecem na página do jogo. Os jogos que usam vários resumos contam a partir de 0.
| Jogo | Mensagem |
|---|---|
| HEADS OR TAILS | clientSeed:7 |
| DRAGON'S VAULT | clientSeed:7:vault:0 , clientSeed:7:vault:1 |
| DROP CHAIN | clientSeed:7:drop:0 , clientSeed:7:drop:1 , ... |
| COIN FOX | clientSeed:7:reels:0 , clientSeed:7:reels:1 , ... |
| ROYAL INGOTS | clientSeed:7:ingot:0 , clientSeed:7:ingot:1 , ... |
| GOLDEN KICK | clientSeed:7:kick:0 , ... , clientSeed:7:kick:3 |
| FOXBALL | clientSeed:7:fb:0 , ... , clientSeed:7:fb:7 |
Os sorteios do Royal Jackpot usam uma mensagem extra. No HEADS OR TAILS ela é clientSeed:7:jackpot, e os primeiros 6 bytes do resultado são o número que decide o jackpot.
A chave HMAC são os bytes da semente do servidor (hexadecimal: base 16, 64 caracteres). Cada jogo tem a sua própria regra para transformar o resultado em moedas, cartas ou um tabuleiro; veja o guia de cada jogo para os detalhes.
Código de exemplo: verificar o HEADS OR TAILS
O código abaixo roda no console do seu navegador. Ele confere o compromisso e o lançamento da moeda de uma rodada (mensagem clientSeed:nonce).
const hex = (s) => Uint8Array.from(s.match(/../g).map((h) => parseInt(h, 16)));
const toHex = (b) => [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, '0')).join('');
async function verifyCoin(serverSeed, serverHash, clientSeed, nonce, coins) {
const seed = hex(serverSeed);
const hashOk = toHex(await crypto.subtle.digest('SHA-256', seed)) === serverHash;
const key = await crypto.subtle.importKey('raw', seed, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
const digest = new Uint8Array(await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(clientSeed + ':' + nonce)));
let result = '';
for (let i = 0; i < coins; i++) result += digest[i] & 1 ? 'T' : 'H';
return { hashOk, result };
}IDs de rodada e a cadeia de hashes
Cada rodada tem um ID de rodada único e sequencial, como RI-0000001 para o ROYAL INGOTS com dinheiro real e DI- para a demo. Cada jogo tem o seu próprio prefixo, e o ID da rodada aparece na página do jogo e no seu histórico de apostas.
O banco de dados mantém uma cadeia de hashes de rodadas consecutivas: o hash de cada rodada inclui o hash da rodada anterior, o ID da rodada, o compromisso da semente, a semente do cliente, o nonce e o resultado. Se uma rodada fosse alterada ou inserida depois, a cadeia se quebraria e deixaria de bater com todas as rodadas seguintes.
ROYAL BACCARAT: cada carta travada
O bacará trava o sapato inteiro. Quando um sapato é aberto, as suas 416 cartas (8 baralhos) são embaralhadas e cada carta é travada com um compromisso SHA-512 do texto "position:card:salt". Quando uma carta é distribuída, o seu salt é revelado para que você confira se a carta distribuída bate com o que foi travado antes da primeira mão. Quando o sapato termina, a sua semente é revelada para que todo o embaralhamento possa ser conferido. Os detalhes estão no guia do ROYAL BACCARAT.
Limites que vale conhecer
Esse tipo de verificação prova que os resultados não foram alterados depois que você começou e foram calculados pelas regras publicadas. Ele não torna a próxima rodada previsível e não melhora as suas chances: cada rodada continua sendo aleatória.
A demo que os visitantes jogam sem se cadastrar cria a sua semente e calcula os resultados no seu próprio navegador, com o mesmo motor e as mesmas tabelas do jogo real. É um treino com pontos grátis: sem conta de dinheiro e sem jackpot.
Perguntas frequentes
O que é Provably Fair?
Uma forma de os jogadores conferirem que cada resultado foi decidido por valores travados antes da jogada: o site mostra primeiro um compromisso do seu segredo e revela o segredo depois, para que o resultado possa ser recalculado.
Preciso escrever código para verificar?
Não. Clique em "Verificar" na página do jogo e o seu navegador faz o trabalho. Se quiser conferir por conta própria, use os passos e o código de exemplo desta página.
Por que preciso trocar a semente antes de verificar?
A semente do servidor é um segredo. Se ela fosse revelada enquanto ainda está em uso, qualquer pessoa poderia saber os próximos resultados com antecedência, por isso ela só é revelada quando você troca para um novo par.