La lista se congela y le sacamos la huella
Cuando importamos los comentarios aplicamos tus reglas: fecha de cierre, cuentas excluidas, etiquetas y si cuenta una chance por persona o una por comentario. Con lo que queda armamos la lista canónica: una línea por participación, con el número de comentario y el usuario, ordenadas por número de comentario. Solo datos públicos, nunca el texto del comentario.
Después le sacamos la huella con SHA-256, una función que convierte cualquier texto en 64 caracteres. Funciona como una huella digital: la misma lista da siempre la misma huella, y si cambia aunque sea una letra sale otra completamente distinta. En la práctica, nadie puede armar otra lista que dé la misma huella.
Huella SHA-256
ce791f6efe6fa1e0cbc56276474e52f2a92c61dd41f26f3838eaabdd96b7ce68
Es la huella de la lista original.
Por eso, una vez sellada, a la lista no se le puede sumar ni sacar a nadie sin que se note.
Nos comprometemos con un número que todavía no existe
Cuando tocás Sortear, Trompi registra el compromiso: la huella de la lista, la huella de las reglas y el número de una ronda futura de drand, la que sale dos rondas después de la última publicada. drand publica una ronda cada 3 segundos, así que llega entre 3 y 6 segundos después.
Todo el truco está en ese orden. Al comprometernos, el número al azar de esa ronda todavía no existe: no lo conoce nadie, ni vos, ni nosotros, ni drand. Y cuando sale, la lista y las reglas ya no se pueden tocar.
Tampoco hay revancha: el sorteo solo se puede terminar con la ronda comprometida. No se puede tirar de nuevo hasta que salga quien a uno le guste.
- #NYa salióTodos la conocen
- #N+1La próximaEn menos de 3 s
- #N+2La de tu sorteoEntre 3 y 6 s
Cuando tocás Sortear se fija la ronda N+2: todavía no existe y sale entre 3 y 6 segundos después.
¿Y por qué no usar la ronda que ya salió? Porque ya sería conocida: se podría mirar el resultado antes de sortear y elegir cuándo hacerlo.
¿Qué es drand?
drand (de distributed randomness, azar distribuido) es un faro de aleatoriedad pública: una red que publica un número al azar nuevo cada 3 segundos, gratis y para cualquiera. Trompi usa su red quicknet.
La mantiene la League of Entropy, la Liga de la Entropía: universidades, empresas y organizaciones de distintos países, cada una con sus propios servidores. Ninguna tiene la clave completa.
Funciona con firmas de umbral BLS. La clave secreta de la red está repartida en pedazos entre los miembros y nunca estuvo entera en ningún lado. En cada ronda, cada miembro firma el número de ronda con su pedazo, y recién cuando se juntan suficientes firmas parciales (el umbral) se arma la firma completa. El número al azar es el SHA-256 de esa firma.
Por eso nadie lo puede predecir ni elegir. Para conocerlo antes haría falta que se pongan de acuerdo más miembros que el umbral, y ni así podrían cambiarlo: para cada ronda hay una sola firma válida, así que hay un solo número posible.
Y cualquiera lo puede comprobar: con la clave pública de la red se verifica que la firma de la ronda es auténtica. La página de cada sorteo lo hace en tu navegador.
Cada miembro de la League of Entropy firma el número de ronda con su pedazo de la clave.
Con suficientes firmas parciales (el umbral) se arma la firma BLS de la ronda. Hay una sola posible.
El SHA-256 de esa firma es el número al azar de la ronda.
Los valores son de ejemplo. Los de cada sorteo están en su página pública.
La semilla: una receta con tres ingredientes
Con la ronda ya publicada juntamos tres cosas: la huella de la lista, el número al azar de drand y el código del sorteo, el TS-… que ves en el resultado. Las unimos con una barra vertical y les sacamos otro SHA-256: esa es la semilla.
Cada ingrediente tiene su porqué. La huella ata el resultado a esa lista exacta. El azar de drand pone lo que nadie puede prever. Y el código hace que dos sorteos con la misma lista y la misma ronda no tengan la misma semilla.
La semilla es el SHA-256 de la huella de la lista, el azar de drand y el código del sorteo, unidos con una barra vertical.
Del número a los ganadores, sin trampa
De la semilla sale una tira de números al azar con HMAC-SHA256: la semilla hace de clave y le pasamos un contador, 0, 1, 2… Cada vuelta da un número nuevo, y la misma semilla da siempre la misma tira.
Con esos números barajamos la lista con Fisher–Yates, el método clásico para mezclar: en cada paso sale al azar alguien de los que todavía no salieron y pasa adelante. Es parcial: solo barajamos hasta tener a las personas que hacen falta.
Dos detalles hacen que sea parejo de verdad. No hay sesgo: si un número cae en la parte que no se puede repartir en partes iguales entre los que quedan, se descarta y se usa el siguiente (se llama muestreo por rechazo). Y nadie gana dos lugares: si con una chance por comentario alguien vuelve a salir, se lo saltea.
Las primeras personas del orden son las ganadoras, en ese orden. Las que siguen quedan en la fila, por si hay que reemplazar a alguien.
- Azar de ejemplo · ronda 1
- fcc0…206b
- Semilla
- 7c71…b71c
- 1@tomas.agGana
- 2@nico.correGana
- 3@pato.matesGana
- 4@sol.dibujaEn la fila
- 5@fer.cocinaEn la fila
- 6@abu.tejeEn la fila
- 7@juli.fotosEn la fila
- 8@vale.moralesEn la fila
Ronda de ejemplo 1: ganan @tomas.ag, @nico.corre, @pato.mates.
Ocho personas inventadas, tres ganadores y el mismo algoritmo de los sorteos de verdad. Con la misma ronda el orden sale siempre igual; con otra, cambia todo.
Lo controlamos con pruebas: una implementación independiente, escrita en Python, tiene que dar exactamente los mismos resultados que la nuestra, y simulamos 100.000 sorteos para medir que cada persona tenga la misma chance. Además, el código del sorteo tiene prohibido usar el azar de la computadora o la hora: el único azar es la semilla.
La animación es puro show
Los nombres que giran en pantalla no deciden nada. Cuando la animación arranca, el resultado ya está calculado y guardado: solo te lo cuenta con suspenso, del último puesto al primero.
Por eso la podés saltear o volver a ver las veces que quieras. Siempre salen los mismos ganadores, en el mismo orden.
Trompi festeja igual cada vez que la mirás: el final ya estaba escrito.
Si un ganador no cumple, entra el que sigue en la fila
Durante las 24 horas que siguen al sorteo, quien organiza puede marcar a un ganador que no cumplió los requisitos. No se sortea de nuevo ni se usa azar nuevo: entra la próxima persona del mismo orden del sorteo. Va al último lugar, y los que venían detrás suben uno.
Así nadie elige quién entra, ni quien organiza ni nosotros. Cada cambio queda en un registro público: cada entrada se encadena a la anterior con SHA-256, empezando por la semilla, y la página del sorteo comprueba que el registro esté completo y lleve a los ganadores de hoy.
- 1@tomas.ag
- 2@nico.corre
- 3@pato.mates
Siguen en la fila: @sol.dibuja, @fer.cocina…
Qué podés comprobar vos
Cada sorteo tiene su página pública: entrás a Verificar sorteo con su código. Sin cuenta, y en tu propio navegador, con el mismo código del sorteo que usa Trompi, se comprueba que:
- las reglas son las que se fijaron en el compromiso;
- el compromiso se registró antes de que saliera la ronda de drand, y se usó esa misma ronda;
- la firma BLS de la ronda es válida para la clave pública de drand;
- la semilla sale de la huella, el azar y el código;
- el registro de reemplazos está completo, encadenado a la semilla, y lleva a los ganadores de hoy.
Si preferís la terminal, el mismo chequeo está en una herramienta de línea de comandos:
npx @trompisorteos/verify TS-7Q2KXY desde la página del sorteo podés abrir la ronda directamente en drand, para ver con tus propios ojos que el número es el mismo.
Verificar un sorteoLo que no se puede comprobar desde afuera
Te lo decimos de frente: la lista de participantes no es pública, para cuidar los datos de quienes participaron. Y se borra 24 horas después del sorteo, cuando se cierra el plazo para reemplazar ganadores.
Por eso la verificación pública es parcial: se puede comprobar todo lo anterior, pero no recalcular desde afuera quién salió de la lista. Lo que queda para siempre es la huella, los ganadores y el registro de reemplazos.
Preferimos contarte el límite a venderte una transparencia total que no es.