La aleatoriedad en las blockchains de Proof of Stake (prueba de participación) es importante para una distribución justa e impredecible de las responsabilidades del validador. Las computadoras son malas para los números aleatorios porque son dispositivos deterministas (la misma entrada siempre produce la misma salida). Lo que la gente suele llamar números aleatorios en una computadora (como en una aplicación de juegos), son pseudo-aleatorios – es decir, dependen de una seed (semilla) suficientemente aleatoria proporcionada por el usuario u otro tipo de oráculo, como una estación meteorológica para el ruido atmosférico, su ritmo cardíaco, o incluso lámparas de lava, a partir de la cual puede generar una serie de números aparentemente aleatorios. Pero dada la misma semilla, siempre se generará la misma secuencia.
Sin embargo, estas entradas variarán en función del tiempo y el espacio, y sería imposible obtener el mismo resultado en todos los nodos de una determinada blockchain en todo el mundo. Si los nodos obtienen entradas diferentes para construir bloques, se producen bifurcaciones. La entropía del mundo real no es adecuada para utilizarla como semilla para la aleatoriedad de la blockchain.
Hay dos enfoques principales para la aleatoriedad de la blockchain en producción hoy en día: RANDAO
y VRF
.
Polkadot utiliza VRF.
VRF #
Una función aleatoria verificable (VRF) es una operación matemática que toma alguna entrada y produce un número aleatorio junto con una prueba de autenticidad de que este número aleatorio fue generado por el remitente. La prueba puede ser verificada por cualquier aspirante para asegurarse de que la generación del número aleatorio es válida.
El VRF utilizado en Polkadot es aproximadamente el mismo que el utilizado en Ouroboros Praos. La aleatoriedad de Ouroboros es segura para la producción de bloques y funciona bien para BABE. En lo que difieren es en que el VRF de Polkadot no depende de un reloj central (el problema viene a ser -¿el reloj central de quién?), más bien, depende de sus propios resultados pasados para determinar los resultados presentes y futuros, y utiliza los números de los slot como emulador del reloj, estimando el tiempo.
Así es como funciona en detalle: #
Los slots son unidades discretas de tiempo de seis segundos de duración. Cada slot puede contener un bloque, pero puede que no. Los slots forman épocas – en Polkadot, 2400 slots forman una época, lo que hace que las épocas duren cuatro horas.
En cada slot, cada validador “tira un dado”. Ejecutan una función (el VRF) que toma como entrada lo siguiente:
- La “clave secreta”, una clave hecha específicamente para estas tiradas.
- Un valor de aleatoriedad de época, que es el hash de los valores del VRF de los bloques de la penúltima época (N-2), por lo que la aleatoriedad pasada afecta a la aleatoriedad pendiente actual (N).
- El número de slot.
La salida son dos valores: un RESULT
(el valor aleatorio) y una PROOF
(una prueba de que el valor aleatorio fue generado correctamente).
El RESULT
se compara con un umbral definido en la implementación del protocolo (concretamente, en el Polkadot Host). Si el valor es menor que el umbral, entonces el validador que ha sacado este número es un candidato viable a la producción de bloques para ese slot. El validador intenta entonces crear un bloque y lo envía a la red junto con el PROOF
y el RESULT
obtenidos previamente. En el VRF, cada validador tira un número para sí mismo, lo comprueba con un umbral y produce un bloque si la tirada aleatoria está por debajo de ese umbral.
El lector astuto se dará cuenta de que, debido a la forma en que funciona esto, algunos slots pueden no tener validadores como candidatos a producir un bloque porque todos los candidatos a validador sacaron un número demasiado alto y no alcanzaron el umbral. Aclaramos cómo resolvemos este problema y nos aseguramos de que los tiempos de los bloques de Polkadot se mantengan cerca del tiempo constante en la página wiki sobre el consenso.
RANDAO #
Un método alternativo para obtener aleatoriedad en la cadena es el método RANDAO de Ethereum. RANDAO requiere que cada validador se prepare realizando muchos miles de hash en alguna semilla. A continuación, los validadores publican el hash final durante una ronda y el número aleatorio se deriva de la entrada de cada participante en el juego. Mientras participe un validador honesto, la aleatoriedad se considera segura (no es económicamente viable de atacar).
RANDAO se complementa opcionalmente con VDF.
VDFs #
Las funciones de retardo verificable son cálculos que tardan un tiempo determinado en completarse, incluso en computadoras paralelas. Producen un resultado único que puede ser verificado de forma independiente y eficiente en un entorno público. Al introducir el resultado de RANDAO en una VDF, se introduce un retardo que hace obsoleto cualquier intento de un atacante de influir en la aleatoriedad actual.
Los VDF se implementarán probablemente a través de dispositivos ASIC que deben ejecutarse por separado de los otros tipos de nodos. Aunque uno solo es suficiente para mantener la seguridad del sistema, y serán de código abierto y se distribuirán casi sin costo alguno, ejecutarlos no es barato ni está incentivado, lo que produce una fricción innecesaria para los usuarios de las blockchains que opten por este método.
Recursos #
- Investigación de Polkadot sobre la aleatoriedad y la clasificación de las blockchains – contiene el razonamiento de las elecciones realizadas junto con las pruebas
- Discusión sobre la aleatoriedad utilizada en Polkadot – Los investigadores del W3F discuten la aleatoriedad en Polkadot y cuándo es utilizable y bajo qué supuestos.