Demostrablemente justo

Dados en los que no hace falta creernos

Antes de que empiece una partida fijamos un número secreto y publicamos su huella. Cuando termina, publicamos el número. Entre esos dos momentos cada dado ya está decidido — y después cualquiera puede recalcularlos todos y comprobar que nada se movió.

Abrir el registro

La parte que un buen generador aleatorio no arregla

Nuestros dados vienen del generador criptográfico del sistema operativo — la misma fuente que protege el acceso a un banco, no el atajo que usan casi todos los juegos. Eso resuelve cuán aleatorios son los números. No resuelve nada de la pregunta que los jugadores hacen de verdad.

Un dado sacado con honestidad y un dado elegido a propósito se ven idénticos después. Ambos son solo un número en un registro.

Así que la pregunta útil no es «¿es bueno vuestro generador?» sino «¿puedo comprobarlo?». Todo lo que sigue existe para que esa respuesta sea sí, sin pedirte que creas una sola palabra nuestra.

Sellado antes, abierto después

Cuatro pasos. Dos puedes hacerlos tú, y son justo los dos que nos delatarían.

  1. 1

    Sellar

    Antes de la primera tirada el servidor saca un número secreto de 32 bytes — la semilla del servidor — y publica su huella SHA-256 a ambos jugadores. La huella no revela nada, pero la semilla ya está fijada: cualquier otra daría una huella distinta.

    commit0df0916cb0…2904e706
  2. 2

    Mezclar

    Tu aplicación genera su propia semilla aleatoria y la envía al sentarte a la mesa. Las semillas de ambos jugadores entran en cada dado, así que no podemos buscar de antemano una semilla cuyas tiradas nos convengan: en el momento de comprometernos no sabemos qué vas a aportar.

    clientSeeda26460084a0ef89b:d4f28bac6efd1b6e
  3. 3

    Derivar

    Cada dado se lee de un HMAC-SHA256 de las semillas y el número de tirada. Nada se guarda y nada se elige: las mismas tres entradas dan siempre el mismo dado, y ninguna otra entrada lo da.

    die(n) = (HMAC-SHA256(serverSeed, "clientSeed:n:round")[0] < 252) % 6 + 1
  4. 4

    Abrir

    Al terminar la partida publicamos la semilla del servidor. Hashéala, compárala con la huella que recibiste antes de la primera tirada y recalcula cada dado. Un servidor que hubiera elegido una sola tirada falla una de esas dos comprobaciones.

    serverSeed5cde3365be…7b6b2bd5

Los valores de arriba son la prueba real de la partida n.º 148, una partida terminada que cualquiera puede consultar. Pon ese número en la caja de abajo y míralo salir bien.

Comprueba una partida — aquí, ahora

Escribe un número de partida. La página busca su prueba, vuelve a hashear la semilla y recalcula cada dado con la criptografía de tu propio navegador.

El cálculo ocurre en tu dispositivo. Nada de lo que escribes se nos envía, y ninguna marca de esta página es un valor que hayamos transmitido — si lo fuera, te estaríamos pidiendo que confíes en nosotros sobre si puedes confiar en nosotros.
O pega tú mismo los tres valores

Por qué ninguna cara es ni un poco más probable

Un byte es un número de 0 a 255 — 256 posibilidades. 256 no es múltiplo de seis; es 6 × 42 y sobran 4. Si tomas el resto de dividir el byte entre seis, cuatro caras se llevan calladamente 43 oportunidades de 256 y las otras dos, 42. Es un sesgo diminuto, y en un millón de tiradas es una ventaja real. Por eso esos cuatro valores se descartan.

252 = 6 × 42. Cada cara recibe exactamente los mismos bytes, así que cada cara es exactamente una de seis.

Dónde se acaba la prueba

Dos tipos de dados en este sitio no están cubiertos por la cadena. Se enumeran aquí en lugar de omitirse, porque una afirmación de justicia con un agujero silencioso vale menos que ninguna afirmación.

  • TelegramDados tirados en el chat del botSi tiras con la animación de dados del propio Telegram, ese número viene de Telegram y no de nosotros; ninguna semilla nuestra lo reproduce. La prueba publicada indica exactamente qué posiciones fueron así, y el registro pone allí el símbolo de Telegram en lugar de una cara. Para una partida totalmente comprobable, tira en la aplicación.
  • PrácticaPartidas contra el ordenadorLa partida de práctica sin conexión tira en tu propio dispositivo, sin semilla y sin prueba. No hay rival ni apuesta, así que no hay nada que demostrar ni nada en juego.

Todo lo demás — 1v1 en línea, salas con amigos y torneos, gratis o con apuesta — funciona sobre la cadena descrita arriba.

La misma comprobación, sin esta página

Doce líneas y ninguna biblioteca. Pégalas en la consola de cualquier navegador junto con los tres valores de una partida y te dirán exactamente lo mismo que esta página — para eso se publica el método y no solo el resultado.

JavaScript
const enc = new TextEncoder();
const hex = (b) => [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, '0')).join('');

// 1. the seed we revealed must hash to the commitment you were given first
const commitOk = hex(await crypto.subtle.digest('SHA-256', enc.encode(serverSeed))) === commit;

// 2. every die, re-derived from that seed
const key = await crypto.subtle.importKey(
  'raw', enc.encode(serverSeed), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);

async function die(n) {
  for (let round = 0; round < 16; round++) {
    const mac = new Uint8Array(
      await crypto.subtle.sign('HMAC', key, enc.encode(`${clientSeed}:${n}:${round}`)));
    for (const b of mac) if (b < 252) return (b % 6) + 1;
  }
}

Cada prueba es pública en /fair/<id> — sin clave, sin cuenta, sin nombres de jugadores y sin importes. Solo los dados.

Preguntas que la gente hace de verdad

He perdido cuatro partidas seguidas. ¿Los dados están en mi contra?

No pueden estarlo. Cada dado de una partida terminada quedó fijado antes de que empezara, por una semilla comprometida de antemano, y puedes recalcularlos todos arriba. Las rachas se sienten dirigidas y no lo son: con dos dados, que un rival tire mejor que tú cuatro partidas seguidas pasa mucho más a menudo de lo que la gente cree.

¿Podría el servidor elegir una tirada en el momento clave?

Tendría que romper una de dos comprobaciones. O publica una semilla que no hashea a la huella que te dio antes de la partida — algo que ve cualquiera — o publica la real, y entonces los dados que produce son los que jugaste y no había nada que elegir.

¿Y si mi aplicación nunca envió su propia semilla?

Se genera una aleatoria en su lugar, para que la cadena siempre esté bien formada. Eso solo debilita tu aportación; el compromiso y todas las comprobaciones de arriba siguen en pie.

¿Una semilla revelada afecta a mi siguiente partida?

No. Para cada partida, incluida la revancha, se saca una semilla nueva y se publica una huella nueva. Una semilla ya publicada no decide nunca otra tirada.

¿Por qué algunos dados llevan el símbolo de Telegram?

Esos se tiraron con la animación de dados de Telegram en el chat del bot, así que vinieron de Telegram y ninguna semilla nuestra los reproduce. Se marcan en vez de ocultarse, y el número que nuestra cadena habría dado en esa posición no se muestra a propósito — no es el dado que nadie tiró.

Abre Telegram para confirmar que eres tú. Nunca vemos tu contraseña.

Jugar como invitado

Al continuar aceptas los Términos y confirmas que tienes 18 años o más.
TérminosPrivacidadJuego responsable