Compromisso de baralho e privacidade

Nas mesas cash, o servidor publica um compromisso hash antes da mão. As sementes permanecem privadas, inclusive depois do encerramento: reconstruir o baralho revelaria cartas de quem deu fold ou escolheu MUCK. Não há revelação automática nem publicação posterior dessas sementes.

O que o compromisso permite conferir

O compromisso é SHA-256("serverSeed:clientSeed"). Ele registra um hash das sementes sem revelá-las. Sozinho, não permite reconstruir o baralho nem verificar publicamente uma mão completa. Também não comprova que as cartas distribuídas seguiram esse baralho ou que o compromisso foi recebido antes da distribuição.

O verificador manual abaixo compara dados fornecidos voluntariamente e reproduz um baralho de 52 cartas. Ele não se conecta a partidas, não busca sementes de mãos reais e não certifica a operação. A demonstração usa as sementes fictícias server e client.

O algoritmo, em detalhe

O embaralhamento é determinístico a partir das sementes e do nonce da mão:

  • Baralho inicial (52 cartas, ordem canônica): naipes para cada valor, na ordem dos valores 2 3 4 5 6 7 8 9 T J Q K A e dos naipes s h d c, ou seja 2s, 2h, 2d, 2c, 3s, …, As, Ah, Ad, Ac.
  • Keystream: blocos de 32 bytes de HMAC-SHA256(chave = serverSeed, mensagem = "clientSeed:nonce:counter"), com o counter começando em 0 e incrementando a cada bloco. Consumimos o keystream em pedaços de 4 bytes (uint32 big-endian).
  • Inteiro sem viés em [0, max]: amostragem por rejeição: range = max + 1, limit = floor(2³² / range) × range; sorteia uint32 até obter um valor < limit e devolve valor % range.
  • Fisher-Yates: para i de 51 até 1, sorteia j em [0, i] e troca as posições i e j.

O verificador abaixo é uma reimplementação fiel, byte a byte, do algoritmo do motor em packages/core-poker (src/rng.ts, src/deck.ts e src/verify.ts). Roda 100% no seu navegador usando crypto.subtle.

Verificador manual de sementes

Use o exemplo ou sementes de teste que você queira fornecer. O cálculo ocorre localmente no navegador; os valores não são enviados por esta ferramenta. Uma correspondência confirma apenas o hash informado, não a justiça de uma partida.