Ethereum está detrás de una de las criptomonedas más populares, pero es mucho más que eso. Gracias a los algoritmos, la criptomoneda puede gestionarse de forma completamente autónoma. Pero, ¿cómo funcionan los «contratos inteligentes» y hasta dónde hemos llegado por este camino?
¿Cómo funcionan los contratos inteligentes en Ethereum?
Para entender el principio de los contratos inteligentes en Ethereum, primero tenemos que hacer un pequeño viaje al mundo de los lenguajes de programación. Los lenguajes de programación actuales se dividen esencialmente en dos grupos: lenguajes interpretados y lenguajes compilados. En el primer grupo, los programas se escriben en un lenguaje de alto nivel y luego son ejecutados por un intérprete. Dos ejemplos populares son Python y JavaScript. Los lenguajes interpretados son habituales en muchas áreas de aplicación (como la web) porque permiten empezar a trabajar directamente. También son muy universales y pueden utilizarse en distintas plataformas sin necesidad de herramientas adicionales.
En cambio, existen lenguajes compilados, en los que un compilador convierte primero el texto del programa en otro lenguaje, a menudo código máquina binario. Este código binario depende de la plataforma y se ejecuta directamente en un procesador. El compilador puede (y debe) producir código personalizado para el conjunto de instrucciones del procesador, por ejemplo para CPU compatibles con ARM o Intel. Representantes bien conocidos de este tipo son C y Rust.
Sin embargo, la realidad es, como siempre, más compleja de lo que sugieren estas simples categorías. Desde hace algún tiempo, existen formas híbridas, como Java. El compilador de Java no traduce el código Java directamente a código máquina «real», sino a un formato intermedio especial. Este formato intermedio, a su vez, es ejecutado por un intérprete -la máquina virtual de Java- en la arquitectura concreta del procesador.
Los contratos inteligentes de Ethereum también funcionan de forma similar. Todos los nodos que validan transacciones y extraen nueva moneda en Ethereum contienen una instancia de la máquina virtual de Ethereum (EVM). El Yellow Paper, la especificación técnica de Ethereum, define en detalle las instrucciones que soportan la EVM y cómo deben ejecutarse.
Se trata de un desarrollo propietario con una serie de características especiales:
No es posible la interacción con el mundo exterior: todas las decisiones algorítmicas deben derivarse de la blockchain y sus transacciones.
La aritmética se basa en valores de 256 bits para facilitar el manejo de direcciones y cantidades mayores.
Se integran operaciones especiales, como las funciones hash, para aumentar el rendimiento.
A todas las instrucciones se les asigna una función de coste (combustible), que corresponde aproximadamente al tiempo de ejecución necesario y a la cantidad de memoria requerida. En inglés se utiliza habitualmente el término metering.
Programación en la EVM
Al igual que ocurre con el ecosistema Java, existen varios lenguajes de programación para los que se dispone de compiladores EVM. El lenguaje más común es Solidity, que es superficialmente (sintácticamente) similar a JavaScript. A finales de 2020, la documentación de Ethereum enumera dos lenguajes adicionales: Vyper, que se basa en Python, y Yul Plus, un desarrollo completamente independiente.
Lo que todos estos lenguajes tienen en común es que son específicos de un dominio porque, a diferencia de los lenguajes de propósito general, ocupan un nicho con características particulares y, en particular, un motor de ejecución especial: EVM. Por supuesto, estos lenguajes específicos de dominio (DSL) son básicamente una buena idea para reducir la complejidad de las aplicaciones.
Pero en el caso de EVM, esto parece tener poco sentido. Después de todo, puede -independientemente de la falta de capacidad para interactuar con el mundo fuera de la blockchain- ejecutar algoritmos arbitrarios, por lo que es (por decirlo simplemente) Turing-completo.
¿Por qué no utilizar un lenguaje y un entorno de ejecución ya existentes?
Si fuera necesario, habría que eliminar algunas funcionalidades, pero podríamos aprovechar una experiencia más larga, herramientas más estables y -lo que es mucho más importante- una base más amplia de programadores. De hecho, es sabido que hoy en día la popularidad de un lenguaje de programación viene determinada no sólo por si es especialmente conciso, seguro en cuanto a tipos o dinámico, sino también por la facilidad de acceso a las numerosas bibliotecas y paquetes existentes. El mejor ejemplo de este cambio de época es JavaScript, a menudo criticado por su tosca semántica, pero que debe considerarse el lenguaje de programación más popular a más tardar desde el millonésimo paquete NPM.
Webassembly, un lenguaje intermedio universal
Los responsables de la especificación de Ethereum llegaron a la conclusión de que ciertos problemas podrían resolverse abandonando el desarrollo a medida en favor de un lenguaje universal. Qué conveniente que se esté desarrollando en la web una alternativa al gran perro JavaScript: Webassembly (WASM). Se trata tanto de un lenguaje intermedio universal como de un formato binario, combinado con una especificación para intérpretes. Como su nombre indica, este estándar abierto se diseñó originalmente para la web. Entretanto, se han examinado otros ámbitos de aplicación (por ejemplo, aplicaciones para teléfonos inteligentes).
El desarrollo de WASM está liderado por gigantes de la industria como Microsoft, Google y Apple. Una característica clave del lenguaje es que desde el principio se ha diseñado para ser portable. Así lo demuestra el hecho de que muchos lenguajes de programación existentes, como Rust, C++ o Go, ya pueden compilar para ensamblaje web.