Más que criptomonedas. Esenciales Blockchain & Ethereum. Parte I

Publicado por Ángel Martínez el

BlockchainEthereumGethMist

Blockchain, Cadena de Bloques o DLT (Tecnología de Contabilidad Distribuida) es una tendencia que ahora mismo nos permite solventar casos de uso reales de negocio, en diferentes sectores, no solamente en el financiero. Es más, el dominio más popular es la logística, gestión de la cadena de suministro e IoT.

En esta serie de artículos crash, orientados a Desarrollo, vamos a intentar dar luz a esta amplia y novedosa tecnología. Vamos a tratar en ellos (no de forma lineal):

  • Tipos de Redes y Nodos, Algoritmos de Consenso y APIs principales de gestión.
  • EVM (Máquina Virtual Ethereum), Smart Contracts o Contratos Inteligentes, y el lenguaje de programación estándar de facto para ellos llamado Solidity.
  • Escenario general de herramientas y software asociado.
  • Implementaciones DLT y Plataformas BaaS (Blockchain as a Service).
  • Desarrollo de DApps (Aplicaciones Descentralizadas).
  • Desarrollo de Tokens propios.
  • Otras piezas de este ecosistema como por ejemplo los Sistemas de Ficheros Descentralizados.

Y concretando en este primer artículo, nos centraremos en el funcionamiento, tecnología y terminología básica, así como la construcción de una red privada, apta para poder jugar y practicar todo lo mostrado en esta serie.

Dad por sentado que todo está en continuo movimiento, y hay herramientas o frameworks que se alzan, mientras que otros desaparecen o son englobados en otros. También hay evoluciones de base, intentando ganar escalabilidad en la red, mejoras en seguridad, o cambiando los algoritmos de consenso (mediante motores de consenso personalizables).

Empecemos

Partamos de una tabla con las características clave de la cadena de bloques. Que todos sepamos qué es esto:

Estos son los ingredientes que toda Blockchain contiene. Seguro que ya podemos pensar en qué casos de uso puede aplicarse esta tecnología y en cuáles con una PKI implementada y una base de datos centralizada con rigurosos permisos no tiene sentido...

Actualmente estamos sumergidos en dos concepciones, la Blockchain que sustenta la criptomoneda más famosa, llamada Bitcoin, y Ethereum, que añade procesamiento o cómputo. Veamos sintéticamente sus diferencias:

(*) Realmente existe Bitcoin Script Language (BSL), pero es un lenguaje de muy bajo nivel basado en pila y enfocado a bloquear/desbloquear bajo ciertas condiciones transacciones (pagos). Existe el lenguaje Ivy, de alto nivel para lidiar con el BSL, pero no tiene en su conjunto la potencia de los Smart Contracts, de ahí que lo descartemos para casos de uso orientados a negocio y a empresas.

Con todo esto, podemos abreviar que Bitcoin, es una Blockchain que suena a criptomonedas, criptodivisas o a dinero, mientras que Ethereum es una Blockchain que suena más a procesamiento y a construcción de programas/lógica.

Por último, y ya centrándonos en Ethereum, vamos a ver unas nociones que necesitamos conocer para ya ponernos a trabajar.

  • La moneda asociada es el Ether (ETH) y como unidad o cifra que es, posee múltiplos y submúltiplos, siendo el más conocido el Wei.
  • Como la red Bitcoin, la creación y validación de nuevos bloques, conlleva una recompensa (incentivo) pagada en Ethers.

Existen 2 tipos de cuentas:

Cuenta Externa (EOA, Externally Owned Account o simplemente Account), que tiene una “dirección” y es controlada por una Private Key que es protegida por una contraseña. Además, tiene un balance en ETH y permite realizar transferencias.

Es decir, es una cuenta que a través de una “dirección” y una contraseña, que me permite recibir y transferir Ether.

Cuenta de Contrato (Contract Account o Wallet Contract), que tiene una “dirección”, pero no tiene Private Key. Tiene un balance en ETH, y maneja/ejecuta código y almacenamiento.

Al tener código por detrás, proporcionan una personalización de su comportamiento y ofrecen ventajas frente a la Cuenta Externa.

También tienen desventajas, siendo la más importante que para crearlas y usarlas hay que pagar por ello.

Pueden ser:

  • Cartera simple (Simple Wallet o Single Owner Account): una EOA es el creador y el propietario de esta cuenta contrato.
  • Cartera multifirma (Multisignature Wallet Contract): una EOA es el creador y puede tener múltiples EOAs propietarias.

Al ejecutarse una transacción, como se hace uso de los recursos de la EVM(Máquina Virtual Ethereum), tanto de cálculo y almacenamiento, hay que pagar una comisión en ETH por parte de la cuenta que la origina.

El Gas es la unidad de medida de los recursos usados por la EVM. Y cada transacción es un conjunto de instrucciones “máquina” en la EVM que tienen un uso de gas fijo.

Por lo tanto, cuando lanzamos una transacción, la comisión final a pagar será la suma de las unidades de Gas de las instrucciones, por el precio de cada unidad de Gas que el usuario establece. Los mineros (los nodos que van a validar y agregar nuestra transacción en la cadena de bloques), deciden un valor de gas mínimo aceptable.

Creo que ya tenemos una base importante, ¿no?. Ahora vamos a montar un nodo local Ethereum en nuestro equipo. ¿Qué significa esto?

  • Obviamente, que implementa el protocolo de la blockchain Ethereum.
  • Se conecta a otros nodos (peers) para sincronizarse.
  • Te da acceso a la cadena de bloques y te permite interactuar con ella.
  • Gestiona el almacén de claves (keystore).
  • Ejecuta Smart Contracts.

Podríamos conectarnos a las diversas redes de Test que existen (TestNet) o a la red de Producción real (Live Network), pero ahora mismo vamos a crearnos una Red Privada... con todas sus ventajas, como un bajo almacenamiento, rapidez en las transacciones... e incluso podremos añadir más nodos a la misma (huele a un entorno de desarrollo para pequeños equipos...).

Para ello, vamos a instalar y agregarlo al Path, el cliente Ethereum por excelencia llamado Geth. Posee una CLI muy potente que iremos viendo progresivamente:

Cuidado al ejecutarlo porque por defecto, empieza a sincronizarse y bajarse la red de Producción.

En este punto surge la duda de que, si estamos hablando de una cadena de bloques, en algún momento, alguien tuvo que articular el primer bloque o el bloque número cero, o como se suele llamar el bloque génesis.

Entonces necesitaremos la configuración de este bloque, y por suerte es un fichero en formato JSON que puede leer nuestro Geth. Por ejemplo, el siguiente tiene una configuración básica:

{
    "coinbase": "0x0000000000000000000000000000000000000001",
    "difficulty": "0x20000",
    "extraData": "",
    "gasLimit": "0x8000000",
    "nonce": "0x0000000000000042",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "alloc": {
    },
    "config": {
        "chainId": 15,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    }
}

Nos creamos un directorio vacío y lanzamos Geth:

Ahora cada vez que arranquemos Geth le proporcionamos nuestro directorio de trabajo y podemos también agregamos el parámetro de consola interactiva, console:

Obviamente no tenemos todavía cuentas (billeteras). Podemos comprobarlo interactuando con el entorno de ejecución de JavaScript y las APIs de Ethereum:

Ahora vamos a crearnos 3 cuentas y generar ETH. Podemos realizar todo con la API Web3, pero vamos a apoyarnos en otra herramienta...

Mist

Mist es una aplicación que funciona como “Browser” de aplicaciones tipo DApp, siendo una de ellas, la billetera Ethereum Wallet.

Podremos gestionar cuentas, realizar operaciones, ver nuestras transacciones y finalmente desplegar Smart Contracts.

Para su funcionamiento y conexión a la Blockchain, contiene un cliente Geth embebido, pero nosotros usaremos el anterior instalado, de forma que Mist le use y se conecte a él, y por extensión a nuestra red privada.

Instalamos la aplicación:

Arrancamos nuestro cliente Geth si no lo está ya, y a continuación arrancamos Mist como Administrador:

Vemos que se enlaza correctamente a nuestra Private-Net:

Ahora nos creamos dos Cuentas Externas: Accounts Overview --> Add Account --> Create New Account.

Nos avisa también dónde se ubican nuestros keystores o cuentas. Nuestro escenario será parecido a este:

También voy a crearme una Simple Wallet, siendo su creador/propietario nuestra cuenta principal Etherbase (la cuenta, por defecto, dónde los ETH minados se van a depositar, también llamada Coinbase). Pero, como dijimos, estas cuentas tienen un coste para crearlas, así que debemos obtener Ether previamente.

Nuestra red privada, se basa en el algoritmo de consenso Prueba de Trabajo o PoW, por lo que podemos minar generando bloques (que no tendrán ninguna transacción), y adquirir las recompensas. Este proceso de minería, totalmente de cálculo (CPU/GPU), quedará obsoleto en el futuro una vez que el algoritmo se reemplace por otro, por ejemplo, Prueba de Participación o PoS.

En otra consola, abrimos otro Geth y lo enlazamos con el nuestro (geth attach) y lanzamos al minero con un número de hilos adjudicados para el cálculo. Una vez que tengamos Ether, finalizamos la minería. En la consola primera habremos visto la generación de bloques:

Creamos ya, nuestra Simple Wallet, siendo nuestro propietario, nuestra
EOA principal, y con nombre ContractAcc1 por ejemplo.

Accounts Overview --> Wallet Contracts --> Add Wallet Contract --> New Wallet Contract --> Single Owner Account.

Además, nuestro minero deberá estar en funcionamiento para poder confirmarla.

Finalmente ingresamos nuestra contraseña. En paralelo, por el hecho de estar minando, nuestra cuenta principal irá aumentando su balance:

A continuación, vamos a enviar 50 ETH de nuestra cuenta principal, a las dos restantes. Usamos el botón superior Send. Se requiere, la dirección origen, la dirección destino, la cantidad, y se puede poner una etiqueta o mensaje (datos extra) codificado en hexadecimal. El minero debe seguir funcionando para confirmarlas:

Una particularidad interesante, es que, si seleccionamos nuestra Cuenta Contrato, podremos observar las transacciones entrantes, es decir, los 50 ETH que han sido transferidos a ella, mientras que, si seleccionamos nuestra EOA secundaria, no podemos observar la transacción entrante. Esta es otra de las diferencias de los dos tipos de cuenta. También es interesante observar la operativa del funcionamiento de las comisiones, el Gas, ...

En último lugar, vamos a usar la API Web3 para obtener nuestros saldos, que inicialmente es proporcionado en Wei:

Para operar con la Cuenta Contrato, debemos utilizar su dirección ya que no es almacenada en la lista de cuentas EOA. Esto se debe a su naturaleza de estar almacenada en la Blockchain (en su detalle en Mist, podéis pulsar en Show Contract Info y veréis que tiene implementada ciertas funcionalidades – tiene código embebido como decíamos al principio).

Espero que haya sido interesante este post y os animo a juguetear con estas herramientas.
¡Si te ha gustado síguenos en Twitter! Iremos profundizando más en próximos posts.