Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TFG-multimedia

Trabajo Final de Grado de Ingeniería Multimedia en la Universidad de Alicante de Laura Saval Cillero tutorizado por Francisco Maciá Pérez durante el curso 2025/26.

El presente README tiene como propósito dotar de instrucciones rápidas y comandos unificados para preparar y ejecutar el entorno local de pruebas.

Datos sobre el trabajo

Título: Sistema de votación electrónica accesible y transparente basado en blockchain: Aplicación práctica al modelo Eurovisión

Resumen: Este Trabajo de Fin de Grado tiene como objetivo el diseño e implementación de un sistema de votación electrónica basado en tecnología blockchain, con especial énfasis en la accesibilidad, la transparencia y la seguridad del proceso. Como caso práctico, se propone simular el sistema de votación del Festival de Eurovisión, utilizando su estructura y audiencia como entorno de validación. El proyecto pretende recuperar el carácter experimental y tecnológico del certamen, explorando los retos técnicos y de diseño que supone aplicar tecnologías punteras como blockchain en contextos de votación pública.

Arquitectura: El proyecto contiene un backend formado por cinco instancias (una por país) y un frontend Angular que actúa como cliente P2P. Los países creados junto a sus abreviaturas y puertos asociados son:

Puerto Abreviatura Nombre
3001 ES / es España
3002 FR / fr Francia
3003 DE / de Alemania
3004 PT / pt Portugal
3005 IT / it Italia

A tener en cuenta: A nivel de código como parámetro se emplean las abreviaturas en minúsculas, si bien en a nivel de interfaz se muestren en MAYÚSCULAS.

La configuración del servidor de cada país se encuentra en su .env específico:

server/env/.<abreviatura>.env

Asimismo, cada servidor cuenta con una base de tados específica:

tfg_<abreviatura>

Requisitos mínimos

  • Node.js 18+ (recomendado)
  • npm
  • MongoDB accesible en localhost:27017 (Docker es la opción recomendada)
  • Windows 11

Guía de inicio rápido: Desde cero hasta una votación simulada

Fase 1: Preparar el entorno (una sola vez)

Antes de arrancar el backend es necesario contar con una instancia de MongoDB disponible en el puerto 27017 y contar con las claves tanto de los servidores como de los votantes así como crear a los votantes.

Paso 1. Arrancar MongoDB:

  • Opción A (Recomendada): Arrancar MongoDB en un contenedor Docker:
docker run -d --name mongo -p 27017:27017 -v mongodata:/data/db mongo:6.0

Con ello se crea un contenedor Docker llamado mongo, que expone MongoDB en el puerto 27017 y guarda los datos en el volumen persistente mongodata.

Si deseas comprobar que el contenedor está funcionando puedes ejecutar:

docker ps

Si el contenedor ya existe pero está parado, puedes arrancarlo con:

docker start mongo
  • Opción B: Usar MongoDB instalado localmente:

Si lo prefieres puedes instalar MongoDB Community Server (https://www.mongodb.com/try/download/community-kubernetes-operator) directamente en tu equipo y arrancar el servicio localmente.

Una vez instalado, comprueba que MongoDB está disponible con:

mongod --version

Paso 2. Generar claves, cargar configuración y crear votantes de demo:

cd server
# Generación claves Ed25519 (firma) para cada país
npm run keys:<abreviatura>
# Generación claves RSA-OAEP (cifrado) para cada país
npm run keys-encryption:<abreviatura>
# Carga la configuración de la votación (cambiar fecha de inicio o fin si se desea en `edition-config/ESC_2026.json`)
npm run seed-voting:all
# Crea a 30 votantes por país con sus claves
npm run seed-voters:<abreviatura>

Tras ello las claves se encontrarán en la carpeta \keys divididas entre \keys\countries y \keys\voters. Para que funcione, es necesario proporcionar el cliente las claves públicas de cifrado y firma públicas de los servidores para ello deberás editar client\src\app\core\keys\public-keys.ts sustituyendo las claves de ejemplo por las que hayas creado durante tu ejecución.

Fase 2: Preparar una votación (antes de arrancar)

Si no has cambiado las fechas en edition-config/ESC_2026.json el período de votación habrá pasado.

Por defecto, ESC_2026.json usa fechas del pasado:

  • votingStart: 2026-04-26T18:00:00Z
  • votingEnd: 2026-05-21T23:00:00Z

Para que los votantes vean una votación abierta:

# Editar server/edition-config/ESC_2026.json
# Cambiar las fechas a:
# "votingStart": "2026-05-23T10:00:00Z",
# "votingEnd": "2026-05-24T23:00:00Z"

# O usa Get-Content junto con Set-Content para hacerlo automáticamente:
(Get-Content .\server\edition-config\ESC_2026.json) `
  -replace '"votingStart": "2026-04-26T18:00:00Z"', '"votingStart": "2026-05-23T10:00:00Z"' |
  Set-Content .\server\edition-config\ESC_2026.json

(Get-Content .\server\edition-config\ESC_2026.json) `
  -replace '"votingEnd": "2026-05-21T23:00:00Z"', '"votingEnd": "2026-05-24T23:00:00Z"' |
  Set-Content .\server\edition-config\ESC_2026.json

# Recargar la configuración en las bases de datos:
cd server
npm run seed-voting:all

Fase 3: Arrancar todo el sistema

Terminal 1-5 (una por país).

cd server
# Iniciar servidor de cada país
npm run dev:<abreviatura>

Si se desea iniciar todos los países simultáneamente desde la raíz es posible ejecutar:

.\scripts\start-all-countries.ps1

Terminal 6 Cliente.

cd client
ng serve

Esto abre:

  • 5 terminales con los servidores de países (puertos 3001-3005)
  • 1 terminal del cliente Angular (puerto 4200)

Acceso:

Fase 4: Simular votantes

Terminal 7

cd server
# Lanzar 30 votantes simultáneos (cada uno vota por 1-3 países al azar)
npm run demo-voters:<abreviatura>:30

Esto abre 30 navegadores Chromium con votantes <abreviatura>-1 a <abreviatura>-5 que:

  • Inician sesión automáticamente
  • Seleccionan países al azar
  • Preparan y confirman el voto
  • Se unen a la red P2P
  • Computan y validan el bloque

A tener en cuenta: Para poder repetir la simulación con los mismos usuarios es necesario limpiar los datos almacenados para que cuenten con un token nuevo, en caso contrario, el proceso fallará, para ello se debe ejecutar:

cd server
# Limpieza de lo votantes del país NECESARIO para poder volver a votar con el mismo usuario
demo-clean:<abreviatura>

Importante: Si es la primera vez que simulas la votación con un grupo de votantes de un país e igualmente falla, por favor, detén la instancia del servidor y el frontend y reinícialos.

cd server
# Iniciar servidor de cada país
npm run dev:<abreviatura>
cd client
ng serve

Fase 5: Votar manualmente (Opcional)

Si lo deseas puedes llevar a cabo el flujo de votación paso a paso, para ello:

Flujo de una votación paso a paso

Al igual que en las simulaciones automáticas deberás emplear a un votante que aún no haya sido usado. Si todos lo han sido previamente deberás realizar la limpieza con:

cd server
# Limpieza de lo votantes del país NECESARIO para poder volver a votar con el mismo usuario
demo-clean:<abreviatura>

Hecho esto:

1. Login del votante (http://localhost:4200/login):

  • ID de votante: es-1 (o fr-1, de-1, pt-1, it-1)
  • Código secreto: TFG_Pass_Segura6983985()·$=
  • Clave privada: selecciona el archivo .pem desde keys/voters/<country>/<voterId>_private.pem

2. Selección de países: elige países a apoyar (no puedes votar por el tuyo)

3. Preparación del voto: revisa la selección y confirma

  1. Protocolo P2P: el sistema ejecuta un protocolo de votación distribuido:

    • Cada votante se comunica con otros en la red
    • Se cifran y se intercambian votos
    • Se calculan resultados sin revelar votos individuales
  2. Resultados: visualiza los puntos finales en el dashboard http://localhost:4200/results y http://localhost:4200/global-results

¡Votación completada!

Nota: Si deseas reiniciar la votación desde cero y eliminar todos los votos, deberás borrar la colección publicblock de las bases de datos.

use tfg_<abreviatura>
db.publicblock.drop()

Tras ello, deberás reiniciar el servidor del país correspondiente y el cliente web.

About

Trabajo Final de Grado de Ingeniería Multimedia en la Universidad de Alicante de Laura Saval Cillero tutorizado por Francisco Maciá Pérez durante el curso 2025/26.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages