Una implementación educativa de una blockchain simple en Java que demuestra los conceptos fundamentales de tecnología de ledger distribuido, criptografía y transacciones digitales.
- Descripción
- Características
- Requisitos
- Instalación
- Uso
- Arquitectura
- Componentes
- Cómo Funciona
- Ejemplos
- Contribuciones
- Licencia
NoobChain es una implementación educativa de una blockchain que implementa los conceptos clave de tecnología blockchain, incluyendo:
- Proof of Work: Algoritmo de minado basado en dificultad ajustable
- Criptografía: Firmas digitales ECDSA y hashes SHA-256
- Transacciones: Sistema completo de entrada/salida con UTXO (Unspent Transaction Output)
- Validación: Verificación integral de la integridad de la cadena
- Billeteras: Gestión de claves públicas y privadas
Este proyecto fue creado con propósitos educativos para entender cómo funcionan internamente los sistemas blockchain.
- ✅ Estructura de bloques con merkle root
- ✅ Algoritmo Proof of Work ajustable
- ✅ Validación de cadena completa
- ✅ Sistema de transacciones con firmas digitales
- ✅ UTXO (Unspent Transaction Output)
- ✅ Entrada y salida de transacciones
- ✅ Validación de firma ECDSA
- ✅ Verificación de integridad de datos
- ✅ Generación de pares de claves ECDSA
- ✅ Cálculo de saldo desde UTXOs
- ✅ Envío seguro de fondos
- ✅ Gestión de cambio de transacciones
- ✅ Hashing SHA-256
- ✅ Firmas digitales ECDSA
- ✅ Validación de merkle root
- ✅ Verificación de cadena de custodia
- Java: JDK 11 o superior
- Maven: 3.6 o superior (para compilar)
- BouncyCastle: Librería criptográfica (incluida en pom.xml)
- Gson: Para serialización JSON (incluida en pom.xml)
git clone https://github.com/K3N4Y/NoobChain.git
cd NoobChainmvn clean compilemvn packagemvn exec:java -Dexec.mainClass="main.NoobChain"O compilar y ejecutar directamente:
javac -cp ".:target/classes:target/dependency/*" src/main/*.java
java -cp ".:target/classes:target/dependency/*" main.NoobChainCreating and Mining Genesis block...
Bloque mindado!!!00000abc123def...
WalletA's balance is: 100.0
WalletA is Attempting to send funds (40) to WalletB...
Transaction Successfully added to Block
Bloque mindado!!!00000xyz789ghi...
WalletA's balance is: 59.5
WalletB's balance is: 40.0
Blockchain is valid
┌─────────────────────────────────────────┐
│ NoobChain (Main) │
│ - Gestiona blockchain │
│ - Valida cadena completa │
│ - Coordina transacciones │
└────────────┬──────────────────┬─────────┘
│ │
┌──────▼──────┐ ┌─────▼──────┐
│ Wallet │ │ Block │
│ - Billetera │ │ - Minado │
│ - Saldo │ │ - Hash │
│ - Envío │ │ - Merkle │
└──────┬──────┘ └─────┬──────┘
│ │
┌──────▼─────────────────▼──────┐
│ Transaction │
│ - Entrada/Salida │
│ - Firma ECDSA │
│ - Validación │
└──────┬──────────────┬─────────┘
│ │
┌──────▼──────┐ ┌───▼─────────┐
│Transaction │ │Transaction │
│ Input │ │ Output │
└─────────────┘ └─────────────┘
Clase principal que gestiona toda la blockchain.
Responsabilidades:
- Almacenar lista de bloques
- Gestionar UTXOs globales
- Validar integridad de la cadena
- Coordinar transacciones
Atributos principales:
public static ArrayList<Block> blockchain
public static HashMap<String, TransactionOutput> UTXOs
public static int difficulty
public static float minimumTransactionRepresenta un bloque individual en la cadena.
Responsabilidades:
- Almacenar transacciones
- Calcular hash del bloque
- Realizar minado (Proof of Work)
- Validar transacciones
Características:
- Hash SHA-256
- Merkle Root de transacciones
- Nonce para prueba de trabajo
- Timestamp
Gestiona transacciones individuales.
Responsabilidades:
- Verificar firma digital
- Validar entrada/salida
- Procesar transacción
- Calcular ID de transacción
Métodos clave:
generateSignature(): Firma la transacciónverifiySignature(): Verifica la firmaprocessTransaction(): Procesa y valida
Gestiona billeteras y claves criptográficas.
Responsabilidades:
- Generar pares de claves ECDSA
- Calcular saldo
- Firmar transacciones
- Enviar fondos
Métodos clave:
generateKeyPair(): Crea claves públicas/privadasgetBalance(): Calcula saldo desde UTXOssendFunds(): Crea y firma transacciones
Representa la entrada de una transacción.
Atributos:
transactionOutputId: ID del UTXO referenciadoUTXO: Referencia al UTXO
Representa la salida de una transacción.
Atributos:
id: Hash único del outputrecipient: Clave pública del destinatariovalue: Cantidad de monedasparentTransactionId: ID de la transacción padre
Utilidades criptográficas.
Métodos principales:
applySha256(): Calcula SHA-256applyECDSASig(): Firma con ECDSAverifyECDSASig(): Verifica firma ECDSAgetStringFromKey(): Codifica clave en Base64getMerkleRoot(): Calcula merkle root
1. Se crean 3 billeteras (A, B, Coinbase)
2. Se crea transacción genesis: Coinbase → WalletA (100 monedas)
3. Se crea primer bloque y se agrega la transacción
4. Se mina el bloque
1. Usuario A crea transacción
2. Especifica entrada (UTXO actual) y salida (destinatario + cambio)
3. Firma la transacción con su clave privada
4. Se agrega a un bloque nuevo
5. El bloque se mina (Proof of Work)
6. Se agrega a la cadena
1. Para cada bloque (excepto genesis):
a. Verificar hash = calculateHash()
b. Verificar previousHash correcto
c. Verificar hash comienza con "0"*difficulty
2. Para cada transacción:
a. Verificar firma digital válida
b. Verificar entrada/salida balance
c. Verificar UTXO existe
d. Verificar UTXO no fue gastado
e. Verificar destinatarios correctos
Wallet wallet = new Wallet();
System.out.println("Saldo: " + wallet.getBalance());Transaction transaction = walletA.sendFunds(walletB.publicKey, 50f);
block.addTransaction(transaction);Block block = new Block(previousBlockHash);
block.addTransaction(transaction);
NoobChain.addBlock(block); // Mina y agregaif (NoobChain.isChainValid()) {
System.out.println("Blockchain válida");
} else {
System.out.println("Blockchain comprometida");
}- Función hash criptográfica
- Genera hash de 256 bits
- Propiedad: imposible revertir
- Usada en: cálculo de hash de bloque
- Algoritmo de firma digital
- Clave pública: verifica firma
- Clave privada: crea firma
- Curva: prime192v1
- Árbol hash de todas las transacciones
- Cambio en cualquier transacción → cambio en merkle root
- Cambio en merkle root → cambio en hash de bloque
- Monedas disponibles no gastadas
- Se usa como entrada en nueva transacción
- Se reemplaza por nuevas salidas
El programa incluye pruebas integradas que verifican:
- Creación de bloques: Bloques se crean con hash válido
- Minado: Prueba de trabajo se calcula correctamente
- Transacciones: Se procesan y validan correctamente
- Firmas: Las firmas ECDSA se verifican
- Validación de cadena: La integridad se mantiene
Ejecutar pruebas:
mvn testNoobChain.difficulty = 4; // Reduce tiempo de minado
NoobChain.difficulty = 6; // Aumenta dificultadNoobChain.minimumTransaction = 0.5f; // Moneda mínima| Operación | Complejidad |
|---|---|
| Crear transacción | O(n) - donde n es # UTXOs |
| Minar bloque | O(2^d) - donde d es dificultad |
| Validar cadena | O(n*m) - n bloques, m transacciones |
| Calcular balance | O(n) - n UTXOs |
- No es producción: Solo para educación
- No es escalable: Mantiene todo en memoria
- Minado simple: No implementa pool de minería
- Dificultad fija: No se ajusta automáticamente
- Sin persistencia: Datos se pierden al cerrar
- Persistencia en base de datos
- API REST
- Pool de minería
- Dificultad dinámica
- Interfaz gráfica
- Nodos distribuidos
- Smart contracts
Este proyecto está disponible bajo licencia MIT. Ver archivo LICENSE para detalles.
K3N4Y
Para preguntas, sugerencias o reportar issues:
- Abre un issue en GitHub
- Envía un pull request con mejoras
- Contacta al autor
Nota: Este proyecto es únicamente para propósitos educativos. No debe usarse en producción ni para aplicaciones reales de blockchain.
Última actualización: Diciembre 2025