Programando sobre Ethereum

Hace un tiempo, un amigo me habló de Ethereum. En un principio pensé que era una criptomoneda más, una de tantas otras que surgieron a raíz del éxito de la Bitocin. Pero tras documentarme un poco sobre ella, pronto me di cuenta de que estaba equivocado. Nos encontrábamos ante algo distinto.

Ethereum es una plataforma descentralizada con la capacidad de ejecutar fragmentos de código llamados smart contracts (o contratos inteligentes.)
Nos encontramos, por tanto, en un paradigma diferente al archiconocido modelo cliente-servidor. En este nuevo sistema, todas las máquinas que están corriendo nodos de ethereum, es decir, todas las máquinas que forman parte de la red, tienen la misma categoría (pares). No existe una entidad central (servidor) que controle el software, lo cual evita posibles tiempos de caída de la red, fraude o interferencia de terceras partes.

Ethereum se construye sobre un blockchain, al igual que ocurre con la red Bitcoin y el resto de criptomonedas que llegaron tras ésta, sin embargo Ethereum debería verse más bien como un gran ordenador descentralizado.

No debe confundirse con computación distribuida donde cada máquina ejecuta un trocito de un programa y la capacidad de cómputo del sistema es mayor a la de cada una de las máquinas por separado. No. En Ethereum, cada una de las máquinas ejecuta todo el programa de manera independiente, y todas deben proporcionar los mismos resultados. Deben llegar a un consenso. Es por esto que la capacidad de cómputo de Ethereum no es muy alta y deben tomarse medidas para impedir que alguien consuma ciclos de procesamiento de manera maliciosa.

Esto se consigue añadiendo un coste a la ejecución de instrucciones. Cada vez que ejecutamos una instrucción, se consume gas, y el ejecutor de dicha instrucción debe pagar el coste del gas. Este coste se paga en ether, que es la criptomoneda que funciona sobre la red Ethereum.

El código de Ethereum corre sobre una máquina virtual (EVM), y está escrito en bytecode. Sin embargo, disponemos de lenguajes de alto nivel como el Solidity que nos permiten programar de manera sencilla.

¿Qué necesitamos para programar un smart contract sobre la red Ethereum?

  • Un nodo privado de Ethereum sobre el que realizar las pruebas.
  • Un entorno de desarrollo con un compilador de Solidity.

Montando un nodo privado de Ethereum

Existen varios nodos de ethereum diferentes, programados en distintos lenguajes. En este caso, vamos a utilizar Geth, creado por los desarrolladores de Ethereum y uno de los más conocidos.
Existen versiones de Geth para Windows, Linux y OSX, incluso podemos descargarnos el código fuente y compilarnos nuestro propio Geth. En mi caso, lo instalare para Mac OSX mediante Homebrew.

$ brew tap ethereum/ethereum
$ brew install ethereum

Si ahora arrancamos Geth, estaríamos corriendo un nodo de la red Ethereum, y por lo tanto necesitaríamos sincronizar el blockchain que contiene todas las transacciones que se han llevado a cabo desde los orígenes de la red. En este caso no queremos conectarnos a la red Ethereum, sino que queremos crear nuestra propia red privada sobre la que realizar pruebas de desarrollo sin utilizar ether real.
Para ello, arrancaremos Geth en modo desarrollo, indicando una ruta en la que se almacenarán los datos de esta red alternativa.

$ geth –ipcpath /ruta/test/geth.ipc –datadir /ruta/test/ –dev

Ahora que ya tenemos nuestra red privada (formada por un solo nodo), vamos a conectarnos a ella. Para ello, en una nueva terminal ejecutamos:

$ geth –attach ipc://ruta/test/geth.ipc

A continuación crearemos una nueva cuenta protegida por una contraseña. Para ello, en la consola Geth teclearemos:

> personal.newAccount(‘contraseña’);

Podemos crear casi tantas cuentas como queramos. (Concretamente 2^256 cuentas, ya que las claves privadas de las cuentas son de 256 bits) .
Como hemos dicho anteriormente, para poder ejecutar código necesitamos ether. Podemos generar ether mediante un proceso conocido como “minería”. Conseguir ether en la red real es un proceso muy lento y requiere actualmente GPUs muy potentes ya que de momento Ethereum utiliza un sistema de minado de Proof of Work (PoW), sin embargo en la red privada podemos conseguir grandes cantidades de ether en segundos. Para ello arrancaremos el minero.

> miner.start();

Podemos detenerlo cuando hayamos añadido unos cuantos bloques a la cadena mediante el comando:

> miner.stop();

Para comprobar nuestro balance actual de ether podemos utilizar el comando:

> web3.fromWei(eth.getBalance(eth.coinbase), “ether”)

Bien, llegados a este punto ya tenemos corriendo nuestro nodo de Ethereum privado, y tenemos en la red privada una cuenta con cierta cantidad de ether. Ahora vamos a la siguiente parte, el entorno de desarrollo.

Arrancando el entorno de desarrollo

El entorno de desarrollo de Ethereum (o más bien, uno de ellos) se llama Remix. Para acceder a él vamos a instalar Mist. Mist es un nodo de Ethereum gráfico que contiene dicho entorno de desarrollo para el lenguaje Solidity.

Si arrancamos Mist sin más, el propio Mist arrancará por debajo un nodo Geth que se conectará a la red global de Ethereum. No queremos esto. Queremos que Mist se conecte al nodo Geth que previamente hemos arrancado en nuestra máquina. Ese nodo Geth que arrancamos en la sección anterior, y que forma parte de una red privada. Para ello, ejecutaremos Mist con los siguientes argumentos:

$ ./Mist –rpc /ruta/test/geth.ipc

Comprobamos que en efecto Mist está conectado a la red privada, en la que figura nuestra cuenta con nuestro balance.

Para abrir el entorno de desarrollo Remix iremos al elemento Desarrollo del menú superior, y ahí pincharemos en Remix IDE.

Ahora no tenemos más que escribir nuestro software en lenguaje Solidity (Por defecto el entorno se abre con un ejemplo llamado ballout.sol).

En el sigueinte repositorio de github podemos encontrar algunos ejemplos de código de smart contracts sencillos escritos en solidity y bien comentados para principiantes.

Una vez escrito nuestro software, debemos enviarlo al blockchain para que tenga algún efecto. Esto hará que se cree una cuenta y se almacene en ella nuestro programa (smart contract), permitiendo a todos los usuarios de la red la ejecución de nuestro código.
Para ello, pulsaremos el botón rojo de create en el Remix y firmaremos la transacción con la clave privada de nuestra cuenta. Este proceso escribe datos en el blockchain, y por tanto consumirá gas.
Si el proceso de minado está detenido, la red estará congelada y la transacción no se verá reflejada, así que en ese caso, arrancaremos de nuevo el minero.

Bien, una vez aquí, ya tenemos nuestro contrato en la red (En la red privada, sobre la que estamos trabajando, por supuesto), y cualquier usuario (De esta red, que seguramente seamos solo nosotros) podrá ejecutarlo. ¿Qué tendríamos que hacer ahora para ejecutarlo?

Por una parte necesitamos el ABI (Aplication Binary Interface) de nuestro contrato y por otra parte la dirección del mismo. Ambos proporcionados por el Remix.

Volvemos a la consola Geth y creamos un objeto en el que almacenar nuestro contrato. Pondremos en él el ABI con la interface de nuestro software y la dirección en la que se almacenó nuestro contrato.

> var nombreContrato = eth.contract(ABI).at(“DIRECCIÓN_DEL_CONTRATO”);

Una vez creado este objeto, podemos llamar a sus métodos, que serán aquellos que hayamos definido a la hora de programar nuestro contrato. Recordad que ejecutar código sobre la blockchain consume gas que se paga en ether, pero al encontrarnos dentro de nuestra red privada, esto no es un problema.

Si quisiésemos enviar un programa a la red global de Ethereum, antes tendríamos que hacernos con algo de ether. Para ello podemos o bien comprarlo o bien minarlo, pero eso ya se encuentra fuera del ámbito de esta entrada en el blog.

Esta entrada explica el proceso a seguir para programar y ejecutar nuestra primera dapp (o smart contract) desde los primeros pasos para la creación de una red privada de Ethereum hasta los últimos pasos de la ejecución del software sobre esta red.

La verdad es que encontré muy poca documentación sobre todo esto, y mucha de ella estaba ya obsoleta, motivo por el cual me decidí a escribir esta entrada que resume de manera clara y sencilla el proceso inicial de desarrollo de una daap (aplicación descentralizada) para aquellos que buscan una primera toma de contacto con Ethereum.

Written by: