Después de un desarrollo significativo, hemos hecho que la aleatoriedad segura esté disponible en Sui Testnet. Esta característica crucial, impulsada por el módulo sui::random, abre nuevas posibilidades para desarrolladores y constructores en Sui.

¿Por qué necesitamos aleatoriedad en la cadena?

Las aplicaciones y los proyectos pueden utilizar la aleatoriedad de muy diversas maneras, desde simular una tirada de dados hasta asignar números de boleto en un sistema que garantice la equidad. Hay más casos de uso de la aleatoriedad en cadena de los que uno podría pensar inicialmente. Aquí hay algunos ejemplos clave:

1. Juegos de azar: el caso de uso más obvio es el de juegos como loterías, juegos de cartas, gacha, cajas de botín, rifas y juegos de casino. La aleatoriedad nativa de Onchain permite que estos juegos funcionen sin necesidad de que los jugadores confíen en el operador del juego. Cualquiera puede verificar la equidad del juego, lo que garantiza transparencia y confianza. Este caso de uso se extiende a juegos más complejos, como determinar si un personaje en un juego de rol le da un golpe a un enemigo.

2. Muestreo aleatorio: seleccionar un subconjunto aleatorio de un grupo más grande, lo cual es útil en diversos ámbitos, como la gobernanza y las auditorías aleatorias. En la resolución de disputas, se puede utilizar un muestreo aleatorio para seleccionar un jurado imparcial. Otro ejemplo es la selección aleatoria de comités en oráculos y DAO para procesos de votación y toma de decisiones para mejorar la equidad y la transparencia.

3. NFT: la aleatoriedad permite la creación de NFT aleatorias con diferentes niveles de rareza. Por ejemplo, un criptocoleccionable puede tener varios rasgos asignados probabilísticamente. Además, las NFT podrían incorporar rasgos genéticos o mutaciones aleatorias en escenarios de reproducción, abriendo puertas a la creatividad en el diseño y uso de las NFT.

4. Concursos y emparejamiento de jugadores: ejemplos interesantes incluyen colocar aleatoriamente a los participantes en grupos de torneos, emparejar jugadores para juegos e interacciones sociales, determinar el orden de juego en juegos por turnos, elegir ganadores en caso de empate, asignar jugadores a equipos y su orden en los borradores, asignando sede y árbitros en los eventos.

Andrew Schran de Mysten Labs habla sobre la aleatoriedad nativa de Sui en Sui Basecamp.

El aspecto técnico de la aleatoriedad descentralizada

Para que la aleatoriedad en cadena sea segura, debe ser impredecible e insesgable. La imprevisibilidad garantiza que nadie pueda predecir los valores aleatorios antes de que se utilicen, lo que evita que los atacantes manipulen las aplicaciones mediante transacciones anticipadas o solo interactúen cuando los resultados sean favorables. La imparcialidad garantiza que ninguna de las partes pueda influir en el resultado del proceso de generación de aleatoriedad, lo que evita que los atacantes sesguen los resultados a su favor.

Soluciones existentes y sus limitaciones.

Varias soluciones existentes tienen como objetivo proporcionar aleatoriedad segura, cada una con sus propias compensaciones. El uso de una fuente externa de aleatoriedad, como una función aleatoria verificable (VRF) local/no distribuida, es simple pero no verdaderamente descentralizado, ya que confiar en unos pocos nodos que operan la VRF puede generar problemas de previsibilidad y sesgo si la fuente colude con otras partes. Las funciones de retardo verificables (VDF) garantizan que la aleatoriedad no se pueda predecir hasta que haya pasado un tiempo determinado, pero también tienden a ser demasiado lentas para muchas aplicaciones. 

Otras soluciones utilizan aleatoriedad basada en Oracle que puede ser predecible y sesgada si el Oracle colude con nodos y su uso puede ser lento de forma segura. Por ejemplo, utilizar drand, una baliza de aleatoriedad distribuida, requiere que el proceso espere una ronda de aleatoriedad lo suficientemente lejana en el futuro como para garantizar que sea impredecible.

El enfoque de Sui sobre la aleatoriedad

Mysten Labs ha desarrollado una solución que aprovecha la criptografía de umbral y la generación de claves distribuidas (DKG) para exhibir las cualidades de ser impredecible, insesgable y rápido. Esta solución aparece en Sui como una baliza de aleatoriedad respaldada por la red de validación. Al comienzo de cada época, los validadores inician un protocolo DKG para generar acciones secretas de una clave distribuida. Luego, continuamente durante la época, usan sus partes de la clave para producir aleatoriedad para el uso de las aplicaciones. 

Esta solución nativa de aleatoriedad es mucho más rápida que las soluciones existentes en Sui. La generación de aleatoriedad opera en paralelo al mecanismo de consenso, proporcionando valores aleatorios rápidamente después de que se haya ordenado una transacción pero antes de su ejecución.

Además, los bloques de transacciones programables y de movimiento (PTB) permiten composiciones poderosas al mismo tiempo que evitan una posible manipulación a través de restricciones integradas y advertencias del compilador. Si bien hay importantes barreras de seguridad integradas, los desarrolladores deben garantizar diseños de programas sólidos para evitar la inspección por parte de otras funciones Move o comandos PTB.

Usando el módulo sui::random

El módulo sui::random proporciona acceso a pseudoaleatoriedad dentro de Sui, lo que permite una variedad de aplicaciones. Por ejemplo, los desarrolladores pueden utilizar esta función para implementar una función Move que selecciona un ganador aleatorio para un sorteo. El código fuente de este y otros ejemplos se puede encontrar en nuestro repositorio de GitHub.

entrada set_winner(juego: &mut Raffle, rnd: &Random, ctx: &TxContext) { afirmar!(is_none(game.winner), EWinnerAlreadySet); // el ganador es del tipo Option<u32> let gen = new_generator(rnd, ctx); juego.ganador = Algunos(gen.generate_u32_in_range(1, juego.num_of_tickets)); // num_of_tickets es u32 que representa el número de participantes }

La segunda línea de la función.

conjunto_ganador

garantiza que aún no se haya seleccionado un ganador. Luego, la función inicializa un nuevo generador aleatorio y se genera un número aleatorio dentro del rango de números de boletos. El resultado es un ganador elegido de forma segura e impredecible, gracias a las sólidas garantías de generación aleatoria de Sui, que garantizan que el valor devuelto por generate_u32_in_range sea aleatorio e impredecible siempre que menos de un tercio del poder de voto de la red esté corrupto.

Si bien la aleatoriedad es generada globalmente por la red y no por transacción, Sui deriva de esa aleatoriedad global una familia de funciones pseudoaleatorias sembradas impredecibles e insesgables cada vez. 

nuevo_generador

es invocado.

Redondeando la aleatoriedad en Sui

La introducción de una fuente de aleatoriedad segura y escalable en Sui es un avance crucial que permite a los desarrolladores crear aplicaciones más sólidas y seguras. Alentamos a nuestra comunidad a brindar comentarios y explorar nuevas formas de utilizar la aleatoriedad. Para obtener información técnica más detallada, consulte la documentación de Onchain Randomness.

Esta función ahora está disponible en Sui Testnet. Alentamos a los desarrolladores a que lo prueben y se aseguren de que sus aplicaciones estén listas para aprovechar valores aleatorios seguros y sólidos cuando la aleatoriedad nativa esté disponible en Mainnet. ¡Gracias a nuestros desarrolladores por contribuir a un ecosistema Sui más seguro y eficiente!