--------- Enviroment Anaconda
Este repositorio está basado en un tutorial de Youtube => https://youtu.be/lbwK7kLjm4Y?si=Ti8AIhikKfwxBbG2
Consta de 3 partes:
1ª Parte: Creación de una blockchain simple en Python utilizando Flask para la creación de una API web que permita operar sobre ella.
2ª Parte: Creación de una criptomoneda simple basada en la blockchain creada en la parte 1.
3ª Parte: Contratos inteligentes (no implementado en este repositorio
python blockchain.py
Una vez ejecutado el programa, se levantará un servidor en http://localhost:5000/
que permitirá interactuar con la blockchain a través de las siguientes rutas:
Archivo para importar las peticiones en Postman: postmanAPI.json
Mina un bloque y devuelve un mensaje de éxito con la información del bloque minado.
GET /mine_block
{
"message": "¡Felicidades, has minado un bloque!",
"index": 2,
"timestamp": "2024-05-15 12:34:56.789123",
"proof": 533,
"previous_hash": "abc123def456..."
}
Devuelve la cadena de bloques completa.
GET /get_chain
{
"chain": [
{
"index": 1,
"timestamp": "2024-05-15 12:34:56.789123",
"proof": 1,
"previous_hash": "0"
},
{
"index": 2,
"timestamp": "2024-05-15 12:36:01.123456",
"proof": 533,
"previous_hash": "abc123def456..."
}
],
"length": 2
}
Verifica si la cadena de bloques es válida.
GET /is_valid
{
"message": "El blockchain es valido"
}
Flask es un microframework de Python que facilita la creación de aplicaciones web. Con este proyecto, aprendí a:
- Crear una API RESTful para interactuar con la blockchain.
- Manejar rutas y métodos HTTP en Flask.
- Ejecutar y probar la aplicación web localmente.
Este proyecto reforzó mi conocimiento sobre la programación orientada a objetos en Python. Específicamente, aprendí a:
- Definir clases y métodos para representar la estructura y comportamiento de una blockchain.
- Utilizar instancias de clase para gestionar la cadena de bloques y las transacciones.
- Implementar métodos para resolver problemas específicos, como la prueba de trabajo y la validación de la cadena.
Me ha permitido entender y aplicar los conceptos básicos de blockchain. Con este proyecto, aprendí a:
- Crear y gestionar una cadena de bloques.
- Implementar la prueba de trabajo (Proof of Work) para minar nuevos bloques.
- Verificar la integridad y validez de la cadena de bloques.
Esta parte se basa en crear una criptomoneda basada en la blockchain creada en la parte 1. Al crear una criptomoneda, lo que conseguimos es descentralizar la red y permitir que los usuarios realicen transacciones entre ellos.
Para cada nodo que queramos añadir a la red, ejecutar el siguiente comando:
Si quieres añadir un puerto más, solo tienes que añadir un archivo con el nombre LuisCoin5003.py, cambiar el puerto de escucha de Flask y y añadir el siguiente comando:
python LuisCoin5003.py
En este caso vamos a añadir 3 nodos a la red, por lo que ejecutaremos los siguientes comandos:
python LuisCoin5000.py
python LuisCoin5001.py
python LuisCoin5002
Una vez ejecutado el programa, se levantará un servidor en http://localhost:5000/
que permitirá interactuar con la blockchain a través de las siguientes rutas:
Posteriormente antes de cualquier operación, se debe desde cada nodo conectarse a los demás nodos, para ello se debe ejecutar la peticion POST /connect_node en cada nodo.
Para automatizar este proceso, he creado dos scripts para que ejecuten los nodos y se conecten entre ellos:
python scriptsToRun/scriptRun.py
python scriptsToRun/scriptRunMac.py
Archivo para importar las peticiones en Postman: postmanAPI.json
Añade una nueva transacción a la cadena de bloques.
POST /add_transaction
Cuerpo de la solicitud:
{
"sender": "dirección_origen",
"receiver": "dirección_destino",
"amount": 10
}
Ejemplo de respuesta:
{
"message": "La transacción será añadida al bloque 2"
}
Conecta un nuevo nodo a la red de blockchain.
POST /connect_node
Cuerpo de la solicitud:
{
"nodes": ["http://127.0.0.1:5001", "http://127.0.0.1:5002"]
}
Ejemplo de respuesta:
{
"message": "Todos los nodos han sido conectados",
"total_nodes": ["127.0.0.1:5001", "127.0.0.1:5002"]
}
Reemplaza la cadena local por la más larga en la red si es necesario. El propósito de esta función es asegurar que todos los nodos de la red tengan la misma cadena de bloques.
GET /replace_chain
Ejemplo de respuesta si la cadena fue reemplazada:
{
"message": "La cadena fue reemplazada por la más larga.",
"new_chain": [...]
}
Ejemplo de respuesta si la cadena es la más larga:
{
"message": "La cadena es la más larga.",
"actual_chain": [...]
}
Una de las aptitudes que he adquirido con este proyecto es el conocimiento sobre los orphaned blocks. He aprendido cómo se generan estos bloques huérfanos cuando dos mineros encuentran soluciones válidas al mismo tiempo y cómo la red decide cuál de las cadenas resultantes se adopta, dejando al otro bloque como huérfano. Esta comprensión es crucial para asegurar la integridad y consenso en una blockchain.
Un UUID (Universally Unique Identifier) es un estándar de identificación que permite crear un identificador único en prácticamente cualquier contexto, sin necesidad de coordinar con una autoridad central para asegurarse de que no se repita.
La biblioteca uuid en Python permite generar estos identificadores de manera sencilla. Ofrece varias versiones de UUIDs, cada una con un método diferente de generación: En este proyecto, utilicé UUID 4.
La descentralización y el consenso son conceptos fundamentales en blockchain.
En este proyecto, es una blockchain de "cadena más larga", la cadena de bloques con más trabajo acumulado, es decir, la que ha requerido más esfuerzo computacional para ser creada.