SmartPoll es un sistema de votación electrónica diseñado con fines educativos que integra blockchain permisionada, códigos QR firmados digitalmente y Tokens Anónimos de Voto (TAV) para garantizar seguridad, transparencia y trazabilidad, preservando al mismo tiempo la privacidad del votante.
El sistema implementa un flujo de votación con pase de acceso, donde cada votante recibe un QR-Pase único firmado que valida su ingreso al proceso electoral. Una vez autenticado, se emite un Token Anónimo de Voto (TAV) que permite sufragar sin vincular identidad con preferencia, evitando el doble voto y asegurando un conteo verificable mediante blockchain.
Características del proyecto
- Acceso controlado mediante QR firmado
- Separación identidad–voto
- Prevención de doble voto
- Registro inmutable en blockchain
- Auditoría y trazabilidad
Cada votante recibe un QR-Pase único, aleatorio y firmado digitalmente que valida su derecho a ingresar al sistema de votación.
El sistema desacopla completamente la identidad del votante de su elección mediante el uso de Tokens Anónimos de Voto (TAV).
Los QRs y TAVs son marcados como utilizados una única vez, impidiendo reutilizaciones y garantizando la unicidad del voto.
Cada voto se registra como una transacción en una blockchain permisionada, permitiendo auditoría y verificación posterior.
Se pueden auditar los hashes de los TAVs consumidos y verificar que coincidan con la cantidad de votos emitidos.
Beneficios
- Transparencia electoral
- Confianza en el sistema
- Privacidad garantizada
- Escalabilidad educativa
Permite verificar el proceso completo de votación sin comprometer la privacidad del votante.
La inmutabilidad de blockchain y la firma digital de los tokens fortalecen la confianza en los resultados.
No existe vinculación directa entre el votante y su elección.
El sistema puede adaptarse a distintos escenarios de votación académicos o experimentales.
Tecnologías utilizadas
- Hardware
- Raspberry Pi 3 Model B: utilizadas en la mesa de ingreso y en el cuarto oscuro
- Cámara USB Logitech C170: lectura del QR-Pase
- Pantalla LCD 16x2 con módulo I2C: notificación del estado del escaneo
- Pantalla táctil HDMI + USB: interfaz de votación
- Frontend
- React con TypeScript
- Vite + SWC para bundling y compilación
- TailwindCSS para estilos
- Radix UI y shadcn/ui para componentes accesibles
- Server-Sent Events (SSE) para comunicación en tiempo real
- pnpm como gestor de dependencias
- Backend
- Spring Boot 3 sobre Java 21 LTS (gestión de usuarios y emisión de QR-Pase)
- Node.js + Express (servidor central de votación y gestión de TAVs)
- Python + Flask (servicio de escaneo de QR en Raspberry Pi)
- Redis para almacenamiento temporal de TAVs con TTL
- APIs HTTP/REST
- Server-Sent Events (SSE) para sincronización entre servicios
- Blockchain
- Hyperledger Fabric (blockchain permisionada)
- Smart Contracts desarrollados en TypeScript
- Canales independientes por elección
- Certificados X.509 para autenticación de organizaciones
- Hyperledger Explorer para visualización y auditoría
- Infraestructura y despliegue
- Docker y Docker Compose
- Amazon Web Services (AWS)
- Amazon ECS y ECR
- Amazon S3 y CloudFront
- Amazon RDS
- Elastic Load Balancer (ELB)
- Virtual Private Cloud (VPC)
- Terraform para Infraestructura como Código (IaC)
- GitHub Actions para CI/CD
SmartPoll se compone de dos estaciones físicas principales conectadas a una red local y a una blockchain permisionada:
- Mesa de ingreso: validación del QR-Pase y generación del Token Anónimo de Voto (TAV)
- Cuarto oscuro: validación del TAV y emisión del voto
| Componente | Cantidad | Uso |
|---|---|---|
| Raspberry Pi 3 Model B | 2 | Mesa de ingreso y cuarto oscuro |
| Pantalla LCD 16x2 con módulo I2C | 1 | Mesa de ingreso |
| Cámara USB | 1 | Lectura de QR |
| Pantalla táctil | 1 | Interfaz de votación |
El repositorio de SmartPoll se organiza de forma modular, separando claramente las responsabilidades del sistema de votación electrónica (frontend, backend, blockchain, infraestructura y auditoría). Esta estructura facilita el mantenimiento, la escalabilidad y el despliegue independiente de cada componente.
SmartPoll/ │ ├── .github/ # Configuración de GitHub │ └── workflows/ # Pipelines de CI/CD │ ├── audit-app/ # Aplicación web de auditoría ├── backend/ # Gestión de usuarios y QR-Pase ├── blockchain/ # Red blockchain permisionada │ ├── fabric-chain/ # Smart contracts (TAV y votos) │ └── explorer/ # Visualización y auditoría ├── infra/ # Infraestructura como Código (IaC) ├── qr-access-app/ # Frontend de acceso del votante ├── qr-scan/ # Servicio de escaneo de QR (Raspberry Pi) ├── reports/ # Informes del proyecto ├── votation-kiosk/ # Interfaz de votación (cuarto oscuro) ├── votation-server/ # Servidor central de votación ├── docker-compose.yml # Orquestación local del sistema ├── docker-compose.stack.yml # Despliegue distribuido ├── Makefile # Comandos de automatización ├── LICENSE # Licencia del proyecto └── README.md # Documentación principal
En este video se muestra el funcionamiento completo del sistema SmartPoll, incluyendo la emisión de votos, validación y registro en blockchain.
Flujo completo del proceso de votación
- Registro del votante en la plataforma web
- Generación del QR-Pase firmado
- Almacenamiento del token asociado al QR-Pase
- Presentación del QR-Pase por parte del votante
- Escaneo del QR-Pase
- Validación y marcado del QR-Pase
- Notificación del estado mediante SSE
- Habilitación de la interfaz de votación
- Emisión y envío del voto
- Registro del TAV en la blockchain permisionada
- Habilitación de un nuevo escaneo
Antes de iniciar el proceso, el votante debe registrarse en la plataforma web ingresando su correo electrónico, DNI y una contraseña, quedando identificado de manera única dentro del sistema.
Una vez validado el registro, el sistema genera un token aleatorio y lo asocia a un QR-Pase único y firmado digitalmente, vinculado al DNI del votante. El QR se muestra en la plataforma para su posterior presentación en la mesa de ingreso.
El token generado se almacena en la base de datos en la nube, quedando disponible para ser validado en el momento del sufragio.
El votante presenta el QR-Pase desde su dispositivo personal en la mesa de entrada para iniciar el proceso de verificación.
Una Raspberry Pi equipada con una cámara USB escanea el QR-Pase presentado por el votante y envía la información al servidor para su validación.
La Raspberry Pi consulta al servidor en la nube para verificar si el QR-Pase es válido y no ha sido utilizado previamente. Si es válido, el sistema lo marca como consumido; si no, se deniega el acceso al cuarto oscuro.
A través de una conexión Server-Sent Events (SSE), el servidor notifica al cliente que el QR-Pase fue consumido exitosamente. El dispositivo del votante indica que está habilitado para ingresar al cuarto oscuro y la conexión se cierra.
Cuando la Raspberry Pi de la mesa de entrada autoriza el ingreso, la Raspberry Pi ubicada en el cuarto oscuro genera y firma un Token Anónimo de Votación (TAV), habilitando la interfaz de votación para el votante.
El votante emite su voto, el cual se envía junto con el TAV firmado al servidor para su validación y posterior registro.
El Token Anónimo de Votación se registra como una transacción en la blockchain permisionada, garantizando inmutabilidad, trazabilidad y un conteo verificable de los votos.
Una vez finalizado el proceso de votación, la Raspberry Pi del cuarto oscuro se comunica con la Raspberry Pi de la mesa de entrada para habilitar un nuevo escaneo de QR-Pase.
La bitácora documenta el proceso de diseño, implementación, pruebas e iteraciones del sistema SmartPoll, incluyendo decisiones técnicas, problemas encontrados y soluciones adoptadas a lo largo del desarrollo.
- 📓 Bitácora completa del proyecto: Ver bitácora
Login del votante, visualización del QR-Pase y validación exitosa
Pantalla de espera y emisión del voto en el cuarto oscuro
Visualización de resultados y auditoría del proceso electoral
Hyperledger Explorer – bloques y transacciones registradas
SmartPoll utiliza Docker Compose y un Makefile para simplificar la ejecución del entorno completo de desarrollo, incluyendo los servicios Webserver + Frontend + Blockchain + Explorer.
Para construir las imágenes y levantar tales servicios del sistema:
makeEste comando inicializa la red blockchain, levanta los contenedores necesarios y deja el sistema listo para su uso en un entorno local.
Para detener y eliminar todos los contenedores creados:
make downEsto apaga el entorno de ejecución liberando los recursos utilizados.







