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.
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 consta de tres entidades: los clientes, los nodos validadores y los desarrolladores.
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.
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.
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...
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.
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.
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.
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 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.
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.
Este componente se ocupa de ordenar las transacciones en bloques y confirmar los resultados de la ejecución de otros nodos de la red.
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.
Este componente realiza la persistencia de los bloques acordados por los nodos y sus resultados.
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.
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.
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.
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
y descomprimirlo en algun directorio. Luego mover los binarios y los includes a /usr/local
curl -OL https://github.com/google/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip
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:
Se puede ejecutar un nodo local para pruebas con el comando:
El parámetro -s hace que se ejecute el CLI justo después de que el nodo Libra se haya lanzado.
cargo run -p libra_swarm -- -s
El primer paso consiste en crear las cuentas para los usuarios (suponemos los famosos Alice y Bob).
Para crear la cuenta de Alice:
y para la cuenta de Bob lo mismo.
libra% account create
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
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:
En pocos segundos veremos los nuevos saldos reflejados en la cuenta de Alice y de Bob.
libra% query txn_acc_seq 0 0 true
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.