TON Dice
Português
Jogar

Justiça comprovável

O resultado de cada jogada fica fixado antes da aposta e pode ser recalculado por qualquer um — não é preciso acreditar na nossa palavra.

Como funciona

Num cassino de verdade você vê a carta virar, o dado cair, a roleta girar. No jogo online isso acontece dentro de um programa — e é o programa que você tem de conferir.

Antes da aposta, o servidor publica o hash SHA-256 da sua semente secreta. Trocar a semente depois é impossível: o hash entregaria. Quando o par de sementes é trocado, a semente antiga do servidor é revelada — e toda rolagem feita com aquele par pode ser recalculada pela fórmula abaixo.

A taxa da casa é de 1%. O pagamento é aposta × 99 ÷ chance em porcentagem, ou seja, 99% do valor esperado voltam para o jogador. É a única coisa que diferencia o jogo de um cara ou coroa honesto; não há nenhuma outra retenção.

Sementes

O par de sementes é seu e nosso. A semente do servidor (server seed) nós geramos ao acaso e mostramos o hash dela na hora: a semente em si fica em segredo até a troca do par, senão as rolagens futuras seriam conhecidas de antemão. A semente do cliente (client seed) é você quem define, e sem ela não dá para calcular rolagem nenhuma — o resultado depende dos dois lados.

O terceiro ingrediente é o nonce, o número da aposta dentro do par atual. Ele sobe de um em um a cada jogada, então duas rolagens do mesmo par nunca partem dos mesmos dados de entrada.

Como o número é gerado

A semente do servidor, a semente do cliente e o nonce são combinados em um HMAC-SHA512. Os 128 caracteres hex que saem daí são lidos em janelas de cinco: o primeiro valor menor que 1 000 000 é reduzido módulo 10 000 — o que dá uma rolagem de 0 a 9999, isto é, de 0.00 a 99.99.

O limite de descarte existe por uma questão de justiça: uma janela de cinco caracteres hex dá números de até 1 048 575, e essa faixa não é múltipla de 10 000 — sem o descarte, os resultados baixos sairiam com mais frequência do que os altos. 1 000 000 é múltiplo, então todos os 10 000 resultados são igualmente prováveis. A chance de as 25 janelas serem descartadas é da ordem de 10⁻³³.

hex = HMAC_SHA512(key = serverSeed, msg = clientSeed + "-" + nonce)

Lemos o hex em janelas seguidas de 5 caracteres (0-4, 5-9, …):
primeiro valor < 1 000 000 → roll = valor % 10000
(se as 25 janelas forem descartadas — roll = 9999)

Menor: ganha se roll < target · Maior: ganha se roll > target
Pagamento = aposta × 9900 / chanceUnits (arredondado para baixo) · taxa de 1%

Código do motor

Exatamente o que calcula as rolagens no servidor, e exatamente o que as recalcula no seu navegador. Que os dois lados batem é garantido por um teste.

const WINDOW = 5;          // caracteres hex por janela: 20 bits, 0..1048575
const REJECT = 1_000_000;  // maior múltiplo de 10000 que cabe na janela

function roll(serverSeed, clientSeed, nonce) {
  const hex = createHmac("sha512", serverSeed)
    .update(`${clientSeed}-${nonce}`)
    .digest("hex");                        // 128 caracteres

  // janelas de 5 caracteres hex seguidos: 0-4, 5-9, ... 120-124
  for (let i = 0; i * WINDOW + WINDOW <= hex.length; i++) {
    const lucky = parseInt(hex.slice(i * WINDOW, i * WINDOW + WINDOW), 16);
    if (lucky < REJECT) return lucky % 10000;   // 0..9999
  }
  // as 25 janelas foram descartadas (probabilidade ~1e-33)
  return 9999;
}

// pagamento: taxa de 1%, arredondado para baixo
const payout = (amount, chanceUnits) => amount * 9900n / BigInt(chanceUnits);

Como conferir a sua jogada

No mini app: Justiça na barra de baixo, ou «Verificar a jogada» no card de qualquer aposta.

  1. Aba «Sementes» — aqui está o hash da semente do servidor em uso. Ele foi fixado antes das suas apostas.
  2. Troque o par de sementes. A semente anterior do servidor é revelada; a sua semente do cliente continua sendo sua.
  3. Aba «Reveladas» — a semente revelada fica ao lado do hash dela. Confira: o SHA-256 da semente tem de bater com o que era mostrado antes das apostas.
  4. Aba «Verificar» — cole a semente do servidor, a semente do cliente e o nonce da aposta em questão. A rolagem é recalculada ali mesmo no seu navegador e comparada com o resultado da jogada.

O cálculo roda no seu aparelho e não passa pelo nosso servidor. Com a fórmula acima dá para repetir a conta em qualquer linguagem — HMAC-SHA512 existe em todas.