¿Qué es algoritmo de minería RandomX en Monero?

El algoritmo de minería RandomX, es un algoritmo de Prueba de Trabajo (Proof of Work – PoW) que ha sido diseñado para sustituir al conocido CryptoNight de la criptomoneda de privacidad Monero (XMR).

Al igual que su predecesor, RandomX se diseñó para ser seguro y ser el nuevo algoritmo por defecto de Monero. El mismo ofrece un alto nivel de criptografía, y está centrado para sistemas con la privacidad y el anonimato en mente. Pero sobre todo, pensado para ser resistente a la minería por ASIC. Esta última, una capacidad que CryptoNight había perdido hace algún tiempo, y que mantenía medio a flote con varias actualizaciones. Sin embargo, el equipo de Monero tomó la decisión de crear un nuevo algoritmo desde cero. Un algoritmo que tomará lo mejor de CryptoNight y así crear una nueva base minera para Monero.

¿El resultado? Un algoritmo de minería como nunca se había visto y con una resistencia muy prometedora a ASIC. Eso además de una mejoría en la capacidad de minería para las CPU, lo que ha llevado nuevamente a la moneda a una mejor descentralización de la minería.

Pero RandomX es mucho más que eso, es un algoritmo probado, auditado y que tiene un potencial de crecimiento enorme. Es por estas razones, que dedicaremos un espacio para analizar RandomX y todas las cosas nuevas que trae al criptomundo, y como Monero se ha beneficiado de ello.

Origen de RandomX

Como hemos indicado, RandomX nace de la necesidad del proyecto Monero (XMR) de tener un nuevo algoritmo de minería capaz de resistir el avance de los ASIC.

Recordemos que en 2018, las empresas Baikal y Bitmain habían anunciado los primeros ASIC para CryptoNight, rompiendo la resistencia que dicho algoritmo había supuesto por varios años. Todo un logro para ambas empresas, especialmente si se tiene en cuenta que CryptoNight era un algoritmo bastante complejo. De hecho, este se diseñó con el fin de evitar la minería ASIC desde un principio.

Sin embargo, el logro de las empresas no fue bien recibido por la comunidad Monero y otras comunidades blockchains que usaban el algoritmo CryptoNight. Y sobre todo, porque Monero es una criptomoneda donde los mineros ASIC no son bien recibidos.

El monopolio de fabricación de los ASIC y el acceso a ellos por entidades con grandes sumas de dinero no dejan oportunidad a personas normales a beneficiarse del proceso de minado, quedando todo centralizado en pocas manos. Algo que a su vez representa punto único de fallo para toda la moneda.

En Monero la minería, por lo general, había sido llevada por CPU y GPU, por lo que los ASIC suponían un grave riesgo de centralización y seguridad, por la posibilidad de un ataque de 51%.

Para paliar la situación, Monero comenzó a desarrollar nuevas variantes de CryptoNight que impactaran negativamente en el rendimiento de los ASIC. Algunas actualizaciones tuvieron un buen alcance, pero los ASIC aún se mantenían. En este punto era obvio ya lo que pasaba, CryptoNight era insuficiente y se necesitaba de un nuevo algoritmo.

Esto hizo que naciera Monero Classic, impulsado por los mineros que querían el algoritmo minable con ASIC. No obstante este intentó apenas tuvo acogida.

Aun así siguieron mejorando los ASIC para Monero, y el 31 de octubre de 2018 comenzó el desarrollo de RandomX. Este nuevo algoritmo supondría, según los desarrolladores de Monero, un cambio radical en los algoritmos de minería. El trabajo rindió sus frutos el 5 de mayo de 2019, cuando la primera versión de RandomX salió a la luz.

El algoritmo de RandomX fue desarrollado para Monero por los desarrolladores tevador, hyc, vielmetti, antanst y SChernykh y se activó con éxito en la red Monero el 30 de noviembre de 2019.

¿Cómo funciona RandomX?

El funcionamiento a grandes rasgos de RandomX está escrito en su nombre: la aleatoriedad es su premisa principal. Pero ¿Qué significa esto? Pues bien, significa que RandomX está diseñado para crear una “zona de trabajo” o scratchpad completamente aleatorio, con un alto consumo de memoria, y que utiliza técnicas avanzadas de virtualización para su funcionamiento. Estos tres pilares son los que permiten que RandomX sea resistente a los ASIC.

De hecho, RandomX no solo es resistente a ASIC, sino que también lo es para las GPU, dado que estos chips carecen de las instrucciones necesarias para ejecutar en primera instancia las complicadas operaciones de RandomX. Como resultado, RandomX busca ser un algoritmo de minería solo para CPU, ofreciendo la mayor resistencia posible a otro tipo de minería. Por otro lado, esto también va dirigido a evitar las llamadas botnets muy famosas en Monero, ya que RandomX hará que las mismas sean casi imposible de poner en practica. En especial en dispositivos de baja potencia, como lo pueden ser Smart TV o dispositivos IoT (Internet of Things  o Internet de las Cosas).

Pero ¿Cómo hace posible RandomX todo esto? Pues bien examinemos un poco más a fondo este nuevo algoritmo.

Dos modalidades de minería, para dos usos distintos

En primer lugar, RandomX tiene dos modalidades de minería. Cada uno de ellos con requerimientos y rendimientos muy distintos.  El modo más potente y más exigente de recursos es el Modo rápido, que requiere de 2 GB de memoria. Toda esta memoria se utilizar para crear el scratchpad aleatorio de RandomX. De hecho, es una dependencia necesaria del algoritmo para obtener buen rendimiento.

En segundo lugar, tenemos el Modo ligero, un modo que solo requiere de 256 MB de memoria RAM y ha sido diseñado para ser usado en los nodos de validación de Monero. El rendimiento de minería de este modo es limitado, y es hasta 6 veces inferior al Modo rápido, por lo que las ganancias por minería serían, más bien, escasas usando este modo.

Ya en este punto tenemos una primera barrera contra los ASIC. Si bien es cierto que los ASIC ahora pueden tener grandes cantidades de RAM (como los de Ethereum que suelen tener entre 4 a 8 GB de RAM), esto encarece bastante a estos equipos.

En segundo lugar, dado el alto consumo de potencia de cómputo, si un ordenador está infectado con un cryptojacking para minar Monero, este será facilmete identificado por el usuario. Algo que reduce muchísimo las probabilidades de éxito de una botnet.

Criptografía utilizada

Si a algo nos tienen acostumbrado el proyecto Monero (XMR) es al uso de criptografía avanzada en sus desarrollos. En este caso, RandomX no es la excepción a la regla, sino el cumplimiento cabal de la misma. En RandomX hacen uso intensivo de las funciones hash Blake2b, del generador de contraseñas Argon2d y de criptografía simétrica AES. Como resultado, la calidad criptográfica de RandomX es excepcional.

Sin embargo, en Monero no se han conformado solo con su trabajo, y han decidido ejecutar auditorías formales de seguridad criptográfica y de implementación sobre el algoritmo RandomX. En total son cuatro las auditorías realizadas por las empresas Trail of Bits, X41 D-SEC, Kudelski Security y QuarksLab, todas ellas manejadas por OSTIF, una organización de larga trayectoria en ciberseguridad y criptografía.

Todas las auditorías ya han sido realizadas, y los resultados de las mismas son prometedores. Si deseas saber un poco más sobre este punto, te invitamos a que revises los resultados en este enlace.

Su esquema de Prueba de Trabajo

El esquema de Prueba de Trabajo (PoW) de RandomX es el siguiente:

En primer lugar se genera una clave (llamada clave K) la cual se selecciona para ser el hash de un bloque en la cadena de bloques (blockchain). Este bloque se denomina “bloque de claves”. Para un rendimiento óptimo de minería y verificación, la clave debe cambiar cada 2048 bloques (aprox. 2,8 días) y debe haber un retraso de 64 bloques (aprox. 2 horas) entre el bloque de claves y el cambio de la clave K. Esto se puede lograr cambiando la clave cuando se cumpla lo siguiente blockHeight % 2048 == 64 (donde % es el módulo de la división) y seleccionando el bloque de teclas de manera que keyBlockHeight % 2048 == 0.

En ese punto, la entrada H es el blob hash estándar con un valor nonce seleccionado.

Aunque todo esto parezca un poco críptico, lo que nos quiere decir el algoritmo de RandomX  es que su prueba de trabajo funciona bajo dos premisas importantes:

  1. Necesita de una clave (llamada K) que debe cambiar cada 2048 bloques. Esta clave es vital para que RandomX pueda generar los hash y los bloques válidos para la red.
  2. La clave se genera con datos del blockchain y en última instancia con un sistema de generación de claves seguras.

Por otro lado, el algoritmo también hace un poco más compleja las cosas, al requerir de condiciones específicas de ejecución. Entre estas condiciones podemos incluir:

  1. Arquitectura de CPU de 64-bit, lo que permite manejar grandes volúmenes de datos y memoria.
  2. Una unidad FPU (Unidad de Coma Flotante) compatible con el estándar IEEE 754. Si la unidad no es compatible, los datos generados por el algoritmo no se podrán validar.
  3. Soporte para AES. Si el soporte es por hardware con extensiones como AES-NI, el rendimiento del algoritmo es mucho mejor.
  4. Mucha memoria cache para cada hilo de ejecución del algoritmo. Al menos 16 KB de L1, 256 KB de L2 cache y 2 MiB de L3.
  5. Un sistema operativo con soporte para manejo de páginas de memoria de gran tamaño. Recordemos que RandomX usa como mínimo 2 GB de memoria RAM y la exigencia puede aumentar según la configuración.

La Máquina Virtual de RandomX

La funcionalidad que quizás mayor resistencia va a poner ante los ASIC, y de hecho es una característica única de este algoritmo, es su máquina virtual o VM (Virtual Machine).

RandomX hace todo su trabajo de criptografía y minería dentro de una sencilla máquina virtual cuya finalidad es; aislar todo el proceso de minería en una serie de procesos que actúan bajo sus propias instrucciones y arquitectura virtualizada.

Con esto se busca aumentar la complejidad de implementar una solución ASIC a niveles nunca vistos. A la vez que, la implementación CPU se simplifica y permite ajustarse de acuerdo a necesidades futuras. Esta máquina virtual puede realizar sus distintas tareas gracias a un set de instrucciones del tipo CISC personalizadas. Esta característica permite una comunicación muy sencilla con las CPU que usan un set de instrucciones del mismo tipo. A diferencia de los chips ASIC, que usan un set de instrucciones del tipo RISC, y la emulación CISC sobre RISC es costosa computacionalmente, agregando más complejidad a una solución ASIC para RandomX.

El objetivo de esta máquina virtual es crear el entorno necesario para que la prueba de trabajo de RandomX se lleve a cabo. Para lograrlo, esta VM crea un espacio de trabajo aleatorio (scratchpad en memoria), altamente cifrado y lleno de entropía (datos aleatorios que luego servirán para la prueba de trabajo).

Creadas estas condiciones, la VM recibe las instrucciones para iniciar los programas de minería. Cada uno de estos programas se crea usando los datos aleatorios del espacio de trabajo y da como resultado un programa único.

Dicho programa aplicará todos los procesos permitidos por la VM para realizar la minería, es decir, el programa solo puede ejecutar las instrucciones que le permita la VM (256 instrucciones y 20 registros), nada más. En este punto, lo que pase en la VM de RandomX es prácticamente invisible para el resto del ordenador, debido al uso de criptografía en todo ese proceso.

Este proceso de crear programas aleatorios para realizar minería se denomina Dynamic Proof of Work, y es el esquema que precisamente utiliza RandomX en este punto. Este sistema se puede definir de la siguiente forma:

  1. En primer lugar se genera el programa aleatorio. Es lo que la VM hace al iniciar el scratchpad y todo los elementos del programa en un primer ciclo de trabajo.
  2. Luego la VM se encarga de hacer de traductor entre el CPU y los programas aleatorios. Los programas aleatorios sólo pueden usar las instrucciones de la VM, pero la VM traduce dichas acciones en código máquina entendible por el CPU. De esta forma, la CPU da respuesta a las acciones y la VM recibe las respuestas. Como las instrucciones hacen uso de criptografía la optimización es muy costosa.
  3. Finalmente la ejecución del programa, en este punto la VM permite acceso al CPU y sus capacidades sin perder la asociación con el programa aleatorio. Este punto se da bajo condiciones muy específicas y especiales ya programadas dentro del algoritmo de RandomX. De hecho, cualquier variación termina por arrojar datos inválidos porque este proceso es completamente reproducible.

Sin dudas, la VM de RandomX es el elemento más complejo y difícilmente replicable, siendo así su mejor carta contra los ASIC.