fair playengineeringprovably fair
Servidor autoritativo significa que el servidor guarda la única copia de la partida que cuenta. Tu dispositivo envía el movimiento que quieres jugar, el servidor lo comprueba contra sus propios dados y sus propias reglas, y solo entonces cambia el tablero. Una app modificada puede afirmar lo que quiera: la verdad vive en un sitio al que no llega.
El backgammon se gana esta disciplina. Es un juego de dados con una escalera y un bote, lo que significa que hay dos maneras de hacer trampa: falsear tus movimientos o torcer las tiradas. Un servidor justo tiene que cerrar las dos puertas. La segunda puerta nos incluye a nosotros, y llegaremos a ello.
¿Qué significa realmente servidor autoritativo?
Cada partida de Orion en directo existe en exactamente un lugar: en nuestro servidor. El tablero de tu móvil es una ventana, no el juego. Cuando arrastras una ficha, la app no la mueve. Envía un mensaje pequeño que dice: esto es lo que quiero jugar. El servidor reproduce esa intención contra su propio tablero, con su propio motor de reglas, usando los dados que tiró para ese turno. Los movimientos legales hacen avanzar la partida, y ambos jugadores reciben la misma posición nueva. Los movimientos ilegales nunca ocurrieron.
Es un servidor para todos. La app de iOS es SwiftUI nativo, la de Android es Jetpack Compose nativo, y ambas son ventanas al mismo backend y al mismo grupo de jugadores. Distinto cristal, la misma verdad.
¿Por qué los juegos que confían en el cliente sufren trampas?
Porque el dispositivo de tu rival pertenece a tu rival. Todo lo que corre en él puede cambiarse. Un cliente parcheado puede enviar movimientos que nunca fueron legales. Un editor de memoria puede reescribir un número en su sitio, y la pantalla mostrará fielmente la mentira. Nada de esto es exótico. Las herramientas son gratuitas, están documentadas y son más viejas que los smartphones.
Un juego que confía en el cliente pide a cada jugador que prometa no mirar bajo el capó. Algunos mirarán. Así que hicimos que la opinión del cliente fuera irrelevante. En Orion la app tiene exactamente tres tareas:
- Dibujar: el tablero, las fichas, el cubo, el reloj.
- Pedir: solicitar al servidor jugar un movimiento, ofrecer un doble, rendirse.
- Recibir: mostrar la posición que el servidor declara real.
Tirar los dados, juzgar la legalidad y mover una sola pieza no están en esa lista. Nada que decida un resultado nace en un dispositivo.
¿Qué pasa cuando juego un movimiento?
Tú juegas.. Tu app envía la intención: esta ficha, estas casillas. Nada en tu dispositivo altera el tablero real.
El servidor lo reproduce.. Nuestro motor de reglas ejecuta el movimiento contra el tablero del servidor y los dados del servidor. Si es legal, la partida avanza. Si no lo es, se rechaza en origen, venga de la app que venga.
Ambos lados reciben la misma verdad.. La nueva posición sale hacia los dos jugadores. Si se te cae la conexión, el margen de reconexión del reloj de turno guarda tu asiento, y vuelves al tablero tal como está de verdad, no como lo recordaba tu teléfono.
Las apuestas siguen la misma regla. Cuando empieza una partida con entrada, el servidor deposita en garantía las dos antes. El bote vive en un único libro de cuentas, en el servidor, y se liquida ahí cuando la partida termina. A ningún cliente se le pregunta nunca qué cree haber ganado. Las monedas y las gemas son virtuales, sin valor real y sin retirada de dinero, y aun así llevamos ese libro como si guardara algo precioso, porque lo guarda: tu confianza en el marcador.
¿Qué impide que el propio servidor haga trampa?
Esa es la pregunta correcta, y la mayoría de los juegos espera que no la hagas nunca. Un servidor que tira los dados en secreto podría tirarlos con amabilidad para quien favorezca, y tú nunca lo verías. Cada tirada parece plausible. Es lo que hacen los dados.
Así que nos quitamos ese poder a nosotros mismos. Antes de que empiece una partida, el servidor genera una semilla secreta y publica un compromiso SHA-256 sobre ella. Cada tirada se deriva después de esa semilla con HMAC-SHA256, una tirada cada vez, en orden. Cuando la partida termina, el servidor revela la semilla. Cualquiera puede comprobar que la semilla coincide con el compromiso hecho antes de la primera tirada, y que cada tirada de la partida se sigue de ella. En sentido criptográfico, tus dados quedaron fijados antes de que ninguno de los dos jugadores tocara una ficha. No podríamos torcer la tirada número doce sin romper la promesa que publicamos en la tirada cero.
No tienes que creernos en nada de esto. El verificador en orion.arthea.ai/verify recalcula la cadena entera en tu navegador, con Web Crypto, en tu máquina, a partir del registro público de la partida. Sin cuenta. Sin app.
¿Cómo encajan las dos mitades?
La autoridad del servidor y los dados commit-reveal son dos mitades de un mismo diseño, y cada una cubre el punto ciego de la otra. Un servidor que valida movimientos pero tira en secreto te pide confiar en la casa. Unos dados comprometidos en un servidor confiado te piden confiar en la app de cada desconocido. Juntos cierran el círculo. El cliente no puede falsear un movimiento, porque el servidor reproduce cada movimiento en origen. El servidor no puede amañar una tirada, porque cada tirada está encadenada a un compromiso publicado antes de la partida. Nadie en la mesa, incluidos quienes la construimos, tiene poder sin comprobar sobre el resultado.
El cliente no puede falsear un movimiento. El servidor no puede falsear una tirada. Todo lo demás es decoración.
La puerta en orion.arthea.ai/go lleva los enlaces del App Store y de Google Play y siempre muestra lo que está disponible ahora mismo. El verificador llegó primero, deliberadamente: la prueba de la equidad debe existir antes de que se juegue el primer bote de verdad.