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.
