Inicio / Blockchain / Blockchain: De Cero a Desarrollador / Estructura de Bloques y Cadenas

Estructura de Bloques y Cadenas

Headers, transacciones, hash linking, gas y confirmaciones.

Principiante Bases de datos

Estructura de Bloques y Cadenas

En esta lección profundizaremos en cómo se construyen los bloques, cómo se enlazan para formar una cadena inmutable y cómo funciona el proceso de validación de transacciones.

Anatomía Detallada de un Bloque

Un bloque es la unidad fundamental de almacenamiento en una blockchain. Contiene dos secciones principales: el header (encabezado) y el body (cuerpo de transacciones).

Block Header

┌─────────────────────────────────────────┐
│              BLOCK HEADER               │
├─────────────────────────────────────────┤
│ version          → Versión del protocolo│
│ previousHash     → Hash bloque anterior │
│ merkleRoot       → Raíz del árbol Merkle│
│ timestamp        → Marca temporal       │
│ difficulty       → Dificultad objetivo  │
│ nonce            → Contador de minado   │
│ blockNumber      → Número de bloque     │
│ gasLimit         → Gas máximo (Ethereum)│
│ gasUsed          → Gas consumido        │
│ stateRoot        → Raíz del estado      │
└─────────────────────────────────────────┘

Block Body

El cuerpo contiene la lista de transacciones incluidas en el bloque:

┌─────────────────────────────────────────┐
│              BLOCK BODY                 │
├─────────────────────────────────────────┤
│ Transaction 0 (coinbase/reward)         │
│ Transaction 1                           │
│ Transaction 2                           │
│ ...                                     │
│ Transaction N                           │
└─────────────────────────────────────────┘

Estructura de una Transacción

Cada transacción en Ethereum contiene:

{
  nonce:    42,                    // Contador de tx del remitente
  to:       "0x742d35Cc...",       // Dirección destino
  value:    1000000000000000000,   // Cantidad en Wei (1 ETH)
  gasLimit: 21000,                 // Gas máximo a pagar
  gasPrice: 20000000000,           // Precio por unidad de gas
  data:     "0x...",               // Datos (llamada a contrato)
  v, r, s:  ...                    // Firma digital ECDSA
}

Ciclo de vida de una transacción

1. Creación   → El usuario crea y firma la transacción
2. Broadcast  → Se envía a la red P2P
3. Mempool    → Los nodos la almacenan en memoria
4. Selección  → Un validador la incluye en un bloque
5. Ejecución  → Se ejecuta la transacción
6. Inclusión  → El bloque se agrega a la cadena
7. Confirmación → Bloques posteriores la confirman

El Encadenamiento: Hash Linking

Lo que hace una "cadena" de bloques es el enlace criptográfico entre bloques consecutivos:

┌─────────┐    ┌─────────┐    ┌─────────┐
│ Bloque 0│◄──│ Bloque 1│◄──│ Bloque 2│
│(Génesis)│    │         │    │         │
│Hash: abc│    │Prev: abc│    │Prev: def│
│         │    │Hash: def│    │Hash: ghi│
└─────────┘    └─────────┘    └─────────┘

Si alguien modifica el Bloque 1:
- Su hash cambia: def → xyz
- El Bloque 2 apunta a "def" → ¡inválido!
- Toda la cadena posterior se invalida

Esta propiedad garantiza la inmutabilidad: para modificar un bloque pasado, habría que recalcular todos los bloques posteriores y convencer a la mayoría de la red.

El Bloque Génesis

El bloque génesis (bloque 0) es el primer bloque de toda blockchain. Es hardcodeado en el software del nodo y no tiene un bloque anterior:

Bloque Génesis de Bitcoin:
- Número: 0
- Timestamp: 2009-01-03 18:15:05
- Transacciones: 1 (coinbase de 50 BTC)
- Mensaje: "The Times 03/Jan/2009 Chancellor on 
            brink of second bailout for banks"
- Previous Hash: 0000000000000000000000000000000000...

El mensaje de Satoshi en el bloque génesis es una referencia a la crisis financiera de 2008, recordando la motivación original detrás de Bitcoin.

Gas y Fees en Ethereum

En Ethereum, cada operación computacional tiene un costo en gas. El gas es la unidad que mide el trabajo computacional:

Operación               Gas
─────────────────────────────
Transferencia ETH        21,000
Almacenar 256 bits       20,000
Operación suma           3
Llamada a contrato       ~variable
Deploy de contrato       32,000 + código

Cálculo de costos

Costo Total = Gas Used × Gas Price

Ejemplo:
- Gas Used: 21,000 (transferencia simple)
- Gas Price: 20 Gwei (20 × 10⁹ Wei)
- Costo: 21,000 × 20 Gwei = 420,000 Gwei = 0.00042 ETH

EIP-1559: Base Fee + Priority Fee

Desde la actualización London, Ethereum usa un modelo de fees más predecible:

Fee Total = (Base Fee + Priority Fee) × Gas Used

- Base Fee: ajustado automáticamente por el protocolo
- Priority Fee (tip): propina para el validador
- Base Fee se quema (burn) → reduce la oferta de ETH

Forks: Bifurcaciones

Cuando hay desacuerdo sobre las reglas de la cadena, puede ocurrir un fork:

Soft Fork

Cambio retrocompatible. Los nodos antiguos siguen aceptando los nuevos bloques:

Cadena:  ───[A]───[B]───[C]───[D]───
                                      (todos siguen la misma cadena)

Hard Fork

Cambio no retrocompatible. Se crean dos cadenas diferentes:

                    ┌──[C']──[D']── Cadena nueva
Cadena:  ──[A]──[B]─┤
                    └──[C]───[D]── Cadena original

Ejemplos históricos:

  • Ethereum → Ethereum Classic (2016): tras el hack de The DAO.
  • Bitcoin → Bitcoin Cash (2017): debate sobre el tamaño de bloque.

Confirmaciones

Una transacción se considera más segura cuantos más bloques se construyan encima del bloque que la contiene:

Tu tx en bloque 100:

Bloque 100 → 0 confirmaciones (pendiente)
Bloque 101 → 1 confirmación
Bloque 102 → 2 confirmaciones
...
Bloque 106 → 6 confirmaciones (considerado seguro en Bitcoin)
Bloque 112 → 12 confirmaciones (exchanges suelen requerir esto)

Resumen

Los bloques son estructuras de datos que contienen transacciones enlazadas criptográficamente mediante hashes. El encadenamiento hash garantiza la inmutabilidad, el gas mide el costo computacional, y las confirmaciones proporcionan seguridad probabilística. Comprender esta estructura es fundamental para entender cómo funcionan los smart contracts y las DApps.

Ejercicio de práctica

Construir una mini blockchain

Implementa una blockchain simplificada con bloques enlazados por hash.

// createBlock(index, transactions, previousHash) → crear bloque
// Retorna: { index, timestamp, transactions, previousHash, hash }
// hash = SHA-256 de (index + timestamp + JSON de transactions + previousHash)

// createGenesisBlock() → crear bloque génesis (index 0, previousHash "0")

// isValidChain(chain) → verificar integridad de la cadena
// - Cada bloque debe tener el hash correcto
// - previousHash debe coincidir con el hash del bloque anterior
// - El primer bloque debe ser el génesis
// Retorna true/false