-
La primera versión de Bitcoin se programó en C++.
-
La última actualización de Bitcoin Core incorpora los lenguajes Python y C.
Solo un reducido grupo de especialistas en criptografía advirtió la importancia del documento suscrito por Satoshi Nakamoto, enviado a finales de noviembre de 2008 a una lista de correo. Esa publicación, conocida hoy como el Libro Blanco de Bitcoin, define los elementos básicos de la red descentralizada que permitiría el intercambio de bitcoin entre pares, sin censura ni intervención de terceros de confianza.
Quien se identificaba como Satoshi Nakamoto también había asumido el proyecto de llevar a la práctica la implementación de la red Bitcoin. En el momento de la publicación del Libro Blanco, ya existía una versión preliminar del software de Bitcoin, hoy conocido como Bitcoin Core, pues dos meses después fue minado el bloque Génesis, el 3 de enero de 2009. Esa primera versión de Bitcoin fue escrita por Nakamoto en el lenguaje C++.
Para abordar el tópico de los lenguajes de programación usados tanto para el protocolo de Bitcoin, como para los diferentes proyectos que hoy funcionan en esa red, CriptoNoticias contactó a varios desarrolladores para identificar los principales lenguajes que se usan en la actualidad y qué tendencias de evolución hay en ese campo en el futuro inmediato.
CriptoNoticias conversó con Francisco Calderón, Gerente de Tecnología de Graaf.One, una empresa de brokerage de Bitcoin, quien además de desarrollador, es hacktivista, y evangelista de Lightning Network.
¿Por qué crees que Satoshi Nakamoto escogió C++ para implementar el primer cliente de Bitcoin?
C++ es una evolución de C. Es un lenguaje muy importante y útil para proyectos como Bitcoin, que requieren un alto rendimiento. Al respecto, C++ tiene acceso a recursos del computador que otros lenguajes, más actuales y de más alto nivel, no tienen. Antes de Bitcoin, el lenguaje C fue usado para crear sistemas operativos como Unix y Linux, justamente porque aprovecha al máximo los recursos del hardware.
Francisco Calderón. Gerente de Tecnología de Graaf.One
Cuando afirma que C++ es de más bajo nivel que otros lenguajes, Calderón se refiere a que está más próximo a la arquitectura de hardware, mientras que los lenguajes de alto nivel están más cercanos a los programadores y usuarios. Esto se traduce en instrucciones más comprensibles y cercanas al lenguaje natural, aunque los lenguajes son menos eficientes desde el punto de vista del rendimiento de los programas.
Este acceso mayor a los recursos del computador, dice Calderón, hace de C++ un lenguaje muy poderoso y de rápida ejecución. Sin embargo, sostiene, tiene una curva de aprendizaje más larga que otros lenguajes de alto nivel.
Como consecuencia de su poder como lenguaje, los programadores de C++ deben ser muy cuidadosos, señala Calderón. Así como es altamente eficiente en la ejecución, C++ no tiene mecanismos nativos para prevenir errores, dice el desarrollador.
Evolución en los lenguajes
Con más de once años de evolución, en el proceso de mantenimiento de Bitcoin Core, se sigue usando C++ de manera predominante. En el repositorio de Bitcoin en GitHub, se colocó el 3 de junio pasado la última actualización de Bitcoin Core, la versión 0.20.0, de la cual se señala que entre los lenguajes de programación usados están C++ (68,7%), Python (18%), C (7,2%) y 6,1% de otros lenguajes.
Se aprecia que C++ sigue siendo el lenguaje dominante en la operación de Bitcoin Core. Sin embargo, Calderón señala que han ido surgiendo lenguajes de alto nivel, con capacidad para desarrollar proyectos al nivel del protocolo de Bitcoin, que resuelven las limitaciones de C++.
Estos lenguajes, como Go, que fue desarrollado por Google; o Rust, desarrollado por Mozilla, tienen una curva de aprendizaje mucho más corta que C++. También tienen la ventaja de que incluyen en su diseño controles para prevenir errores de programación. Se podría decir que además de ser más fáciles de dominar, estos lenguajes cuidan al desarrollador de cometer errores.
Francisco Calderón. Gerente de Tecnología de Graaf.One
Como ejemplo de la utilización de Go, Calderón cita el caso de Lightning Labs que usa Go en el desarrollo del cliente lnd de Lightning Network. En este caso, sin embargo, hay una ventaja de C++ respecto a su rival más moderno «Blockstream realizó una implementación de un cliente de Lightning Network en C++ que supera en rendimiento a lnd», dice Calderón.
De cara al futuro, Calderón se declara partidario de Rust como alternativa para tener una ejecución eficiente y que facilita el proceso de desarrollo. «He estudiado Go y mi decisión actual es lograr el dominio de Rust, ya que el código generado por Rust tiene mayor rendimiento que el código generado por Go», dice el desarrollador.
Uso de lenguajes de programación en un proyecto específico
Jean Pierre Dudey, del proyecto Locha, una red de malla planificada para transmitir mensajes, servicios y transacciones de Bitcoin fuera de línea, también conversó con CriptoNoticias sobre los lenguajes de programación usados en proyectos asociados a Bitcoin.
Dudey coincidió con Calderón en que proyectos como Bitcoin utilizan C++ porque tiene más control del entorno donde se ejecuta. «Otros lenguajes de más alto nivel (Python, Go, Javascript, etc.) mayormente se utilizan para aplicaciones relacionadas con Bitcoin en materia de interfaz de usuario para carteras, por ejemplo, y no para los nodos», dice Jean Pierre Dudey
¿Cómo abordaron la escogencia del lenguaje o lenguajes a usar en el Proyecto Locha?
En Locha, para el firmware de los dispositivos utilizamos el lenguaje C, debido a que es el lenguaje por defecto a utilizar en los sistemas embebidos, debido a la rapidez y a que cuenta con mayor soporte. Otros lenguajes tienen fallas principalmente en el punto de soporte, y en el firmware de Locha se trata de ser lo más portable posible para correr en diferentes piezas de hardware.
Jean Pierre Dudey, desarrollador en Locha Mesh.
Dudey se refiere al dispositivo denominado Turpial, a través del cual se envían los mensajes a la red de malla y las transacciones de Bitcoin. Recientemente, el proyecto anunció que también incluirá el envío y recepción de transacciones de Monero.
Para la aplicación móvil, señala Dudey, se utilizan diferentes lenguajes de programación dependiendo de lo que se requiera en términos de portabilidad entre iOS y Android. Por eso, dice, se suele usar una mezcla de Javascript, Java, y Swift, entre otros.
En cuanto a lenguajes emergentes, con capacidad para igualar en capacidad a C o C++, Dudey afirma: «Rust como lenguaje promete, es el siguiente paso en lenguajes de sistemas compilados como C y C++». Este lenguaje, dice Dudey, provee muchas características de seguridad para evitar fallos que comúnmente suceden en otros lenguajes en término del manejo de la memoria. «Promete también en rendimiento; en muchos benchmarks, Rust supera a C y C++ en algunos casos».
No confíes, verifica
CriptoNoticias también contactó a Leo Wandersleb, fundador de Wallet Scrutiny y desarrollador líder de la cartera de Bitcoin Mycellium. Walletscrituny.com es un sitio web que realiza una revisión de las carteras desde el punto de vista de seguridad, partiendo de una posición escéptica: ¿hay algún indicio en el código de las carteras de que unos desarrolladores deshonestos puedan robar todos los BTC de sus usuarios?
Desafortunadamente, no es posible realizar dicha revisión pues, salvo pocas excepciones, hay obstáculos para acceder al código. Es decir, en el caso de las carteras de Bitcoin y de aquellas que son multimoneda, la gran mayoría, o usan código propietario, o el código no está accesible.
Sólo seis de las carteras examinadas por Walletscrutiny tienen un código «reproducible». Es decir, si se toma el programa fuente que aparece en el repositorio de la cartera en GitHub y se compila, el programa ejecutable resultante se comporta de forma consistente con la versión respectiva que ofrece el desarrollador.
Las carteras con código reproducible (indicamos los lenguaje de programación usados), según Walletscrutiny, son: Bitcoin Wallet (Java 100%), Mycelium (Java 81%, Kotlin 19%), Green (Java 99,6%), ABCore (Java 99,4%), Unstoppable (Kotlin 99,6% y Ruby 0,4%) y AirGap Vault. Esta última ha sido programada con TypeScript (70,9%), Swift (8,2%), Kotlin (6,5%) y otros lenguajes.
Java está presente en cuatro de seis proyectos y Kotlin, un lenguaje dedicado a las aplicaciones nativas de Android, tiene participación variable en tres de los proyectos.
Para dispositivos Android, Java y Kotlin son populares para el desarrollo de carteras de Bitcoin y otros proyectos, pero considerando los dispositivos Apple, JavaScript es también usado. Rust no está concebido para aplicaciones móviles pero pienso que al final, siempre hay entusiastas de cualquier lenguaje que van a programar una cartera de Bitcoin en ese lenguaje.
Leo Wandersleb, desarrollador líder de la cartera de Bitcoin Mycellium Android.
Efectivamente, cuando se examinan los proyectos de carteras de Bitcoin en GitHub hay para todos los gustos. Tomando los 30 proyectos mejor calificados, Java y JavaScript figuran en 9 y 5 proyectos respectivamente, lo que representa 47% del total. También aparecen lenguajes como Go (13%), Objective C (10%), Swift (7%) y otros (23%).
A pesar de que siempre existirán vías hacia la especialización en un determinado lenguaje de programación, Wandersleb cree que un programador debe conocer varios lenguajes. Respecto a Rust, dice que no está familiarizado aún con ese lenguaje.
Si fuese necesario, estoy seguro de que un desarrollador requeriría unos días de estudio y práctica para llegar a un punto en el que puede hacer una contribución significativa a un proyecto de Rust. Los desarrolladores que nieguen esto, probablemente no han profundizado aún en algún lenguaje.
Leo Wandersleb, desarrollador líder de la cartera de Bitcoin Mycellium Android.
Es previsible que en lo que se refiere al protocolo de Bitcoin, C++ siga coexistiendo con otros lenguajes que compensen sus aspectos más débiles, aunque hasta ahora esta venerable herramienta es responsable por más de dos tercios del código ejecutable de Bitcoin Core.