1. Overview
En este tutorial, aprenderemos los conceptos básicos de la tecnología blockchain. También implementaremos una aplicación básica en Java que se centra en estos conceptos. Además, discutiremos algunos conceptos avanzados y aplicaciones prácticas de esta tecnología.
2. ¿Qué es Blockchain?
Primero, entendamos qué es exactamente blockchain…
La tecnología se originó a partir del whitepaper publicado por Satoshi Nakamoto sobre Bitcoin en 2008.
Blockchain es un registro descentralizado de información. Se compone de bloques de datos conectados mediante el uso de criptografía. Pertenece a una red de nodos conectados a través de una red pública. Comprenderemos esto mejor cuando intentemos construir un tutorial básico más adelante.
Hay algunos atributos importantes que debemos entender:
- A prueba de manipulaciones: En primer lugar, los datos que forman parte de un bloque son a prueba de manipulaciones. Cada bloque es referenciado por un resumen criptográfico, comúnmente conocido como hash, que asegura que el bloque no se puede modificar.
- Descentralizado: La blockchain es completamente descentralizada en toda la red. Esto significa que no hay un nodo maestro, y cada nodo de la red tiene la misma copia.
- Transparente: Cada nodo que participa en la red valida y agrega un nuevo bloque a su cadena a través de consensos con otros nodos. Por lo tanto, cada nodo tiene visibilidad completa de los datos.
3. ¿Cómo Funciona Blockchain?
Ahora, entendamos cómo funciona blockchain.
Las unidades fundamentales de un blockchain son los bloques. Un solo bloque puede encapsular varias transacciones u otros datos valiosos.
3.1. Minando un Bloque
Representamos un bloque por un valor hash. Generar el valor hash de un bloque se llama “minado” del bloque. Minar un bloque es típicamente computacionalmente costoso, ya que sirve como el “prueba de trabajo”.
El hash de un bloque generalmente consta de los siguientes datos:
- Principalmente, el hash de un bloque consta de las transacciones que encapsula.
- El hash también consiste en la marca de tiempo de la creación del bloque.
- También incluye un nonce, un número arbitrario usado en criptografía.
- Finalmente, el hash del bloque actual también incluye el hash del bloque anterior.
Múltiples nodos en la red pueden competir para minar el bloque al mismo tiempo. Aparte de generar el hash, los nodos también deben verificar que las transacciones que se añaden al bloque son legítimas. ¡El primero que mina un bloque gana la carrera!
3.2. Agregando un Bloque a la Blockchain
Mientras que minar un bloque es costoso computacionalmente, verificar que un bloque es legítimo es relativamente más fácil. Todos los nodos en la red participan en la verificación de un nuevo bloque minado. Por lo tanto, un nuevo bloque es agregado a la blockchain por consenso de los nodos.
Existen varios protocolos de consenso que podemos utilizar para la verificación. Los nodos en la red utilizan el mismo protocolo para detectar un ramal malicioso de la cadena. Así, un ramal malicioso, incluso si se introduce, será pronto rechazado por la mayoría de los nodos.
4. Blockchain Básico en Java
Ahora que tenemos suficiente contexto, empecemos a construir una aplicación básica en Java.
Nuestro simple ejemplo aquí ilustrará los conceptos básicos que acabamos de ver. Una aplicación de grado de producción implica muchas consideraciones que van más allá del alcance de este tutorial. Sin embargo, tocamos algunos temas avanzados más adelante.
4.1. Implementando un Bloque
Primero, necesitamos definir un simple POJO que contendrá los datos para nuestro bloque:
public class Block {
private String hash;
private String previousHash;
private String data;
private long timeStamp;
private int nonce;
public Block(String data, String previousHash, long timeStamp) {
this.data = data;
this.previousHash = previousHash;
this.timeStamp = timeStamp;
this.hash = calculateBlockHash();
}
// getters y setters estándar
}
Vamos a entender lo que hemos incluido aquí:
- Hash del bloque anterior, una parte importante para construir la cadena.
- Los datos reales, cualquier información con valor, como un contrato.
- La fecha y hora de creación de este bloque.
- Un nonce, que es un número arbitrario utilizado en criptografía.
- Finalmente, el hash de este bloque, calculado en función de otros datos.
4.2. Calculando el Hash
Ahora, ¿cómo calculamos el hash de un bloque? Hemos utilizado un método calculateBlockHash
pero no hemos visto una implementación aún. Antes de implementar este método, vale la pena dedicar un tiempo a entender qué es exactamente un hash.
Un hash es una salida de algo conocido como función hash. Una función hash mapea los datos de entrada de tamaño arbitrario a datos de salida de tamaño fijo. El hash es bastante sensible a cualquier cambio en los datos de entrada, por pequeño que sea.
Además, es imposible recuperar los datos de entrada solo a partir de su hash. Estas propiedades hacen que la función hash sea muy útil en criptografía.
Veamos cómo podemos generar el hash de nuestro bloque en Java:
public String calculateBlockHash() {
String dataToHash = previousHash
+ Long.toString(timeStamp)
+ Integer.toString(nonce)
+ data;
MessageDigest digest = null;
byte[] bytes = null;
try {
digest = MessageDigest.getInstance("SHA-256");
bytes = digest.digest(dataToHash.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
logger.log(Level.SEVERE, ex.getMessage());
}
StringBuilder buffer = new StringBuilder();
for (byte b : bytes) {
buffer.append(String.format("%02x", b));
}
return buffer.toString();
}
Sucedén muchas cosas aquí, entendamos en detalle:
- Primero, concatenamos diferentes partes del bloque para generar un hash.
- Luego, obtenemos una instancia de la función hash SHA-256 de
MessageDigest
. - A continuación, generamos el valor hash de nuestros datos de entrada, que es un arreglo de bytes.
- Finalmente, transformamos el arreglo de bytes en una cadena hexadecimal, un hash se representa típicamente como un número hexadecimal de 32 dígitos.
4.3. ¿Hemos Minado el Bloque?
Todo suena simple y elegante hasta ahora, excepto por el hecho de que no hemos minado el bloque aún. ¿Qué implica exactamente minar un bloque, que ha capturado la atención de los desarrolladores durante algún tiempo?
Minar un bloque significa resolver una tarea computacionalmente compleja para el bloque. Mientras que calcular el hash de un bloque es algo trivial, encontrar el hash que comienza con cinco ceros no lo es. Aún más complicado sería encontrar un hash que empiece con diez ceros, y podemos tener una idea general.
¿Así que cómo podemos hacer esto? Honestamente, ¡la solución es mucho menos sofisticada! Se hace a través de fuerza bruta para lograr este objetivo. Aquí hacemos uso del nonce:
public String mineBlock(int prefix) {
String prefixString = new String(new char[prefix]).replace('\0', '0');
while (!hash.substring(0, prefix).equals(prefixString)) {
nonce++;
hash = calculateBlockHash();
}
return hash;
}
Aquí intentamos realizar una acción específica:
- Comenzamos definiendo el prefijo que deseamos encontrar.
- Luego, verificamos si hemos encontrado la solución.
- Si no, incrementamos el nonce y calculamos el hash en un bucle.
- El bucle continúa hasta que tengamos éxito.
Estamos comenzando con el valor predeterminado de nonce aquí y lo incrementamos de uno en uno. Pero hay estrategias más sofisticadas para iniciar e incrementar un nonce en aplicaciones del mundo real. Además, no estamos verificando nuestros datos aquí, que suele ser una parte importante.
4.4. Vamos a Ejecutar el Ejemplo
Ahora que hemos definido nuestro bloque junto con sus funciones, podemos usar esto para crear una sencilla blockchain. La almacenaremos en un ArrayList
:
List blockchain = new ArrayList<>();
int prefix = 4;
String prefixString = new String(new char[prefix]).replace('\0', '0');
Además, hemos definido un prefijo de cuatro, que efectivamente significa que queremos que nuestro hash empiece con cuatro ceros.
Veamos cómo podemos añadir un bloque aquí:
@Test
public void givenBlockchain_whenNewBlockAdded_thenSuccess() {
Block newBlock = new Block(
"Este es un nuevo bloque.",
blockchain.get(blockchain.size() - 1).getHash(),
new Date().getTime());
newBlock.mineBlock(prefix);
assertTrue(newBlock.getHash().substring(0, prefix).equals(prefixString));
blockchain.add(newBlock);
}
4.5. Verificación de Blockchain
¿Cómo puede un nodo validar que una blockchain es válida? Aunque esto puede ser bastante complicado, consideremos una versión simplificada:
@Test
public void givenBlockchain_whenValidated_thenSuccess() {
boolean flag = true;
for (int i = 0; i < blockchain.size(); i++) {
String previousHash = i == 0 ? "0" : blockchain.get(i - 1).getHash();
flag = blockchain.get(i).getHash().equals(blockchain.get(i).calculateBlockHash())
&& previousHash.equals(blockchain.get(i).getPreviousHash())
&& blockchain.get(i).getHash().substring(0, prefix).equals(prefixString);
if (!flag) break;
}
assertTrue(flag);
}
Aquí hacemos tres verificaciones específicas para cada bloque:
- El hash almacenado del bloque actual es realmente lo que calcula.
- El hash del bloque anterior almacenado en el bloque actual es el hash del bloque anterior.
- El bloque actual ha sido minado.
5. Algunos Conceptos Avanzados
Si bien nuestro ejemplo básico destaca los conceptos elementales de un blockchain, no es completo. Para utilizar esta tecnología de manera práctica, deben considerarse varias otras consideraciones.
5.1. Verificación de Transacciones
Calcular el hash de un bloque y encontrar el hash deseado solo es una parte del proceso de minado. Un bloque consiste en datos, a menudo en forma de múltiples transacciones. Estas deben ser verificadas antes de que puedan formar parte de un bloque y ser minadas.
Una implementación típica de blockchain establece una restricción sobre cuántos datos pueden ser parte de un bloque. También establece reglas sobre cómo se puede verificar una transacción. Múltiples nodos de la red participan en el proceso de verificación.
5.2. Protocolo de Consenso Alternativo
Vimos que el algoritmo de consenso, como “Prueba de Trabajo”, se utiliza para minar y validar un bloque. Sin embargo, este no es el único algoritmo de consenso disponible para usar.
Hay varios otros algoritmos de consenso de los que elegir, como Prueba de Participación, Prueba de Autoridad y Prueba de Peso. Cualquiera que se utilice depende del tipo de aplicación que pretendemos diseñar.
5.3. Recompensa por Minado
Una red de blockchain se compone típicamente de nodos voluntarios. Ahora bien, ¿por qué alguien querría contribuir a este proceso complejo y mantenerlo legítimo y en crecimiento?
Esto se debe a que los nodos son recompensados por verificar las transacciones y minar un bloque. Estas recompensas suelen ser en forma de moneda asociada a la aplicación. Pero una aplicación puede decidir que la recompensa sea cualquier cosa de valor.
5.4. Tipos de Nodos
Un blockchain depende completamente de su red para operar. En teoría, la red es completamente descentralizada y cada nodo es igual. Sin embargo, en la práctica, una red se compone de múltiples tipos de nodos.
Mientras que un nodo completo tiene una lista completa de transacciones, un nodo ligero solo tiene una lista parcial. Además, no todos los nodos participan en la verificación y validación.
5.5. Comunicación Segura
Una de las señas de identidad de la tecnología blockchain es su apertura y anonimato. Pero, ¿cómo proporciona seguridad a las transacciones que se realizan en su interior? Esto se basa en criptografía e infraestructura de clave pública.
El iniciador de una transacción utiliza su clave privada para asegurarla y adjuntarla a la clave pública del destinatario. Los nodos pueden usar las claves públicas de los participantes para verificar transacciones.
6. Aplicaciones Prácticas de Blockchain
Entonces, blockchain parece ser una tecnología emocionante, pero también debe resultar útil. Esta tecnología ha estado disponible durante algún tiempo y, no hace falta decir, ha demostrado ser disruptiva en muchos dominios.
Su aplicación en muchos otros ámbitos está siendo explorada activamente. Entendamos las aplicaciones más populares:
- Moneda: Esta es, de lejos, la utilización más antigua y ampliamente conocida de blockchain, gracias al éxito de Bitcoin. Proporciona dinero seguro y sin fricciones a personas de todo el mundo sin intervención de autoridades centrales o gubernamentales.
- Identidad: La identidad digital se está convirtiendo rápidamente en la norma en el mundo actual. Sin embargo, esto está plagado de problemas de seguridad y manipulación. Blockchain es inevitable en la revolución de este ámbito con identidades completamente seguras e inalterables.
- Salud: La industria de la salud está cargada de datos, en su mayoría manejados por autoridades centrales. Esto disminuye la transparencia, seguridad y eficiencia en el manejo de dichos datos. La tecnología blockchain puede proporcionar un sistema sin un tercero que brinde la confianza tan necesaria.
- Gobierno: Este es quizás un ámbito que está muy abierto a la disrupción por parte de la tecnología blockchain. El gobierno se encuentra típicamente en el centro de varios servicios a los ciudadanos que a menudo están llenos de ineficiencias y corrupción. Blockchain puede ayudar a establecer unas relaciones mucho mejores entre gobierno y ciudadanos.
7. Herramientas del Comercio
Si bien nuestra implementación básica aquí es útil para elicitar los conceptos, no es práctico desarrollar un producto sobre blockchain desde cero. Afortunadamente, este espacio ha madurado y ahora tenemos algunas herramientas bastante útiles para comenzar.
A continuación, revisaremos algunas de las herramientas más populares para trabajar en este espacio:
- Solidity: Solidity es un lenguaje de programación estáticamente tipado y orientado a objetos diseñado para escribir contratos inteligentes. Puede usarse para escribir contratos inteligentes en varias plataformas de blockchain como Ethereum.
- Remix IDE: Remix es una poderosa herramienta de código abierto para escribir contratos inteligentes en Solidity. Esto permite al usuario escribir contratos inteligentes directamente desde el navegador.
- Truffle Suite: Truffle proporciona un conjunto de herramientas para ayudar a un desarrollador a comenzar en el desarrollo de aplicaciones distribuidas. Esto incluye Truffle, Ganache y Drizzle.
- Ethlint/Solium: Solium permite a los desarrolladores asegurarse de que sus contratos inteligentes escritos en Solidity están libres de problemas de estilo y seguridad. Solium también ayuda a solucionar estos problemas.
- Parity: Parity ayuda a configurar el entorno de desarrollo para contratos inteligentes en Etherium. Proporciona una forma rápida y segura de interactuar con la blockchain.
8. Conclusión
Para resumir, en este tutorial, examinamos los conceptos básicos de la tecnología blockchain. Comprendimos cómo una red mina y agrega un nuevo bloque en la blockchain. Además, implementamos los conceptos básicos en Java y discutimos algunos conceptos avanzados relacionados con esta tecnología.
Finalmente, culminamos con algunas aplicaciones prácticas de blockchain, así como con herramientas disponibles para empezar en este emocionante campo.