Documentación

El contrato: cómo y por qué funciona

Todos los fondos y todas las reglas de FAIRDRUM están en un único programa de la red Solana: un contrato inteligente. El sitio solo le envía comandos y muestra la respuesta. A continuación: qué guarda el contrato, qué comandos entiende, cómo se obtiene el resultado a partir del número aleatorio y qué puede y qué no puede hacer el administrador.

Qué es el contrato y dónde está

Un contrato inteligente es un programa que ejecutan los nodos de la red Solana, no el servidor del proyecto. Su código es el mismo para todos y cada acción es una transacción pública. El contrato de FAIRDRUM está escrito en Rust con la biblioteca Anchor; su código fuente es abierto.

La dirección del programa aparecerá aquí cuando el sitio esté conectado al contrato.

Una consecuencia importante: si el sitio fairdrum.to desaparece, los fondos de los jugadores seguirán en el contrato y podrán retirarse con cualquier programa capaz de enviar el comando de retiro con la firma de su billetera.

Qué guarda el contrato

  • El depósito. Una sola cuenta en SOL envuelto de la que solo dispone el propio programa. En ella está todo: los saldos de los jugadores, el banco de premios, los jackpots, la reserva y la parte del administrador que aún no se ha retirado.
  • La cuenta común del juego. Un registro de cómo se reparte el importe del depósito: banco de premios, jackpot, minijackpot, superjackpot, reserva de fondos iniciales, parte del administrador, importes iniciales de los jackpots y contadores de rondas por juego.
  • La cuenta del jugador. La crea el comando register, que el sitio envía junto con la primera recarga, y está vinculada a la dirección de la billetera: saldo de juego, hora de la última recarga, ronda sin terminar y parte del jackpot pendiente de pago.
  • La cuenta de sesión (si está activado el «juego sin firmas»): una clave temporal, un plazo y un límite de apuestas.

La contabilidad está hecha de modo que la suma de todos los saldos y botes sea igual al importe del depósito. Una prueba comprueba esa igualdad después de cada una de decenas de miles de operaciones aleatorias.

Qué comandos entiende el contrato

ComandoQuién puede llamarloQué hace
registerjugadorCrea la cuenta del jugador. El sitio lo envía junto con la primera recarga.
depositjugadorRecarga del saldo de juego. Guarda la hora: desde ella se cuentan las 12 horas hasta el retiro.
withdrawjugadorRetiro a la billetera propia. Se rechaza mientras no hayan pasado 12 horas desde la última recarga.
spin_commitel jugador o su clave de sesiónApuesta: descuenta la ronda del saldo, guarda el juego y las probabilidades vigentes y pide un número aleatorio al oráculo.
spin_settlecualquieraLiquidación: lee el número del oráculo, calcula el pago y lo acredita al jugador. Puede llamarlo cualquiera; el resultado no depende de ello.
spin_expirecualquieraCierra una ronda que no se liquidó en 20 minutos. Si el oráculo no respondió, la apuesta se devuelve íntegra al jugador. Si el oráculo respondió y la ronda está sellada, paga los premios habituales sin sorteo de jackpots.
spin_sealcualquieraSella la ronda: registra el hash del bloque de la apuesta mientras está disponible (unos 3,5 minutos). Solo hace falta si el oráculo tarda más en responder; normalmente la llama el servicio vigilante. Una ronda que no se liquidó ni se selló a tiempo se cierra sin resultado.
skip_noncejugadorDesplaza el número de la siguiente solicitud de aleatoriedad si la dirección de la solicitud resulta estar ocupada.
session_open / session_closejugadorPermite que una clave temporal haga apuestas dentro de un plazo y un límite; la clave no puede ni retirar ni recargar.
donatecualquieraAporta SOL a la reserva de fondos iniciales de los jackpots. No existe el comando inverso.
set_jackpot_startsadministradorFija nuevos importes iniciales del jackpot y del superjackpot; entran en vigor al cabo de 24 horas.
rescale_poolsadministradorTraslada parte de la reserva de fondos iniciales al banco de premios de los juegos. Solo en ese sentido; no se puede trasladar a los jackpots: estos se reponen solos desde la reserva, después de un premio.
set_pausedadministradorSuspende o reanuda la aceptación de nuevas apuestas, por si falla el oráculo. Las apuestas ya realizadas se liquidan, y los pagos y el retiro funcionan como de costumbre.
set_guardian / guard_pauseadministradorEl administrador designa un guardián: una clave del servicio vigilante que solo puede hacer una cosa: suspender la aceptación de nuevas apuestas si el oráculo ha dejado de responder. Solo el administrador puede levantar la pausa.
propose_dev_authority / accept_dev_authorityadministradorTraspaso de los derechos de administrador a otra clave en dos pasos: la clave actual designa la nueva y la nueva lo confirma por sí misma.
roll_epoch / checkincualquieraDe servicio: actualizan la estadística semanal y la marca del día. No mueven fondos.
claim_devadministradorRetira la parte acumulada del administrador, y solo esa.
initialize / fund_poolsadministradorPuesta en marcha única. initialize crea las cuentas (firma el titular de la autoridad de actualización del programa); fund_pools anota una sola vez el banco inicial aportado, repartido por botes, y el excedente por encima de él en una línea aparte que el administrador puede retirar con el comando promo_pay.

En el código no hay ningún comando que transfiera al administrador el banco de premios, los jackpots o los saldos de los jugadores.

La ronda paso a paso

  1. Apuesta. El comando spin_commit descuenta la ronda de su saldo y, en la misma transacción, crea en el oráculo ORAO una solicitud de número aleatorio. La dirección de la solicitud se calcula a partir de su billetera y del número de ronda, por lo que no es posible colar una solicitud ajena.
  2. Número. Varios nodos independientes de ORAO firman el número aleatorio y lo escriben en la red. Hasta ese momento nadie lo conoce: ni usted, ni el proyecto, ni un nodo por separado.
  3. Liquidación. El comando spin_settle lee el número del registro del oráculo, comprueba que es la solicitud de su ronda y calcula el pago. El sitio lo envía por su cuenta; si la página está cerrada, lo hará el programa de guardia del proyecto o usted en su próxima visita.
  4. Presentación. Cartas, minas, cohete, gemas: son una forma de mostrar un pago ya calculado. Las pulsaciones en el juego no influyen en él.

Por qué el resultado no se puede conocer de antemano ni falsear. El número final de la ronda es el número del oráculo mezclado con el hash del bloque en el que queda registrada la apuesta. En el momento de la apuesta ese hash aún no existe, y el número del oráculo llega después y de un tercero: nadie puede calcular el resultado de antemano, ni el jugador, ni el proyecto, ni el propio oráculo. El juego, los importes iniciales de los jackpots y el tope del premio se registran en el momento de la apuesta, y la fórmula de liquidación está en código abierto. Una liquidación tardía nunca es más ventajosa que una hecha a tiempo. Las reglas solo se pueden cambiar sustituyendo el código del programa, y eso lo ve todo el mundo (véase la sección sobre el administrador).

Cómo se obtiene el resultado a partir de un número aleatorio

Una ronda son de 1 a 100 apuestas de 0,01 SOL (hasta 1000 en la rueda). El número del oráculo se despliega en un valor aleatorio independiente para cada apuesta, y para cada una el contrato responde por orden a estas preguntas:

  1. ¿Superjackpot, jackpot, minijackpot? La probabilidad de cada bote es igual a la aportación de la apuesta a ese bote dividida entre su importe inicial. Un bote solo se sortea cuando contiene al menos el 25% de su importe inicial.
  2. ¿Premio del juego? Cada juego tiene su propia probabilidad de premio y su propia tabla de seis niveles con pesos. Por ejemplo, en la rueda sale premio en el 10% de las apuestas. Las tablas de todos los juegos se muestran en sus páginas.
  3. ¿«Girar otra vez»? Con una probabilidad del 11,6% la apuesta se repite gratis a cargo del banco de premios.
  4. Si no, la apuesta queda sin premio. Se reparte igual que cualquier otra: banco de premios, jackpots y parte del administrador.

Las tablas de los juegos son distintas, pero el pago esperado es el mismo en todas (con una precisión de centésimas de punto porcentual; con un banco de premios de 40 SOL o más, cuando los premios no chocan con el tope): cerca del 77,5% de la apuesta en premios normales y, junto con las repeticiones «Girar otra vez», cerca del 88% de las apuestas pagadas. La igualdad la comprueba el compilador: si el valor esperado de algún juego resulta mayor que el de la rueda, o menor en más de medio punto porcentual, el programa no compila.

Dónde pone el contrato cada apuesta

DestinoParte de la apuesta pagadaPara qué
Banco de premios≈88%premios normales de todos los juegos
Jackpot, minijackpot, superjackpot y fondo inicial2%tres botes comunes
Administrador10%ingreso del proyecto; no hay otro

En el código las partes están escritas sobre cada apuesta ejecutada, incluidas las repeticiones gratis, por eso allí figuran 8,84% y 1,77%: en términos de apuestas pagadas equivalen de media al 10% y al 2%.

Las reglas que ponen límites y para qué sirven

  • Un premio no supera la cuarta parte del banco de premios. El contrato no puede prometer más de lo que tiene, y un gran premio no vacía el banco para los demás. Lo que no se paga se queda en el banco.
  • Retiro 12 horas después de la última recarga. La regla es igual para todos y está escrita como constante: solo puede cambiarse con una nueva versión del programa.
  • Los importes iniciales de los jackpots cambian con un retraso de 24 horas. Las probabilidades de la ronda se fijan en el momento de la apuesta, por lo que no pueden cambiarse «a la medida de una apuesta ya hecha».
  • 20 minutos para la liquidación. Si el oráculo no ha respondido, la apuesta se devuelve íntegra al jugador: mientras no hay número, nadie conoce el resultado, así que no es posible librarse así de una pérdida. Si respondió pero la liquidación llegó tarde, se pagan los premios habituales y los jackpots no se sortean en esa ronda. Protección del depósito. Antes de cada pago y después de cada liquidación, el contrato comprueba que en el depósito no haya menos de lo que debe a los jugadores y a los botes; de lo contrario, la operación se rechaza. Guardián. Si el oráculo ha dejado de responder, la aceptación de nuevas apuestas se suspende automáticamente; las liquidaciones y el retiro siguen funcionando.
  • El jackpot se paga por partes: al ganador le corresponde el 95% del bote, del cual el 20% de inmediato y un 8% por semana. La parte pendiente queda anotada en la cuenta del ganador.
  • Una sola ronda sin terminar por jugador. Mientras la ronda no esté liquidada, no se acepta una nueva apuesta.

Qué puede y qué no puede hacer el administrador

Puede

  • retirar su parte: el 10% de las apuestas pagadas;
  • aportar SOL a la reserva y pasarlos de la reserva al banco de premios;
  • retirar el excedente que quedó en el depósito en la puesta en marcha por encima del banco inicial;
  • cambiar los importes iniciales de los jackpots, con retraso y dentro de los límites fijados;
  • suspender la aceptación de nuevas apuestas si el oráculo no responde, y traspasar sus derechos a otra clave.

No puede

  • retirar el banco de premios, los jackpots, la reserva o los saldos de los jugadores (como jugador gana en las mismas condiciones que todos);
  • cambiar las tablas de premios, la probabilidad de premio de los juegos ni las partes de la apuesta: son constantes del código;
  • conocer el número aleatorio de la ronda antes de la apuesta ni elegirlo;
  • detener la liquidación de las apuestas realizadas o el retiro: la pausa solo afecta a las nuevas apuestas.

Una salvedad honesta. El programa tiene una autoridad de actualización: mientras no se revoque, su titular puede sustituir el código por una versión nueva, y entonces todo lo dicho arriba se referirá ya al código nuevo. El estado de esa autoridad y cada actualización se ven en un explorador de Solana. No hay auditoría independiente del contrato.

Cómo se ha probado

  • Pruebas del contrato: parte del administrador del 10% en cada juego, retorno muy parecido de todos los juegos con un banco de 50 SOL, la regla de la cuarta parte del banco y el tope del premio en el momento de la apuesta, el bloqueo del retiro, el cambio diferido de los importes iniciales, y que una liquidación tardía no es más ventajosa que una hecha a tiempo.
  • Prueba de conservación de los fondos: decenas de miles de operaciones aleatorias; tras cada una, el importe del depósito se coteja con la suma de los saldos y los botes.
  • Simulaciones largas: dos millones de apuestas en cada juego; cuánto se pagó a los jugadores y cuánto recibió el administrador.
  • Transacciones reales en un nodo local de Solana: recarga, retiro denegado antes de plazo, aportación a la reserva, cambio de los importes iniciales.
  • Pruebas del sitio: el sitio calcula las probabilidades con las mismas fórmulas que el contrato y se coteja con muestras registradas por el contrato.

Lo que no se ha probado ni se ha hecho figura, sin adornos, en la página «Por qué FAIRDRUM». Cómo comprobar cualquier ronda por su cuenta, en la página «Comprobar una ronda».

Los parámetros del contrato en una tabla

Apuesta unitaria
0,01 SOL
Ronda
hasta 100 apuestas en los juegos, hasta 1000 en la rueda
Juegos (modos)
16
Probabilidad de «Girar otra vez»
11,6%
Tope de un premio
1/4 del banco de premios
Importe inicial mínimo
jackpot 0,2 SOL, superjackpot 2 SOL
Minijackpot
empieza en 1/10 del jackpot
Al ganador del jackpot
95% · el 5% va al superjackpot
Al ganador del superjackpot
90%
Bloqueo del retiro
12 horas después de la última recarga
Plazo de liquidación de la ronda
3000 slots de la red, unos 20 minutos
Comisión de red y oráculo
0,005 SOL por ronda; no la cobra el proyecto