Desde que comenzó la era de la computación personal, el desarrollo de aplicaciones empezó a cambiar la manera en cómo se hacían las cosas, imprimiendo una agilidad sin precedentes en el quehacer humano. Inicialmente existieron alojadas en el almacenamiento local de cada PC. Con el tiempo, aparecieron las primeras redes y el paradigma de los recursos compartidos, que antes estuvo disponible sólo para algunos círculos académicos de investigación, irrumpió con fuerza en el ámbito empresarial mundial, cambiándolo todo para siempre.
Surgieron entonces las aplicaciones cliente-servidor, donde un programa manejado por el usuario final consultaba datos almacenados en servidores, donde el software central daba respuesta a sus solicitudes. Este sigue siendo el esquema utilizado hasta el día de hoy.
Un poco mas tarde llegaría el que es considerado el mejor invento tecnológico de todos los tiempos: Internet, que expandiría a los confines de la Tierra el alcance de las aplicaciones cliente-servidor. Las consultas podrían hacerse ahora desde cualquier parte del mundo, como si estuvieran usando la red local de la compañía. Los servicios de telecomunicaciones permitieron este tipo de conexiones durante años, pero gracias a Internet los costos se hicieron realmente bajos, quedando las conexiones privadas de alta velocidad reservadas para usos muy específicos.
Blockchain y las aplicaciones descentralizadas
Con la tecnología de las cadenas de bloques, llegó la innovación de las dApps, aplicaciones que ya no dependen de un software central para su funcionamiento, sino que están distribuidas en miles de dispositivos que se comunican entre sí por los canales de Internet. Bitcoin y otros sistemas de criptomonedas son ejemplos de aplicaciones descentralizadas, que no necesitan de intermediarios para alojar ni administrar el código ni los datos de los usuarios.
El desarrollo de aplicaciones descentralizadas no esta sujeto a la autorización de ningún ente central, que, por diseño, no existe como tal. La plataforma más comúnmente empleada para ejecutar dApps es Ethereum, donde han sido construidas más de mil aplicaciones de este tipo.
Mientras que el back-end de las aplicaciones tradicionales corre en servidores, el de una dApp lo hace en una red descentralizada de igual a igual (P2P). El código front-end (con el que interactúan los usuarios) puede codificarse en cualquier lenguaje de programación capaz de conectar las llamadas API (solicitudes) con el back-end. Ahora también existen servicios como IPFS, donde puede alojarse la interfaz de una dApp.
Desarrollo de aplicaciones tradicionales versus desarrollo de dApps
Quizás la diferencia primordial entre las aplicaciones descentralizadas y tradicionales en cuanto a su desarrollo sea el nivel de detalle con el cual el código de las dApps se analiza antes de ser liberado. En este sentido, se puede hacer una analogía con el desarrollo de hardware, que es también tan riguroso como los presupuestos y la firma detrás de ellos lo permite, en el primer caso y lo exige, en el segundo.
Como sucede con el hardware, las pruebas de dApps previas a su lanzamiento suelen ser bastante estrictas, pues los costos de sacar al público un producto deficiente son por lo regular bastante altos, afectando también la reputación del fabricante. Los contratos inteligentes codificados en el desarrollo de una dApp no pueden ser modificados una vez lanzados en la red principal, y los errores en su programación arrojan dudas sobre la habilidad profesional de sus desarrolladores y ponen en riesgo el dinero de los usuarios.
En el desarrollo de aplicaciones tradicionales, lo que se persigue es lanzar al mercado un producto viable mínimo (MVP), por lo que se estila emplear ciclos rápidos de iteración. El software se considera listo para que el público lo use y luego se lanzan los parches necesarios, o versiones actualizadas del mismo tan pronto como sea posible.
En cuanto a la seguridad, la verificación formal del código es mucho más frecuente en el desarrollo de las aplicaciones descentralizadas. Este proceso consiste en chequear sin un algoritmo cumple con ciertos requisitos lógicos. Herramientas de verificación como Coq e Isabelle suelen ser empleadas para probar que un programa está libre de errores.
dApps y lenguajes de programación
La plataforma blockchain por excelencia para alojar aplicaciones descentralizadas es Ethereum. Esta red fue la primera en construir un lenguaje Turing-completo listo para escribir contratos inteligentes. Ethereum es la comunidad que posee la mayor cantidad de desarrolladores del ecosistema blockchain y más del 90 por ciento de las mejores dApps fueron construidas en su entorno.
Solidity
Solidity es el lenguaje que se emplea actualmente para codificar dApps en Ethereum y en otras plataformas privadas que compiten con ella, como Monax y su cadena de bloques Hyperledger Burrow. Fue propuesto en 2014 por Gavin Wood y posteriormente desarrollado por un equipo de programadores en Ethereum especialmente dedicado al mismo y dirigido por Christian Reitwiessner.
Además de Solidity, que conserva similitudes con JavaScript y C, otros cuatro lenguajes se estuvieron gestando para ser ejecutados por la Máquina Virtual Ethereum (EVM):
• Serpent. Ya obsoleto, parecido a Phyton
• LLL. Lisp de bajo nivel (Low-Level-Lisp)
• Vyper. Derivado de Python y orientado a la investigación. Aún en desarrollo
• Mutan. Estaba basado en Golang (Go). Quedó también en desuso
Vyper
Es un lenguaje es más fácil de escribir que Solidity. Esta característica hace a Vyper más simple, auditable y seguro, menos propenso a errores. Hay muchos elementos de Solidity que son incompatibles con Vyper, como las llamadas recursivas, el punto binario fijo, herencia de clases, el ensamblaje en línea, y los modificadores.
Simplicity
Más reciente que Vyper, Simplicity fue presentado en la Conferencia BPASE de Stanford a comienzos de 2018. Las principales ventajas que ofrece Simplicity con respecto a Solidity son:
- Calcula los costos de recursos de los programas, evitando así la denegación de servicio
- Consolida el costo de los recursos mediante herramientas de análisis estático que le ayudan a conservar gas
- Se apoya Coq, una herramienta de verificación de código que disminuye su exposición a ataques
- Elimina el código no utilizado antes de su inclusión en la cadena de bloques, lo que añade privacidad
A pesar de esto, Simplicity tendrá que esperar un poco, pues, al ser parte de la familia de lenguajes funcionales como Lisp, Clojure, OCaml, Haskell y otros, no goza de la preferencia de los desarrolladores. Ninguno de los 15 lenguajes de programación más populares alojados en Github pertenece a este grupo. Una honrosa excepción puede ser Liquidity, un lenguaje funcional empleado por la blockchain de Tezos para codificar sus contratos inteligentes.
Herramientas para desarrollo de dApp
Entre las muchas herramientas existentes, las más utilizadas por los desarrolladores de aplicaciones descentralizadas son:
Parity
Parity es un cliente de Ethereum escrito en un lenguaje de bajo nivel reciente llamado Rust. Estructurado modularmente, Parity ofrece una línea de comandos avanzada, múltiples mecanismos de consenso y mínima huella de almacenamiento y memoria. Gracias a la cantidad de proyectos que emplean esta herramienta, durante el ataque que sufrió la billetera Parity el 19 de julio de 2017 un grupo de hackers de sobrero blanco intervinieron las billeteras que todavía no habían sido vaciadas, pudiendo salvar unos 514.000 ETH, que para ese entonces valían más de US$ 100 millones.
Truffle
El marco de trabajo de Truffle es utilizado por compañías como ShapeShift, Digix Global y STABL. Comprende herramientas para crear, compilar, evaluar e implementar dApps de manera ágil.
Además de las mencionadas, tenemos a Oyente, que ejecuta análisis estáticos en contratos inteligentes, Remix, un editor y compilador de Solidity para navegadores y EthPM, un administrador de paquetes para Ethereum.
Las mejores practicas para el desarrollo de dApps (Consensys) están disponibles en Github, y existen terceras partes que realizan labores de auditoría en contratos inteligentes implementados en la tesnet de Ethereum, como Zeppelin. Para quienes deseen probar sus habilidades de seguridad en contratos inteligentes, Zeppelin dispone de un juego llamado “El Ethernauta”, donde, para avanzar, los participantes deben ser capaces de hackear el contrato de cada nivel.
Los contratos inteligentes son sólo una parte en las dApps
En el código fuente de las aplicaciones descentralizadas en realidad figura una pequeña porción de contratos inteligentes, constituyendo un porcentaje menor del código total.
En el caso de Storj, la nube descentralizada de almacenamiento, los contratos inteligentes, cuya función consiste en respaldar la lógica de las transacciones, ocupan sólo el 9% del código. La programación que se encarga de la encriptación y resguardo de archivos compartidos, utilización del disco duro o la manera en que se actualizan los nodos, se encuentra en un módulo aparte, escrito en NodeJS. Los contratos inteligentes de Golem ocupan un porcentaje menor, 3%. El código principal, encargado de llevar a cabo el resto de las funciones, está escrito en Python.
Los contratos inteligentes están en cadena, lo que significa que el código interactúa directamente con la cadena de bloques. Por el contrario, el código fuera de cadena no se relaciona directamente ella.
Nuevas plataformas de desarrollo
Para codificar aplicaciones descentralizadas en Ethereum es necesario dominar un lenguaje de programación personalizado. Sin embargo, existen plataformas de desarrollo de próxima generación que admiten el empleo de lenguajes tradicionales (JavaScript y Python, por ejemplo), como Tendermint y Cosmos.
Tendermint
Tendermint está compuesto por dos elementos: el motor de consenso blockchain (Tendermint Core) y la interfaz genérica de la aplicación. Tendermint Core garantiza que todas las transacciones se registren en la al mismo tiempo, en la misma secuencia, en todas las máquinas, para lograr de esta forma tolerancia a fallas bizantinas. ABCI (Application Blockchain Code Interface) es el nombre de la interfaz, se ejecuta sobre Tendermint Core y admite muchos lenguajes de programación para procesar las transacciones.
Cosmos
La plataforma Cosmos está basada en Tendermint, lo que le permite utilizar cualquier lenguaje de programación para construir aplicaciones descentralizadas interoperables pertenecientes a cadenas diferentes. Si se desea desarrollar una dApp más independiente y flexible, se puede desarrollar en su propia cadena de bloques, y evitar las complicaciones de otras redes, como sus mecanismos de consenso.
Para aplicaciones menos ambiciosas, que no requieran de una cadena de bloques propia, se puede acudir a Ethermint, un entorno con mejor rendimiento que Ethereum y todas las capacidades de ésta disponibles.
Blockstack
En la nueva plataforma de desarrollo para dApps Blockstack, los usuarios son los propietarios de sus datos personales. En este caso, las aplicaciones se ejecutan fuera de cadena, utilizando la API REST DE JSON para comunicarse con el núcleo subyacente de Blockstack.
Las aplicaciones pueden ser escritas en variedad de lenguajes. Además, Blockstack ofrece un tutorial que muestra cómo pueden construirse dApps en su plataforma.
NEO
La cadena de bloques de NEO también admite varios lenguajes, Python, C# y Java. La plataforma NEO traduce estos lenguajes en instrucciones comprensibles por su máquina virtual, lo que es muy atractivo para una gran base de desarrolladores, que no necesitan entonces aprender un nuevo lenguaje. Se espera que en el mediano plazo la red NEO sea compatible con aplicaciones escritas en Golang, C/C++ y JavaScript.
Las dApps continuarán evolucionando
Posiblemente, la elección de un lenguaje de programación en particular a la hora de construir una aplicación descentralizada en Cosmos, NEO, Ethereum o Blockstack pudiera ser un factor secundario, eso es algo que cada desarrollador debe evaluar por sí mismo.
Los beneficios inherentes a cada red parecen pesar más que el lenguaje como tal. Todo el mundo que su aplicación sea utilizada por el mayor número de personas posible, de modo que los programadores darán prioridad a aquéllas plataformas con una cantidad importante de usuarios. Esto crea un efecto de rebote, pues la red, al albergar más aplicaciones, el número de usuarios de la misma aumentará en consecuencia.
Está comprobado que la demanda de aplicaciones en determinadas plataformas (GPU Envidia, Apple Store) incrementa el interés de los desarrolladores por aprender lenguajes propietarios como CUDA y Objective-C / Swift.
Dado su desempeño hasta ahora, y los números que puede mostrar, Ethereum seguirá siendo la cadena de bloques que marque la pauta en el desarrollo futuro de las dApps.