Porqué un informático debe interesarse en Bitcoin / block chain

Para quienes no siguen lo que acontece en el mundo generalmente es difícil entender, adoptar y adaptarse a los cambios, pues son procesos que toman tiempo. En muchos países todavía se observa este fenómeno, quizá por la ausencia de una elite que este conectada y por tanto tenga la capacidad, a falta de obligación, de visualizar el rol de su país frente al mundo que cambia, o simplemente descartar ideas que no aportan al desarrollo. En nuestro país, en la política, la cultura y la tecnología son contados los casos en donde se han adoptado ideas de vanguardia. Es así como incluso ideas nefastas y fracasadas de la política llegan 30 o 40 años tarde, cuando la población ya ha decidido cual es la mejor para el momento.

Escribo lo anterior para engatusarle colega a que siga leyendo y a la vez brindarle un pequeño ejercicio de contexto y memoria. Salvo contados casos, todavía existe un gran número de colegas que viven un día a día tecnológico de los años 90. Sí, en tecnología la brecha es menor en términos de tiempo. Ocurre que la tecnología tiene otra velocidad. En los próximos párrafos intentaré llevarle a la actualidad tecnológica al comentarle de lo que hoy se está desarrollando y, para hacerle la vida fácil, vincularé todo eso con lo que usted ya conoce bien por mérito propio o por haberlo aprendido en su formación profesional, que también es un mérito, como no. Le hablaré de Blockchain, específicamente de Bitcoin y Ethereum, y de porqué usted como profesional o estudiante de informática debería interesarse en este mundo.

El primer motivo por el cual usted debería interesarse en esta tecnología es por simple curiosidad intelectual. Independientemente de su profesión, si usted es serio respecto a su desarrollo profesional debería cuanto menos informarse y aprender sobre las nuevas ideas que existen o están en desarrollo en su industria. La cultura occidental está aquí hasta hoy porque ha privilegiado la economía de las ideas. Desde Grecia y las principales ciudades de Europa, en donde se ha creado el concepto de universidad como usted la conoce hoy, hasta los actuales centros mundiales de desarrollo económico como Londres, la bahía de San Francisco, Nueva York, etc; son las mejores ideas las que ganan adeptos y se difunden e implementan en el mundo. Por esto, usted debería estar enterado a fin de mejorar las suyas o simplemente identificar y aplicar aquellas que le permitan resolver algún problema de manera eficiente. Algunos llaman a eso innovación.

En adelante vamos a lo que nos apasiona. Es decir conocer las ideas tecnológicas que hacen de Bitcoin algo atractivo. La primera idea que quizá pasa desapercibida es que Bitcoin por primera vez implementa algo que va en contra de la naturaleza de la informática, que es la copia. Para que usted juegue DOTA o utilice WhatsApp debe haber descargado o instalado un programa, que es copiado desde un lugar en Internet u otro medio como un DVD a su computador o móvil. Cuando arranca el programa, éste se copia a memoria y es desde allí que se ejecuta en la unidad de procesamiento (CPU). Cuando accede a una imagen en un sitio web lo que visualiza es una copia de la ésta que se ha copiado al disco duro en su computador. Bitcoin implementa por primera vez un algoritmo que produce un efecto diferente y que es análogo a lo que ocurre cuando yo le entrego una moneda. A partir de ese momento solo usted la tiene, no existe una copia en mi bolsillo. Únicamente esta idea abre grandes posibilidades en computación. Su aplicación más directa ha sido su uso como moneda digital, objetivo principal de Satoshi Nakamoto creador de Bitcoin.

Bitcoin también ha implementado ideas respecto a sistemas distribuidos. Este curso que explica conceptos como consumidor/productor, cliente/servidor, especialización, servicios (SOAP, RPC) y que ha tenido alguna actualización con la computación en la nube; donde se estudia el algoritmo Map-Reduce, etc. Ahora tiene un nuevo objeto material: la implementación de la base de datos distribuida que contiene todo el historial de las transacciones a la que se denominada “block chain” o cadena de bloques. Para lograrlo, se han implementado dos ideas de por si interesantes. La primera relacionada al propio almacenamiento de datos de las transacciones y la segunda sobre cómo se garantiza la integridad de esas transacciones.

En la cadena de bloques los datos se almacenan en bloques individuales. Cada bloque contiene un número fijo de transacciones (datos). Cuando se completa un bloque, se obtiene un “Hash" el cual se utiliza en el nuevo bloque como un puntero a este. Piense en esto como una lista enlazada, solo que además de tener un puntero al bloque o elemento anterior, también puede verificar si una transacción existe o no en el bloque anterior solo con ese “Hash". Esto gracias a que se emplea árboles Merkle, del cual hablaremos luego. Este “Hash" además sirve para comprobar si el bloque anterior se ha modificado, por tanto se puede tener la seguridad de que las transacciones almacenadas allí no se modificarán, pues si fuese el caso se detectaría de inmediato. Bitcoin ha sido el primero en aplicar el concepto de una cadena de bloques el año 2009, una idea relativamente reciente.

La base de datos distribuida se reparte en nodos de una red punto a punto, que pueden ser completos (full), aquellos que tienen una copia completa, y ligeros, que solo almacenan un resumen o los n últimos bloques (Hash). En el caso de Bitcoin se implementa el algoritmo de tolerancia a fallos Bizantino (BFT), que tiene relación con el problema de los generales bizantinos. Para garantizar la integridad de los datos se implementa un algoritmo de consenso. Bitcoin utiliza la prueba de trabajo (Proof of Work) que hace que los nodos compitan computacionalmente entre sí para demostrar que han creado un número arbitrario con el cual se pueda crear un nuevo bloque. En la práctica consiste en resolver algoritmos criptográficos de modo que aquel sistema de hardware que esté mejor optimizado para este tipo de procesamiento va a tener ventaja y generar el nuevo bloque. Este bloque se anuncia a la red y los nodos lo verifican (usando su “Hash") y confirman que éste es el nuevo bloque o intentan generar otro bloque, lo cual podría no ser tan buena idea pues podrían hacerlo en vano desperdiciando recursos y perdiendo la oportunidad de generar el siguiente. Este proceso es lo que se conoce como minería y la razón por la cual los mineros son recompensados con nuevos Bitcoin. El algoritmo de prueba de trabajo por un lado permite mantener una única línea de historia (los bloques de color negro en el gráfico), pues un nodo podría colocar transacciones en un bloque y anunciarlo como el siguiente; y por otro fortalece la red ya que incentiva a los miembros a mantener un nivel alto de recursos computacionales.

Seguramente has oido e incluso implementado arboles Merkle o Patricia, resulta que son estructuras de datos ampliamente empleadas en Bitcoin, y no solamente a nivel del protocolo. El árbol Merkle permite realizar resumen de resúmenes y son estos los que se almacenan en el disco, con lo cual se logra eficiencia y un horizonte de crecimiento bastante largo. Por cada transacción se obtiene un Hash. Con cada Hash individual de las transacciones se forma el árbol y es su raíz, un Hash de las ramas, la que se almacena en el bloque. Las transacciones se realizan desde un par de llave privada y pública que se administra desde un nodo. En términos concretos lo que se conoce como monederos o billetera es un juego de claves pública y privada. Esta no se emplea para almacenar la moneda digital, digamos como un disco o fichero cifrado, sino que es la única que puede efectuar transacciones con las partes registradas en diferentes lugares en la cadena de bloques. Se podría decir que el total de los BTC que una clave (persona o programa) posee se compone de diferentes partes distribuidas en la cadena, de la misma manera que un archivo se puede almacenar en diferentes lugares “físicos” del disco duro. Si ha utilizado algo como un defragmentador en Windows lo puede visualizar de manera similar.

Hemos aprendido los componentes más interesantes de esta tecnología. Todavía hay más. En el caso de Bitcoin además de las transacciones también se puede almacenar código o programas. Los creadores de Ethereum, años después, han pensado que todo esto es muy similar a un gran computador y es lo que han desarrollado. Dadas las características de esta tecnología estamos frente a algo que puede tomar la forma de un gran computador global que no se puede apagar, censurar, no falla, es seguro, multi-usuario, orientada a objetos de forma nativa, accesible y verificable o auditable. Además de que solo es necesario contar con acceso a Internet para usarlo.
Al día de hoy no se conoce alguna falla de seguridad en Bitcoin. Aquí me refiero al protocolo y no a los sitios de intercambio o apuestas que empleaban Bitcoin como moneda, y almacenaban las llaves privadas de sus clientes en un servidor tradicional en Internet, ergo inseguro. Esto también representa un enfoque distinto a la seguridad informática. En lugar de proteger y esconder la infraestructura de la organización con diferentes capas de cortafuegos y anti-virus, Bitcoin lo hace público, por tanto expuesto directamente a ataques, y seguro desde su diseño. Hasta ahora es el sistema de transacciones financieras más seguro que conocemos.

Volviendo al gran computador global, conocemos que nos asegura la atomicidad, dado que se ejecuta todo el programa o no; sincronización, no existe interferencia entre operaciones. El bloqueo mutuo o las condiciones de carrera ya no son un problema; y se puede identificar el origen de cada mensaje o llamada. Por supuesto, también contamos con las garantías de permanencia e inmutabilidad que ya ofrece la cadena de bloques. ¿Qué se puede hacer allí entonces? Aunque puede que esta sección merezca todo una publicación aparte, no nos alejaremos el objetivo que es interesarle en la tecnología. Ethereum implementa un entorno Turing-completo lo que significa que usted puede programar allí lo que se le ocurra. En el caso de Bitcoin el entorno no es Turing-completo por diseño. ¿Cómo se programa? Pues al igual que con la computación tradicional, existen dos maneras: lenguajes de bajo y alto nivel. En el caso de Ethereum existe la máquina virtual de Ethereum (EVM), en donde se puede programar en Bytecode, tal cual usted lo haría en la máquina virtual de Java (JVM), o en lenguajes como LLL, Serpent y Solidity. Incluso podría implementar el suyo propio de la misma forma como se ha creado Scala para la JVM. Solidity es el preferido por aquellos que nos hemos aventurado a programar lo que se conoce en Ethereum como “Smart Contracts” y es un lenguaje con una implementación bastante similar a Javascript.

Antes de ir con los contratos inteligentes quiero reparar en lo de Turing-completo. Está claro que uno puede programar lo que se le ocurra según esa primera premisa. Sin embargo, también es claro, y algo en lo que muchos no reparan, que así como uno no puede colocar un juego como DOTA en un Nokia 3010; uno debe entender el entorno sobre el cual uno va a colocar sus programas. Es decir, por las características del protocolo hay cosas que uno puede hacer y otras que no, por diseño. En primer lugar, para interactuar con los programas en un blockchain uno necesita un cliente, al ser una red punto a punto. Esto es similar a interactuar con un servidor de chat IRC. En términos técnicos, un cliente es un nodo, y muchas veces se confunde el nodo con un servidor de “minado”. Los nodos tienen interfaces RPC a través de la cual un tercer cliente se puede comunicar con la red. Es el mismo caso cuando se utiliza una aplicación web para acceder a IRC, la aplicación implementa un cliente a través del cual uno accede a la red. Este aspecto es una de las principales barreras para lo que se llama las DApps, que son los contratos inteligentes más una interfaz de usuario (a menudo web), pues la tecnología para hacer esta interfaz entre la blockchain y aplicaciones web aún está en desarrollo. Metamask es un plugin de Chrome que permite enlazar al navegador con el blockchain.

Los programas, así como las transacciones, se registran en los bloques y tienen direcciones. Para instalar un programa lo que se hace en esencia es una transacción de valor 0 dirigida a una dirección especial (0x0) y en un campo especifico se coloca el código ya compilado, si se utiliza un lenguaje de alto nivel. Estos programas se propagan en bloques por todos los nodos, y por tanto se procesan de la misma manera. Aquí recordamos nuestros conocimientos de programación paralela para reparar en que así como no todos los algoritmos se deben implementar en paralelo, en un sistema distribuido también existen restricciones. Por ejemplo, el caso de uso de obtener información de una fuente externa, digamos la cotización de una acción en la BVL, para ejecutar una acción en el programa es posible de implementar, pero no es viable. Basta que un nodo obtenga una información diferente para invalidar la transacción o ejecución. Esto debido a que blockchain es un sistema basado en consenso y los algoritmos deben ser deterministas.

Actualmente se viene produciendo diferentes herramientas para ayudar al desarrollo de estos programas. Empresas como Microsoft están haciendo aportes interesantes, por ejemplo, la inclusión de un verificador de código en Solidity en sus herramientas de desarrollo. También existen herramientas que ayudan al despliegue como Truffle, y entornos de desarrollo enfocados en la seguridad del código, como Zepellin. Finalmente, versiones ligeras (nodos ligeros) y redes de prueba (especialmente en Ethereum) tanto para que uno no tenga que descargar todo el blockchain, que a la fecha son alrededor de 80GB para Bitcoin y 30GB para Ethereum; como para que no necesite contar con BTC o Ether para efectuar las transacciones.

En el caso de Bitcoin con el tiempo, y al convertirse en esencia en un negocio, se ha hecho una práctica de los mineros (quienes operan los nodos completos) el cobro por las transacciones que procesan. Este cobro varía por cada operador. En Ethereum se ha creado el concepto de Gas que trata de resolver el problema de la parada (“halting problem”) de los programas. Dado que este entorno nos permite programar libremente, la red debe tener un mecanismo de protección frente a este problema, que es el decidir si un algoritmo va a finalizar o va a ejecutarse infinitamente. El concepto de Gas por tanto se ha ligado al consumo de recursos y no al tamaño, ciclos o tiempo de ejecución del programa. Es decir por cada llamada (paso) que realiza identificando si se trata de uso de memoria, almacenamiento, procesamiento, etc. Un programa puede ejecutarse en 1 segundo en un nodo y en 0.08999 en otro con lo que no habría una forma eficaz de medir. En Ethereum es el programa / transacción quien señala cuanto quiere pagar de Gas y es el nodo quien decide si acepta el precio o no, con lo que indirectamente se logra competencia y un mercado.

Respecto a los programas hay que señalar que cada uno tiene un espacio propio de memoria y almacenamiento (base de datos) donde puede almacenar información ad-hoc en estructuras de datos como diccionarios o mapas. Los programas se ejecutan de acuerdo a los datos que reciben (“data flow”) y se invocan (ejecutan) al realizar una transacción con destino a la dirección que tienen. Los programas pueden invocar otros programas, a través del mismo mecanismo, pero no pueden modificar los datos de otros programas. En los lenguajes de alto nivel uno puede emplear los patrones de diseño que conocemos en programación orientada a objetos, utilizar “includes”, get/set, etc. También pueden utilizar estructuras de datos como arreglos, matrices, mapas (clave, valor), etc. Además de lo explicado la EVM implementa pila, variables de entorno (por ejemplo, la fecha y hora actual, o “timestamp”), y registros (logs).

Si me he dejado entender, habrá aprendido que esta tecnología implica muchas áreas y conceptos de informática. Tenemos a seguridad, sistemas distribuidos, cifrado, lenguajes de programación, compiladores, base de datos, teoría de computación y quizá esto sea solo la superficie pues es algo que está aún en desarrollo y usted puede ser parte de ello. Posiblemente tengamos una web distribuida que funcionará de una forma totalmente distinta a la que conocemos hoy y este es uno de sus momentos fundacionales. En Internet existe poca información en español sobre el tema y espero que este haya sido mi grano de arena al respecto. Agradezco que haya tenido la amabilidad de acompañarme hasta este punto. Le invito a continuar la discusión o profundizar en algunos temas aquí.

5 me gusta