¿Protege blockchain mi información personal?

Publicado el 22/12/2016, por Jesús Díaz Vico
¿Protege blockchain mi información personal?

Blockchain está de moda. Cada mes surgen nuevos sistemas de este tipo, aplicaciones que los utilizan o empresas que basan su modelo de negocio en las oportunidades que permite esta tecnología.

Pese a este gran boom, todavía existe mucha incertidumbre al respecto. Hay dudas sobre su escalabilidad, sobre su eficiencia, en algunos casos sobre la robustez de los mecanismos de consenso subyacente y también sobre su privacidad, tema en el que nos centraremos a continuación.

En el estudio sobre Bitcoin de INCIBE vimos que este sistema no proporciona anonimato, sino pseudonimato. Es decir, aunque un usuario puede crear tantas cuentas como quiera, es posible relacionarlas entre sí con un alto grado de probabilidad, salvo que el usuario se tome muchas molestias (y probablemente, asuma riesgos) para evitarlo.

Al estar la mayor parte de los blockchains actuales basados en mayor o menor medida en Bitcoin, muchos de ellos han heredado esta pseudonimia. Si, además, añadimos la propiedad de inmutabilidad que proporcionan, estamos ante una combinación peligrosa. La inmutabilidad de un blockchain implica que, una vez se haya escrito una determinada información en la cadena de bloques, ésta quedará ahí para siempre. Hay ejemplos peligrosos, como información relacionada con malware o contenido pedofílico, y curiosos, pero que también reflejan este problema, como un ASCII art de Ben Bernanke. La inmutabilidad de Bitcoin (donde está escrita esa información) garantiza que, queramos o no, esa información no podrá ser borrada.

Esta combinación de inmutabilidad y pseudonimia permite hacer análisis bastante interesantes sobre la información contenida en un blockchain típico. Pero, ¿cómo de fácil o difícil puede ser esta tarea? Como ejemplo inofensivo, a continuación utilizaremos un Afterwork que organizamos en BEEVA para jugar al Conecta4 con smart contracts de Ethereum. El objetivo de este análisis será recuperar los movimientos que hicimos en su momento, aunque ya haya pasado bastante tiempo de aquel día.

Pero ¿qué es Ethereum? ¿y un smart contract?

Ethereum es uno de los principales blockchains, excluyendo Bitcoin. Está también basado en prueba de trabajo, es decir, requiere que los participantes de la red gasten capacidad de cómputo para colaborar (aunque planean cambiar esto en el futuro). Pero lo que más fama ha dado a este sistema son sus smart contracts Turing completos. En este contexto, un smart contract no es más que un programa que se ejecuta de forma descentralizada. Es decir, todos los nodos de la red lo ejecutan y comprueban que el resultado de sus operaciones coincide con el que se ha escrito en la cadena de bloques. El término “contrato” viene de que originalmente se pensaron para automatizar contratos (legales y/o financieros), aunque los smart contracts valen para cualquier tipo de procesamiento.

Resumiendo, un participante de Ethereum puede invocar un smart contract, que estará replicado en todos los nodos del sistema, y leer el resultado de la operación invocada directamente de la cadena de bloques, sabiendo que el resultado es correcto (por supuesto, bajo el modelo de seguridad de Ethereum).

Crawleando nuestro Ethereum de Conecta4

Ethereum cuenta con una importante comunidad de desarrolladores. Entre otras utilidades, hay muchos módulos disponibles para NodeJS que permiten recorrer de manera sencilla la cadena de bloques, bloque a bloque y transacción a transacción, procesando la información que estas contienen. En concreto, podemos ver emisor y receptor de la transacción y los parámetros de la misma e incluso ejecutarla de nuevo. El término “transacción” en Ethereum sirve tanto para operaciones de envío de la criptomoneda interna, el Ether, como operaciones de invocación de una función de un smart contract. En el caso de Ethereum, estos smart contracts se ejecutan en cada nodo de la red, de forma independiente, a través de la conocida como Ethereum Virtual Machine (EVM).

No obstante, en el caso que nos ocupa, hay una ligera complicación que, al mismo tiempo, se dará en los casos más interesantes. En el escenario del juego de Conecta4 que montamos (explicado en detalle aquí), tanto el tablero de juego como los propios jugadores están modelados como smart contracts. La motivación de hacerlo así es asegurarnos de que nadie puede hacer trampas en el juego, ni siquiera el dueño de la supuesta empresa que permitiese jugar al Conecta4 desde Ethereum. Una vez ha empezado el juego, los jugadores van enviando instrucciones al tablero con sus movimientos. Estas instrucciones se envían en forma de una transacción contrato a contrato. Es decir, el smart contract “jugador” decide el próximo movimiento y envía una transacción al smart contract “tablero” para que aplique el movimiento. Esta llamada contrato a contrato no se refleja directamente en la cadena de bloques de Ethereum, ya que es lo que se conoce como un mensaje interno. Básicamente, por ahorrar espacio, los nodos que componen la red y ejecutan el código procesan la llamada como si fuera todo parte del mismo programa (aunque en realidad se estén ejecutando dos smart contracts) y sólo almacenan el resultado final. Esto no es un problema desde el punto de vista de la coherencia del resultado final, ya que el procesamiento es determinista y todos los nodos de la red llegarán al mismo resultado, por lo que no es necesario “apuntar” las transacciones intermedias.

Pero, de cara a nuestro análisis, como precisamente lo que nos interesa es ver qué interacciones ha habido entre jugadores y tableros, sí supone un problema, ya que no nos sirve con simplemente procesar bloque a bloque, analizando las transacciones de cada uno de ellos, ya que estas transacciones internas no aparecen explícitamente.

De nuevo, la comunidad de desarrolladores de Ethereum viene al rescate. Gracias a las implementaciones de la máquina virtual de Ethereum disponibles libremente, podemos reproducir exactamente el procesamiento que llevaron a cabo los nodos de la red. El único requisito es saber el estado de la red antes de ejecutar cada operación y los parámetros de la propia operación. Como toda esta información está directamente disponible en la cadena de bloques, podemos reproducir todo sin problemas.

El flujo es básicamente el que se ha comentado antes: recorrer bloque a bloque la cadena y recuperar las transacciones dentro de cada bloque. Pero, en este caso, cargamos el estado de la cadena de bloques para el bloque en cuestión dentro de la EVM. Una vez cargado, le decimos a la EVM que ejecute el código de cada transacción que hayamos visto en ese bloque. Aunque los módulos de NodeJS para Ethereum facilitan muchísimo el trabajo, el código es aún bastante complejo. Pero básicamente, el flujo es como sigue:

Donde, dentro de “runCode()”, podríamos ir capturando las operaciones que nos resultasen interesantes para nuestro análisis, capturando eventos de tipo step (que son los que lanza la EVM cuando avanza al siguiente opcode a ejecutar).

A modo de ejemplo, con un crawler del tipo mencionado, capturamos las llamadas entre contratos sobre el blockchain que utilizamos durante el torneo de Conecta4. A continuación mostramos un fragmento de las llamadas que tuvieron lugar.

captura-crawler.png

El resultado final, volviendo a las implicaciones de privacidad: podemos saber, con total precisión, qué jugador invocó qué tablero, en qué momento concreto y con qué parámetros, pudiendo reproducir completamente las partidas de Conecta4 que jugamos en BEEVA hace meses. Extrapolando este ejemplo didáctico a escenarios más delicados, como transferencias financieras, gestión de activos, etc. el resultado podría ser bastante conflictivo. Por ejemplo, una de las propuestas de Slock.it (a quienes afectó bastante el hack a TheDAO), es controlar cerraduras inteligentes a través de smart contracts en Ethereum (permitiendo abrir o cerrar la cerradura en función de quién haya pagado un alquiler, por ejemplo, para crear una especie de Airbnb descentralizado). En ese caso, con crawlear Ethereum tal y cómo hemos hecho aquí, podríamos saber quién ha abierto o cerrado una cerradura, o incluso si hay alguien en una casa accesible con cerraduras de este tipo, o si la casa está vacía.

Por ese motivo, ya van surgiendo propuestas de blockchains en los que se implementa privacidad robusta desde el principio, como ZCash, Enigma o Hawk. Pero seguro que aún quedan cosas muy interesantes por venir.