Números aleatorios en NEAR

Devsebasgr
2 min readJan 4, 2022

Los entornos de desarrollo de NEAR para contratos inteligentes como near-sdk-rs y near-sdk-as, no permiten generar números aleatorios, debido a que en las librerías de números aleatorios utilizan el reloj interno de la computadora para la semilla. En consecuencia, tu contrato no puede ser ejecutado al desplegarlo. Sin embargo, podemos usar las semillas que el bloque de la transacción nos ofrece. Sin embargo, cada semilla proporcionada por los sdks de NEAR es un array conformado por 32 enteros uint8, pero varias librerías utilizan enteros uint64.

Semilla generada

¿Podemos sacar algo útil de esta semilla?

La respuesta es: Sí y no. Desde un inicio cuentas con números aleatorios, pero estos son sólo de 1 byte y como resultado obtenemos un rango de números muy limitado de 0 a 255.

¿Solución?

La solución se basa en encontrar una librería adecuada. Por ejemplo, en rust existe una librería llamada tiny-rng. Además de ser bastante compacta, es conveniente y nos permite introducir una semilla. Pero en este punto surge otro inconveniente, debido a que la semilla que nos provee los bloques no son adecuados y no permite un amplio rango de números. Esto lo solucionamos juntando todos los números del array, en un número entero sin signo de 64bits, que en este caso es aceptado por tiny-rng. Esto lo logramos empleando los operadores de números binarios.

Un número entero como u64 está formado por 8 bytes, a su vez, un u8 equivale a un byte. La idea es rellenar cada byte del entero u64 con cada u8 de la semilla que es un array de u8

Los operadores binarios son complejos, sin embargo, entre los más utilizados destacan: <<, >>, & , ! y |. Ahora bien, este no es nuestro tema principal, por lo que recomendamos revisar esta lectura.

Siguiendo la línea de ideas, ya podemos formar nuestras semillas para obtener un resultado que se aproxime a esto: 9679235649509063010, 11495974416474081199, etc. Posteriormente, podemos implementar una librería compacta en nuestro contrato. A continuación, disponemos de un ejemplo práctico de implementación de tiny-rng que puedes emplear.

IMPORTANTE!!!

Al desplegar los contratos, debemos usar la menor cantidad de librerías posibles, para evitar aumentar el tamaño binario del wasm. Para tal fin, creé una librería llamada near-rng. Además de ser un fork de tiny-rng, esta librería funciona con el near-rust-sdk, es lo más compacta posible y su manejo es bastante sencillo.

--

--

Devsebasgr

Programo cosas que sale en la pantalla y en la blockchain de near