Documentación técnica

Cómo funciona el sorteo verificable

Descripción del algoritmo provably-fair, el modelo de amenazas y el procedimiento de verificación independiente.

1. Compromiso previo (commit)

Antes de cada sorteo, el sistema genera una semilla del servidor con un generador criptográficamente seguro (CSPRNG, secrets.token_hex) y publica su compromiso: SHA-256(server_seed). Esto fija la semilla sin revelarla, impidiendo que se altere después.

2. Derivación del resultado (provably-fair)

El resultado se deriva de forma determinística combinando tres entradas:

HMAC-SHA256(server_seed, "{client_seed}:{nonce}:{contador}")

La semilla del cliente aporta entropía que el operador no controla, y el nonce hace único cada sorteo. El flujo de bytes resultante se convierte en números con muestreo por rechazo (rejection sampling) para evitar sesgo de módulo, garantizando uniformidad.

3. Revelación y verificación

Tras el sorteo se revela la semilla del servidor. Cualquiera puede: (a) comprobar que SHA-256(server_seed) coincide con el compromiso publicado; (b) recomputar el resultado con (server_seed, client_seed, nonce). Si todo coincide, el sorteo es auténtico e inalterado. Usa el portal de verificación.

4. Bitácora inmutable (hash encadenado)

Cada sorteo se registra en una cadena donde record_hash = SHA-256(prev_hash + json_canónico(record)). Modificar cualquier registro rompe todos los hashes siguientes, haciendo la manipulación detectable. Consulta la bitácora.

5. Acta y paquete de auditoría

Cada sorteo genera un acta PDF y un paquete ZIP de auditoría que incluye el acta, el sorteo en JSON canónico, la prueba de cadena y un instructivo de verificación independiente.

6. Roles y control de acceso

Administrador: gestiona usuarios, juegos y sorteos. Operador: crea, ejecuta y revela sorteos. Auditor/Veedor: acceso de solo lectura. El sitio público y la verificación son abiertos; las operaciones requieren autenticación (JWT) y rol autorizado. Los estados del sorteo siguen una máquina estricta: comprometido → ejecutado → revelado, sin reversa.