Este proyecto implementa un sistema de votación descentralizado que permite:
- Crear propuestas para ser votadas.
- Registrar votos de forma segura y anónima.
- Consultar los resultados de las votaciones.
- Docker: Para el despliegue del proyecto.
- Ethereum y Solidity: Para el desarrollo del contrato inteligente.
- Python (web3.py): Para la interfaz de línea de comandos.
- JavaScript: Para los tests unitarios del contrato.
- Truffle y Ganache: Para la configuración y pruebas de la blockchain local.
El proyecto está estructurado de la siguiente forma:
-
cli/: Contiene el cliente de línea de comandos (CLI):
- config.py: Configura la conexión a la blockchain.
- main.py: Archivo principal para ejecutar el CLI.
- utils.py: Funciones auxiliares para las operaciones del CLI.
-
contracts/: Contiene el contrato Voting.sol, que implementa el sistema de votación.
-
docker/: Contiene los archivos relacionados con la configuración de Docker.
-
migrations/: Scripts para desplegar contratos.
-
test/: Contiene las pruebas automatizadas para los contratos.
-
truffle-config.js: Archivo de configuración para Truffle.
-
Makefile: Proporciona comandos para facilitar tareas comunes como construcción, migración y pruebas.
- Usamos python:3.9-slim como imagen base.
- Copiamos los archivos del proyecto al contenedor.
- Instalamos las dependencias necesarias de Python y Node.js.
- El contenedor no comienza directamente el proceso, sino que instala todas las dependencias.
start.sh
es llamado posteriormente conmake migrate
para configurar y lanzar el proyecto.
Declaramos dos servicios:
-
Ganache:
- Crea una red Ethereum local para pruebas.
- Usa
--mnemonic
para mantener las mismas claves privadas entre reinicios. --account_keys_path /data/keys.json
guarda las claves privadas en un archivo JSON.
-
App:
- Construye la imagen desde el Dockerfile.
- Volúmenes:
- Permiten compartir archivos entre los contenedores
- Variables de entorno:
- Configuran el CLI para conectarse a la blockchain local.
El contrato VotingSystem implementa las siguientes funcionalidades:
- Crear propuestas con
addProposal
. - Votar propuestas con
vote
(usuarios no pueden votar más de una vez por propuesta). - Cerrar propuestas con
closeProposal
(solo el propietario puede hacerlo). - Consultar resultados con
getProposalResults
.
-
Configuración con
start.sh
: Este script realiza las siguientes tareas:- Inicia Ganache con parámetros como
--deterministic
y--account_keys_path
. - Realiza las migraciones con Truffle y despliega el contrato.
- Extrae las claves privadas y direcciones del contrato desde Ganache y Truffle, generando un archivo
.env
para el CLI. - Copia el ABI necesario al directorio del CLI.
- Inicia Ganache con parámetros como
-
Conexión con
config.py
: Este archivo:- Carga las variables de entorno desde
.env
. - Se conecta a Ganache a través de RPC.
- Crea un objeto
VotingSystem
en base al ABI. - Configura una cuenta Ethereum para firmar transacciones.
- Carga las variables de entorno desde
El CLI permite a los usuarios:
- Crear propuestas: Permite registrar propuestas nuevas con nombre y fecha límite para votar.
- Votar en propuestas: Los usuarios pueden votar a favor o en contra de las propuestas activas.
- Cerrar propuestas: Solo el propietario puede cerrar propuestas manualmente.
- Consultar resultados: Muestra el estado actual y los resultados de las propuestas cerradas o activas.
- Cerrar automáticamente propuestas expiradas: Se realiza al inicio del CLI y mediante una función llamada
update_close_status
.
Las pruebas son fundamentales para garantizar la correcta ejecución del contrato inteligente, dado que los errores en blockchain son irreversibles.
Truffle permite realizar pruebas automatizadas sobre la blockchain local (Ganache). Se cubren los siguientes casos:
- Verificar que solo el propietario pueda agregar propuestas.
- Comprobar que se rechacen propuestas con entradas inválidas.
- Verificar que las votaciones se registren correctamente y de forma anónima.
- Garantizar que las propuestas no puedan ser cerradas por usuarios no propietarios.
- Validar los resultados retornados por
getProposalResults
. - Comprobar que los eventos se emitan correctamente.
Ejecución:
make test
-
Clona este repositorio:
git clone https://github.com/cmunoz-g/decentralized_voting.git cd decentralized_voting
-
Construye los contenedores:
make build
-
Configura el proyecto:
make migrate
-
Ejecuta el CLI:
make run
-
Detener los contenedores:
make stop
-
Eliminar contenedores y volúmenes:
make clean
-
Pruebas:
make test
-
Ver logs:
make logs
-
Recrear todo:
make re