Si pensamos en tecnologías realmente revolucionarias y profundamente disruptivas podemos pensar en Computación en la nube, Inteligencia Artificial y Realidad Aumentada/Realidad Artificial… pero hay un cuarto concepto, que creo que está al mismo nivel: los smart contracts. Y seguramente el común de los mortales, ni siquiera ha oído hablar de ellos…

Pero antes de nada, ¿qué es un Smart Contract?. Para responder a esto creo que lo mejor es irnos al origen, al inventor del concepto de Smart Contract: Nick Zsabo. Y fue en 1994 nada menos, cuando este señor público un whitepaper con la siguiente definición: “Yo defino un smart contact como una protocolo de transacciones computerizado que ejecuta los términos de un contrato“.

Los objetivos generales del diseño de smart contracts son satisfacer condiciones contractuales comunes (…), minimizar las excepciones tanto maliciosas como accidentales, y minimizar la necesidad de intermediarios de confianza“.

El ejemplo clásico que se pone como ejemplo de smart contract es el funcionamiento de una máquina de vending. Esta máquina tiene programado un comportamiento que responde a una sencilla condición “si introduces unas monedas de valor igual o superior al artículo que quieres, yo te doy ese artículo y me quedo con el dinero”. Y todo este funcionamiento sin intervención humana, a los efectos, la máquina es independiente para despachar productos… ese es el concepto fundamental de un smart contract. 

Smart contracts y Blockchain

En un año tan lejano como 1994, la tecnología de la época no pudo dar una implementación práctica del concepto descripto por Zsabo, así que hubo que esperar hasta la aparición de las llamadas blockchain de segunda generación, la red Ethereum de Vitalik Buterin, para que realmente tuviéramos a nuestro alcance ese protocolo computerizado para implementar smart contracts (además de manera muy sencilla), dando nacimiento al ordenador universal.

La red blockchain de Ethereal es una red pública, cualquiera que se descargue su software open source puede unirse, que hereda la blockchain de Bitcoin, añadiéndole la capacidad de ejecutar smartcontracts de propósito general. La red de Bitcoin también puede ejecutar programas, pero son programas muy específicos bastante limitados y al contrario de Ethereum, no son una “máquina Turing completa“.

En resumen, un smart contract como los que podemos implementar en Ethereum, es un programa que se ejecuta por si mismo en la red y además se ejecuta en cada ordenador que forma parte de la red… si en la red hay 10.000 nodos, el programa se ejecutará 10.000 veces. Y no sólo eso, se comprobará que el resultado del programa, la transacción que se grabará en la cade de bloques, es el mismo para las 10.000 ejecuciones. Y si algún nodo, da un resultado distinto, el mecanismo de consenso inherente a la red blockchain se encargará de poner las cosas en orden y grabar la transacción que se considera como verdad. Dicho de otro modo, los cientos o miles de ordenadores que forman parte de la red, en realidad, funciona como un solo, un ordenador universal.

Este modo de funcionamiento tiene algunas consecuencia sumamente interesantes:

  1. La ejecución del smart contract es imparable. Es decir, aunque varios nodos se caigan, haya un terremoto o cualquier otra maldición bíblica sobre una zona o varias del planeta, siempre quedarán ordenadores conectados a la red que ejecutarán el contrato.
  2. En la implementación de un smart contract no se puede utilizar números aleatorios (random)… ¿por qué? Porque si fueran aleatorios el resultado del programa no sería el mismo en todos los nodos y esto va a en contra del concepto de ordenador universal.
  3. Un smart contract no puede acceder a internet para conseguir un dato. La razón, es la misma que la anterior, si se accede fuera de la red, el dato obtenido podría no ser el mismo para todas las ejecuciones. Sin duda este es un problema bastante importante de la red y trata de resolverse con el concepto de Oráculo pero perdiendo parte del concepto de blockchain.
  4. Un smart contract es inmodificable. Una vez desplegado en la red no se puede cambiar ni actualizar. Si eres desarrollador, sin duda esto te llamará poderosamente la atención… ¿qué una vez desplegado un programa no lo puedo cambiar? Si se pudieran cambiar los términos de un contrato cuando una parte quisiera sería un caos y un fraude ¿no?.
  5. Al desplegar o invocar un método del smart contract estamos consumiendo recursos de la red de ordenadores, y este consumo hay que pagarlo. Por lo tanto, para invocar a cualquier método del smart contract tenemos que pagar con la moneda de la red, el ether., que nos proporciona “gas” que es lo que mueve la ejecución.. nada es gratis ;-). Yo siempre pongo del dólar y la gasolina. Para que ande un coche es necesario llenarle el depósito con gasolina (el gas de Ethereum) y esta gasolina se paga en dólares (el Ether)

Un ejemplo muy sencillo de Smart Contract

Llegados a este punto, creo que lo mejor es que veamos un ejemplo de un smart contract de Ethereum, uno muy sencillo pero que creo que bastante ilustrativo. Imaginemos que queremos poner un “tablón de anuncios” en blockchain, una simple cada de texto. Y la gestión de este anuncio será “gobernado” por un smart contract.

En Ethereum se utiliza un lenguaje de alto nivel, parecido al Java o al Javascript, llamado Solidity. Como en Java, este lenguaje se compila a un lenguaje de más bajo nivel que se ejecuta en una máquina virtual (Ethereum Virtual Machine). Este código fuente compilado es el que se despliega en la red (el propio código fuente se graba en un bloque de blockchain al desplegarse).

En el ejemplo anterior vemos que en la primera línea hay una sentencia tipo “pragma” que indica la versión de solidity que se está usando.

Para definir un smart contract, que se puede ver simplemente como una clase Java o de cualquier otro lenguaje de programación, empieza con la palabra “contract” y el nombre que el ponemos la contrato, en este caso “TablonGratuito”.

A continuación tenemos una variable llamada “anuncio” que va a contener el string con lo que queremos publicar en el tablón. Como se puede ver, está declarada con el modificador “public”. ¿Qué significa esto? Pues que esta variable puede ser leída por cualquiera que acceda al blockchain (no puede ser escrita).

Seguidamente tenemos un constructor, que es una función que se ejecutará un única vez, cuando se despliega el contrato. En este caso, simplemente se le pasa un string inicial que se guarda en la variable anuncio.

Y después tenemos la función “ponerAnuncioGratis” que es el único método de negocio de este sencillo smart contract. Si se llama a este método con nuevo anuncio este se asignará a la variable “anuncio” y como resultado de la ejecución, se grabará el resultado de la transacción del contrato. Es decir, se grabará el anuncio en la cadena de bloques.

Espero que con este post te haya despertado el gusanillo por los smart contracts, sin duda un concepto revolucionario y que realmente pienso que transformará nuestra vida… si no me crees échale un vistazo a este post.

Anuncios