Sorteos verificablemente justos
Commit-and-reveal, anclaje en la blockchain EOS y cómo verificarlo.
Cada sorteo de Skincash se realiza con un esquema que cualquiera puede verificar de forma independiente después. Nadie en Skincash, ni siquiera el equipo, puede predecir ni sesgar el resultado.
Antes del sorteo: commit
Cuando creamos un sorteo, generamos un server seed aleatorio de 256 bits. No publicamos el seed en sí: publicamos solo su hash SHA-256. Ese hash es el commit y queda congelado en la base de datos en el momento en que el sorteo se abre. Como SHA-256 es unidireccional, conocer el hash no permite a nadie adivinar el seed.
Entropía externa: bloque EOS
En el momento del sorteo, nuestro worker cron consulta la blockchain de EOS por el último bloque irreversible y registra su hash de bloque. Los bloques de EOS se producen cada medio segundo por una red independiente, así que el hash de bloque en cualquier instante futuro es impredecible en el momento del commit. Esto significa que ni siquiera Skincash puede influir en el sorteo.
Reveal y sorteo
El ticket ganador se calcula como: winningTicket = (BigInt(sha256(serverSeed + publicSeed + eosBlockId)) mod BigInt(totalTickets)) + 1. Tras el sorteo, publicamos el server seed junto con el ID del bloque, el seed público y el total de tickets, para que cualquiera pueda reproducir el hash y confirmar el ticket ganador.
const crypto = require('crypto');
// Published data (visible on the giveaway card)
const serverSeed = '<revealed after draw>';
const publicSeed = '<published at draw>';
const eosBlockId = '<EOS block hash at draw time>';
const totalTickets = <total sold>;
const hash = crypto
.createHash('sha256')
.update(serverSeed + publicSeed + eosBlockId)
.digest('hex');
const winning =
(BigInt('0x' + hash) % BigInt(totalTickets)) + 1n;
console.log('Winning ticket:', winning.toString());Cómo verificarlo
En cualquier tarjeta de sorteo pasado, haz clic en Verificar imparcialidad. La ventana muestra las cuatro entradas, ejecuta un SHA-256 del lado del cliente para demostrar que el par commit-reveal es válido y proporciona un fragmento copiable que puedes ejecutar en Node o en una consola de navegador para reproducir el ticket ganador localmente.
Más en Confianza y seguridad
¿Aún necesitas ayuda?
Nuestro equipo de soporte en vivo está en línea 24/7 y responde en menos de 5 minutos. Abre un chat directamente desde la página y nosotros nos encargamos del resto.