Tutorial de Libra

La Blockchain de Libra es una base de datos programable y descentralizada diseñada para respaldar una criptomoneda de baja volatilidad que tendrá la capacidad de servir como medio de cambio eficiente para miles de millones de personas en todo el mundo.

Las características de Libra

Introducción

Libra es una una blockchain pública con soporte para contratos inteligentes. Utiliza una criptomoneda denominada Libra para poder funcionar.
Construida con Rust, utiliza varias herramientas muy conocidas como Go y Protobuf.
Usa un algoritmo de consenso de tipo Tolerante a Fallos Bizantinos que es una variante de HotStuff.
Es no permisionada, es decir las cuentas pueden leer o escribir en la blockchain.
Tiene smart contracts denominados "Move", que pueden ser implementados en código su propio lenguaje.

El diseño de Libra trabaja con varios conceptos ya conocidos como son el mempool y el consenso.

Nota: Este tutorial de Libra se centra en la parte técnica de Libra, dejando de lado aspectos como la token economía (su uso como stable coin y su respaldo con activos de valor) y la gobernanza (la asociación Libra, sus partners: Vodafone, VISA, stripe, ebay, spotify, xapo, facebook, Paypal, coinbase, Uber, mastercard, etc..)

El ecosistema de Libra

El ecosistema de Libra consta de tres entidades: los clientes, los nodos validadores y los desarrolladores.

Clientes

Los clientes son los programas que interactúan con la blockchain de Libra. Estos permiten crear, firmar y enviar transacciones hacia un nodo validador. También permite realizar peticiones de consulta a la blockchain de Libra (a través del nodo validador), como por ejemplo el estado de una transacción o de una cuenta. Generalmente usaremos el cliente Libra CLI.

Nodos validadores

Los nodos validadores son las entidades que deciden que transacciones se van a añadir a la blockchain de Libra. Se utiliza un protocolo de consenso para tales fines.
También encontramos la testnet una red de pruebas de Libra.

Desarrolladores

Como es habitual en el resto de proyectos, los desarrolladores pueden contribuir al core del proyecto Libra, o desarrollando aplicaciones que usen la blockchain de Libra. Ya sea construyendo clientes, smart contracts, etc...

Componentes del protocolo Libra

Cuenta

Una cuenta es un contenedor de modules Move y de recursos Move. Se denomina con una address que es un valor de 256 bits. Los módulos Move (smart contracts) contienen código pero no datos. Los recursos Move contienen datos pero no código.

Nodo validador

Un nodo validador es un actor de la red que recibe transacciones, las valida, las ejecuta temporalmente, las comparte con los otros nodos validadores y en función del protocolo de consenso, las almacena en la blockchain de Libra.

Los componentes de un nodo validador

Un nodo validador consta de varios componentes como son: el control de admisión, el mempool, el componente de consenso, el componente de ejecución, la máquina virtual y el componente de almacenaje.

El Control de Admisión

Es la puerta de entrada del nodo validador. Cualquier petición de un cliente será gestionada por este componente.
El Control de Admisión actúa con la máquina virtual para realizar validaciones y rechazar las transacciones mal definidas. Si pasa esta validación reenvía la transacción al mempool, que aceptará la transacción si la secuencia de ésta es mayor o igaul al número de secuencia actual de la cuenta del emisor.
En caso de el cliente hago una petición de lectura de la blockchain, por ejemplo el saldo de una cuenta, el Control de Admisión interactúa con el Almacenaje para obtener la información solicitada.

La Máquina Virtual

La máquina virtual Move verifica y ejecuta scripts de transacciones hechos en bytecode de Move. Una transacción candidata primero se ejecuta y después de llega a un consenso entre los validadores. Posteriormente los resultados se almacenan y el estado de la blockchain se actualiza.

Mempool

El Mempool es un búffer compartido que contiene las transacciones en espera de ser ejecutadas. Cuando una transacción nueva llega a un nodo validado, ésta se comparte con el resto de nodos validadores.

El Componente de Consenso

Este componente se ocupa de ordenar las transacciones en bloques y confirmar los resultados de la ejecución de otros nodos de la red.

El Componente de Ejecución

Esete componente se ocupa de coordinar la ejecución de un bloque de transacciones en la máquina virtual y en función del componente de Consenso se lo pasa al componente de Almacenaje para la persistencia.

El Componente de Almacenaje

Este componente realiza la persistencia de los bloques acordados por los nodos y sus resultados.

Transacciones

Definen un cambio de estado de la blockchain de Libra. Las transacciones contienen varios campos como: la cuenta (address) del que envía la transacción, su clave pública, un código o programa en Move bytecode, un precio de gas (lo que el emisor está dispuesto a pagar por unidad de gas para ejecutar esa transacción), el valor máximo de gas que puede consumir la transacción, un número entero de secuencia, un tiempo de expiración a partir del cual la transacción no será válida, y la firma digital del emisor de la transacción.

Ciclo de vida de una transacción

El primer paso consiste en crear una transacción, por ejemplo con un programa cliente. Esta transacción contiene los campos mencionados arriba.
Luego el cliente firma la transacción con su clave privada. Con eso ya tenemos la transacción original, la clave pública y la firma formando una transacción completa.
El cliente envía la transacción completa a un nodo validador de la red de Libra.
El nodo validador realiza las validaciones pertinentes (que la firma sea válida, que la cuenta tenga saldo, que no sea una tx repetida, y es caso correcto la envía al mempool.
El validador comparte el mempool con los otros validadores y actualiza su mempool con las transacciones de los otros validadores.
En el caso que este nodo validador sea Líder, formará un bloque de transacciones de su mempool y replicará ese bloque como propuesta a los otros validadores, via el componente de consenso.
Una vez ordenado y aceptado, se ejecutará provisionalmente en la máquina virtual y se enviará al componente de consenso.
Si hay consenso se firmará por un subconjunto de validadores que tienen la mayoría de votos, y finalmente se almacenará en la blockchain.

Instalación de Libra

A la hora de elegir un entorno para instalar Libra, es aconsejable utilizar una versión de Linux Redhat o Debian, en general usaremos un Ubuntu o un MacOS.

Requisitos

Para empezar basta con clonar el repositorio de Github siguiente:

git clone https://github.com/libra/libra.git && cd libra

Una vez hecho hace falta toda una serie de programas que son los siguientes (Rust, Cmake, Go y Protobuf. Afortunadamente ya viene un script para instalar las dependencias necesarias:

./scripts/dev_setup.sh

Si por casualidad da un error de versión de protoc obsoleta, deberemos actualizarlo a la 3.6 o superior

Para ello descargarlo de la url mediante

curl -OL https://github.com/google/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip
y descomprimirlo en algun directorio. Luego mover los binarios y los includes a /usr/local

A continuación se ejecuta otro script que construye y arranca el cli (tardará unos minutos):

./scripts/cli/start_cli_testnet.sh

Una vez listo veremos que el CLI se conecta a un nodo validador de test y nos muestra una consola interactiva que muestra el mensaje libra%. Para enviar la primera transacción hacemos una serie de pasos previos:

Ejecutar un nodo local

Se puede ejecutar un nodo local para pruebas con el comando:

cargo run -p libra_swarm -- -s
El parámetro -s hace que se ejecute el CLI justo después de que el nodo Libra se haya lanzado.

Usar el CLI de Libra

El primer paso consiste en crear las cuentas para los usuarios (suponemos los famosos Alice y Bob).
Para crear la cuenta de Alice:

libra% account create
y para la cuenta de Bob lo mismo.
libra% account create

Para mostrar una lista de las cuentas:

libra% account list

Para poder realizar transferencias de Libra vamos a necesitar algunas criptomonedas, para ello basta con "acuñarlas" con mint. Por ejemplo para la cuenta en el index 0 pedimos 110

libra% account mint 0 110
y para hacer los mismo a la cuenta de Bob (la cuenta en el index 1), acuñamos otras cuantas
libra% account mint 1 52

A continuación podemos pedir el saldo de la cuenta:

libra% query balance 0

y para la cuenta de Bob:
libra% query balance 1

Realizar una transacción

Antes de realizar una transacción tendremos que pedir el número de secuencia de cada cuenta (que inicialmente será 0):
Para la cuenta de Alice:

libra% query sequence 0

Y para la de Bob:
libra% query sequence 1

Una vez vistas las secuencias vamos a transferir 10 criptomonedas de Alice a Bob

libra% transfer 0 1 10

Para ver el estado de esa transacción podemos hacer:

libra% query txn_acc_seq 0 0 true
En pocos segundos veremos los nuevos saldos reflejados en la cuenta de Alice y de Bob.

Move el lenguaje para smart contracts

Move es un nuevo lenguaje de programación para la blockchain de Libra. Consta de cinco partes: una máquina virtual, un verificador de bytecodes, el compilador IR (Intermediate Representation) que compila código inteligible a bytecode, la librería estandar (como LibraAccount y LibraCoin) y los tests (para la máquina virtual, el verificador de bytecode y el compilador).
Cada transacción que se envía a la blockchain de Libra usa un script hecho en Move para determinar la lógica de negocio. Este script puede llamar a procedures declaradas en un módulo.