Universidad Nacional de Luján
Departamento de Ciencias Básicas
Sistemas Distribuidos y Programación Paralela 2026 Dr. David Petrocelli
TP INTEGRADOR
📑 Índice del documento

Trabajo Práctico Integrador

Blockchain Distribuida y CUDA

Fecha de entrega: 23/06/2026


Requisitos, consideraciones y formato de entrega


Contenidos del programa relacionados


Objetivo

Este documento sirve como guía para implementar una “Blockchain Distribuida desde cero”, a completar durante el curso. Está diseñado para aplicar conocimientos teóricos en un proyecto práctico y funcional, organizado en entregables secuenciales que coinciden con los temas tratados en clase.

Las tareas están divididas en fases claras y cada entregable representa una etapa del desarrollo. A medida que avanzamos en el curso, se proporcionarán detalles técnicos y recursos necesarios para cada parte del proyecto, desde la configuración del entorno de desarrollo hasta la implementación de algoritmos clave para la eficiencia y seguridad de la blockchain.


Estructura de la BlockChain

Una blockchain es una base de datos distribuida donde un conjunto de nodos interactúan en modo descentralizado (P2P) para almacenar un conjunto de registros coherentes entre cada uno de los nodos.

El concepto básico de blockchain es bastante simple: una base de datos que mantiene una lista en continuo crecimiento de registros ordenados.

Algo muy similar a un log de transacciones de una base de datos.

Estructura de bloques encadenados mediante hashes

Como se puede observar, existe un orden y una secuencialidad en las operaciones que se registran en una blockchain, haciendo que el contenido de cada bloque se pueda generar de forma distribuida.

¿Cómo es la red que queremos construir?

Queremos crear una blockchain en la que todos confíen. Si existiera más de una cadena, los usuarios perderían la confianza, porque no podrían determinar razonablemente cuál cadena es la “válida”. Para que un grupo de usuarios acepte el estado subyacente almacenado en una blockchain, se necesita una única blockchain canónica en la que un grupo de personas confíe. El whitepaper original de Nakamoto [NAK08] describe el modelo, y el libro de referencia de Antonopoulos [ANT17] lo desarrolla en profundidad.

Esto es exactamente lo que hace el algoritmo Proof of Work (PoW) [POW]: asegura que una blockchain particular permanecerá canónica en el futuro, haciendo increíblemente difícil para un atacante crear nuevos bloques que sobrescriban una parte específica de la historia (por ejemplo, borrando transacciones o creando transacciones falsas) o mantener una bifurcación. Para que su bloque sea validado primero, un atacante necesitaría resolver el nonce [NONCE] (number used only once) más rápido que cualquier otro en la red, de manera que la red crea que su cadena es la más completa. Esto sería imposible a menos que el atacante contara con más de la mitad del poder de minado de la red — un escenario conocido como ataque del 51% [51ATK].

La coherencia de la información, en una arquitectura PoW como Bitcoin, está garantizada por un proceso denominado minería [GPUMIN]. Debido a su complejidad computacional, usualmente se ejecuta sobre GPU.

Un minero (o, más precisamente, la computadora de minería) debe resolver un problema matemático complejo que requiere un poder computacional significativo (cálculo de hashes [POWNONCE]). El primer minero en resolver el problema es recompensado.

Una operación de hash es un cálculo matemático esencial para verificar transacciones y crear bloques en una blockchain. La tasa de hash [CSHR] mide la potencia computacional de la minería: cuántas operaciones de hash puede realizar una plataforma de minería por segundo. Cuantas más operaciones de hash se realicen, mayor es la probabilidad de obtener la recompensa de bloque [EERI21].

A través de esta guía aprenderá a crear una red desde cero y a programar los algoritmos de minería.

Para apoyar los desarrollos de la blockchain, usted utilizará servicios de un sistema distribuido. Esta es la respuesta a la necesidad de tener escalabilidad horizontal.

El objetivo de este proyecto es presentar un prototipo de arquitectura que permite paralelizar y distribuir la generación de bloques (blockchain paralelizable).

La principal ventaja de esta arquitectura es que, si dos operaciones no son mutuamente excluyentes o secuenciales, pueden ser realizadas en paralelo.

Estructura de bloques con sub-bloques de transacciones

Para lograr esto, se propone utilizar herramientas como RabbitMQ para el manejo de colas de los bloques a procesar, Redis como motor de base de datos para registrar los bloques y transacciones, utilizando la CPU o GPU (CUDA) para el cálculo criptográfico intensivo de hashes y resolución de desafíos. Por último, desarrollar un servidor (coordinador) para la comunicación entre todas las tareas.


Pilar 1 — Programación del minero CPU y minero GPU CUDA

En una etapa inicial, los Pixel Shaders [JAD] fueron la herramienta de programación paralela dentro del pipeline de renderizado [EBN]. Durante mucho tiempo esta fue la única funcionalidad de las placas de video — incluso el nombre “placa de video” reflejaba un uso sesgado al procesamiento del pipeline gráfico.

Esto cambió con la llegada de CUDA [CUDAPG] en 2006 [CUDAHIST].

GPUs NVIDIA y el ecosistema de computación paralela

CUDA es una tecnología game-changer: cambia la forma de pensar e interactuar con las “placas de video”. Ahora pasamos a llamarlas unidades de GPU [GPUMIN], y eventualmente — solo eventualmente — uno de sus usos es el procesamiento gráfico.

Esto no significa que el procesamiento de video no siga siendo su fuerte; significa que se abre la puerta para utilizarlas con otros fines, como la minería en el caso de las arquitecturas blockchain o la IA en el caso de modelos generativos.

CUDA es una tecnología propietaria del fabricante NVIDIA.

Pilar 1 - Pipeline de Minería CUDA

Hit #1 — Introducción al mundo de CUDA

Instalen lo necesario para ejecutar CUDA. Si disponen de una placa gráfica NVIDIA pueden trabajar en hardware nativo:

Si no tienen una placa gráfica NVIDIA, hay varias alternativas:

También pueden usar Godbolt (Compiler Explorer) [GODBOLT] para hacer pruebas sin instalar nada — la opción más recomendada para la parte inicial de esta guía. Tengan en cuenta que la arquitectura del hardware detrás de Godbolt puede variar; verifiquen la arquitectura actual en la UI (menú de opciones del compilador). Las arquitecturas CUDA actuales incluyen: sm_86 (Ampere / RTX 30xx), sm_89 (Ada Lovelace / RTX 40xx), sm_90 (Hopper / H100), sm_100 (Blackwell / RTX 50xx).

Si va a usar la versión nativa sobre hardware propio debe saber que:

  1. Una cosa es el driver (traductor entre el sistema operativo y el hardware).
  2. Otra cosa es el compilador (traductor entre el lenguaje de programación y el sistema operativo).
  3. Y por último, otra cosa es CUDA (traductor entre el código fuente y el lenguaje de programación), y que para que todo esto funcione, la versión de CUDA, del lenguaje de programación, del compilador, del sistema operativo y del driver deben ser compatibles.

Hit #2 — Hola mundo en CUDA

Visiten la presentación original de CUDA [CUDA11] o su versión actualizada [CUDAPG] y elaboren un programa básico de “Hola mundo” como los ejemplos que ahí se mencionan. Empiecen el informe describiendo:

Hit #3 — Librerías CUDA

Visiten NVIDIA CCCL [CCCL] (CUDA Core Compute Libraries) y expandan el informe comentando de qué se trata este repositorio. ¿Cuándo fue la última vez que se actualizó?

Nota: el repositorio original de Thrust (github.com/nvidia/thrust) fue archivado en marzo de 2024. Thrust ahora forma parte de CCCL [CCCL]. Visiten la documentación de Thrust [THRUST] dentro de CCCL y documenten en el informe de qué se trata y cómo se relaciona con el ecosistema CUDA actual.

Compilen y ejecuten el primer ejemplo de la sección Vectors de Thrust. ¿Hace falta instalar algo adicional o ya viene con CUDA?

Lean el Thrust Quick Start Guide [THRQSG] y comenten en el informe cuáles son las diferencias entre programar CUDA “a pelo” vs usar Thrust/CCCL.


Fin de la teoría, ahora manos a la obra.

Antes de pasar a la implementación, recuerde construir tanto código compatible con CPU (por ejemplo Python) así como también lo que menciona el enunciado (GPU CUDA).

Hit #4 — Introducción a HASH usando CUDA

El cálculo de funciones de hashing es ampliamente utilizado en criptografía. Existen múltiples algoritmos: algunos como MD5 (1991) [MD5] ya son considerados inseguros, y otros como SHA-256 (2001-2002) [SHA2] aún resisten la evolución y los tiempos actuales. Estos algoritmos suelen calcularse en GPU porque son “costosos” computacionalmente — característica deseable para PoW.

Nota: En este ejercicio utilizamos MD5 por su velocidad de cálculo, lo cual permite iterar rápidamente y observar resultados en tiempos razonables. Sin embargo, las blockchains reales como Bitcoin utilizan SHA-256 (double-SHA-256) por su resistencia a colisiones. Como ejercicio adicional opcional, compare el throughput (hashes/segundo) de MD5 vs SHA-256 en GPU y analice el impacto en el tiempo de minado.

En este punto, usted deberá escribir un programa que reciba un string por parámetro y calcule, utilizando la GPU, un MD5 y devuelva el hash calculado por consola.

Puede usar librerías disponibles para este fin. Las encontrará preguntando por CUDA MD5.

Hit #5 - HASH por fuerza bruta con CUDA

Modifique el programa anterior para que reciba dos parámetros (un hash y una cadena). Ahora debe encontrar un número tal que, al concatenarlo con la cadena y calcular el hash, el resultado comience con una cadena específica proporcionada como segundo parámetro.

Como no hay forma de adivinar cuál es ese número, deberá utilizar la GPU para probar miles o millones de combinaciones por segundo aleatoriamente hasta encontrar la correcta.

Como salida, debe mostrar el hash resultante y el número que utilizó para generarlo.

Hit #6 - Longitudes de prefijo en CUDA HASH

Realice mediciones sobre el programa anterior probando diferentes longitudes de prefijo. ¿Cuál es el prefijo más largo que logró encontrar? ¿Cuánto tardó? ¿Cuál es la relación entre la longitud del prefijo a buscar y el tiempo requerido para encontrarlo?

Hit #7 - HASH por fuerza bruta con CUDA (con límites)

Modifique el programa anterior para que reciba dos parámetros nuevos, ambos serán números, y su programa debe buscar posibles soluciones solo dentro de ese rango. Si en ese rango no hay soluciones, debe informar que no encontró nada.

Cierre etapa inicial

Elabore una batería de tests (parámetros de entrada) y ejecútelos en GPU y en CPU. Elabore una comparativa de los resultados obtenidos.


Pilar 2 - Infraestructura de servicios distribuidos para una blockchain escalable

Después de desarrollar el minero utilizando CUDA GPU, es crucial integrar los conceptos y habilidades adquiridas a lo largo de este curso a nivel de arquitectura distribuida. En esta arquitectura simplificada, vamos a desarrollar solo algunos de los componentes que una blockchain real contiene. A continuación se detallan los puntos esenciales a desarrollar.

Objetivo de la construcción de la blockchain: Manejar transferencias entre usuarios (usuario A; usuario B; monto) de forma segura y asegurando que el contenido de la blockchain no puede ser alterado.

Pilar 2 - Arquitectura Distribuida

P1 - Validación de Transacciones y Bloques

Minero en CUDA (realizado en Pilar 1) para resolver tareas de PoW (Proof of Work) a través de algoritmos de hash. Este algoritmo debe recibir parámetros para incrementar la complejidad de las tareas (manejado por el nodo coordinador, descrito más adelante).

Plataforma escalable (Cloud / Kubernetes) con al menos 2 réplicas por servicio.

P2 — Distribución (async) de tareas de minería

Integración de un sistema de colas (RabbitMQ) configurado en una arquitectura híbrida de colas y tópicos a la cual se suscriben un conjunto de nodos workers para recibir tareas a ser resueltas. Como es de esperarse, N nodos deben competir o colaborar — en un pool de minería [POOL] los mineros comparten poder de cómputo y dividen las recompensas proporcionalmente — para resolver la tarea de hash y notificar cuando encuentren un resultado, determinando así el worker ganador y resolviendo el hash.

P3 - Estado blockchain, transacciones y bloques

Integración de un motor de DB con persistencia (Redis + Persistencia) el cual permite registrar el trackeo de las operaciones en la base de datos. Esta será la encargada de construir la “blockchain”.

P4 - Nodo coordinador de tareas (NCT)

Nodo coordinador que será responsable de:

El NCT, para el manejo de tareas, utiliza RabbitMQ como un sistema de mensajería asincrónica para gestionar las tareas de minería distribuidas entre los nodos trabajadores. Actúa como mediador para la distribución y manejo de tareas de PoW que necesitan ser resueltas para crear nuevos bloques.

Proceso

NCT.1 - Publicación de Tareas: El nodo coordinador (P4) publica tareas de minería en RabbitMQ. Estas tareas incluyen los datos necesarios para que los nodos trabajadores intenten resolver el problema de PoW. La información típicamente incluiría:

NCT.2 - Competencia o cooperación: Los nodos trabajadores están suscritos a ciertas colas en RabbitMQ y reciben tareas de minería. Cada nodo intenta resolver el problema de PoW y el primero en lograrlo publica su solución al coordinador del sistema.

NCT.3 - Verificación de resultados: Una vez que un nodo de minado encuentra una solución válida y la envía al coordinador, este verifica la información, y si es correcta, procede con las siguientes etapas de confirmación del bloque.

NCT.4 - Almacenamiento de Bloques: Redis se usa para almacenar información de bloques de manera eficiente y rápida. Cada bloque se almacena como un hash en Redis, facilitando el acceso rápido y la persistencia de datos.

Estructura ejemplo de un Bloque en Redis:

Campo Descripción
previous_hash Hash del bloque anterior, necesario para mantener la integridad de la cadena.
nonce El valor que resuelve el problema de PoW.
timestamp Fecha y hora de creación del bloque.
transactions Lista de transacciones incluidas en el bloque.
block_hash Hash del bloque actual, calculado a partir de los datos del bloque.

P5 — Pool de Transacciones

Construir un pool de transacciones (TrP) pendientes [MSRBTC] donde el TrP fragmenta una tarea completa en desafíos más pequeños. Entonces:


Pilar 3 - Despliegue, prueba y escalabilidad de red BlockChain

Tras el desarrollo de los componentes y servicios necesarios, y la integración de las herramientas pertinentes, es fundamental avanzar hacia la implementación en un entorno productivo. Para esto, utilizaremos la plataforma de Google Cloud, que ofrece una cuenta de prueba con 300 USD. Este crédito nos permite explorar y emplear múltiples recursos que, a pesar de ciertas limitaciones, son adecuados para desplegar y escalar efectivamente nuestra plataforma.

Pilar 3 - Despliegue en Kubernetes

3.1 - Kubernetes como nuestra plataforma base

Para el despliegue de nuestra plataforma, emplearemos Kubernetes, configurado a través de OpenTofu (OT), una herramienta de infraestructura como código. Mediante OT, configuraremos un clúster de Kubernetes en Google Kubernetes Engine (GKE), que será responsable de administrar todos los recursos que despleguemos. Este clúster hospedará tanto los servicios de infraestructura esenciales como RabbitMQ y Redis, como los componentes de las aplicaciones que ejecutaremos. La configuración mínima del clúster deberá incluir:

3.2 - Despliegue de recursos automatizado

La automatización del despliegue es crucial y se gestionará a través de múltiples pipelines de CI/CD que facilitarán:

3.3 - Pruebas y análisis de resultados

La evaluación del rendimiento es esencial. Implementaremos una serie de pruebas para analizar cómo se comporta la plataforma bajo diversas cargas y configuraciones. Esto incluirá:

Nota: Para cada una de estas configuraciones, se medirán y analizarán los tiempos de respuesta. Con los resultados obtenidos, genere:

  1. Conjunto de gráficos comparativos.
  2. Un análisis detallado para concluir sobre el desempeño y la escalabilidad de la red Blockchain implementada.

Esto proporcionará información valiosa sobre la capacidad de adaptación y escalabilidad de la plataforma bajo diferentes escenarios operativos.

Arquitectura modelo

El diagrama interactivo de la arquitectura de referencia se comparte por separado durante la cursada (link de Miro disponible en el aula virtual).


Referencias y Bibliografía

Blockchain y Criptografía

CUDA y Computación en GPU

Algoritmos de Hashing

Evolución de GPUs y Shaders

Herramientas