README.md 6.86 KB
Newer Older
timothe 2004's avatar
timothe 2004 committed
1 2
# DApp de Vote

timothe 2004's avatar
timothe 2004 committed
3
Cette application décentralisée (DApp) permet de gérer un système de vote transparent sur la blockchain Ethereum. Elle implémente un processus de vote complet, depuis l'enregistrement des électeurs jusqu'au dépouillement des résultats.
timothe 2004's avatar
timothe 2004 committed
4 5 6 7 8

## Fonctionnalités

- Inscription des électeurs sur liste blanche par l'administrateur
- Enregistrement des propositions par les électeurs inscrits
timothe 2004's avatar
timothe 2004 committed
9 10
- Vote pour les propositions
- Délégation de vote à d'autres électeurs
timothe 2004's avatar
timothe 2004 committed
11 12
- Comptabilisation automatique des votes
- Vérification des résultats accessible à tous
timothe 2004's avatar
timothe 2004 committed
13
- Période limitée pour l'enregistrement des propositions et le vote
Quentin Hamitouche's avatar
Quentin Hamitouche committed
14 15 16 17 18 19 20 21 22 23 24 25
- Réinitialisation du système de vote

## Organisation du groupe

Nous avons effectué beaucoup de peer programming. Néanmoins, le travail côté individuel pourrait être résumé comme ceci :

- Guillaume Dewisme : Majorité du contrat Solidity, base du front
- Quentin Hamitouche : front, configuration / mise aux normes, fonctionnalités supplémentaires dans le contrat

## Vidéo de démonstration

[Lien ici](https://sae-contrats-intelligents.freeboxos.fr)
timothe 2004's avatar
timothe 2004 committed
26 27 28

## Technologies utilisées

Quentin Hamitouche's avatar
Quentin Hamitouche committed
29
- **Smart Contract**: Solidity 0.8.29, OpenZeppelin
timothe 2004's avatar
timothe 2004 committed
30
- **Backend**: Hardhat (environnement de développement Ethereum)
Quentin Hamitouche's avatar
Quentin Hamitouche committed
31 32
- **Frontend**: React
- **Web3**: ethers.js
timothe 2004's avatar
timothe 2004 committed
33
- **Styling**: Bootstrap 5
timothe 2004's avatar
timothe 2004 committed
34 35 36

## Structure du Projet

timothe 2004's avatar
timothe 2004 committed
37 38 39 40
- `contracts/` : Smart contracts Solidity
  - `Voting.sol` : Contrat principal de la DApp
- `scripts/` : Scripts de déploiement et d'interaction avec le contrat
  - `deploy.js` : Script pour déployer le contrat sur la blockchain
Quentin Hamitouche's avatar
Quentin Hamitouche committed
41 42
- `frontend/` : Interface utilisateur React
- `frontend-angular/` : Interface utilisateur Angular (test, pas finie)
timothe 2004's avatar
timothe 2004 committed
43 44
- `test/` : Tests automatisés pour les smart contracts

timothe 2004's avatar
timothe 2004 committed
45 46
## Prérequis

Quentin Hamitouche's avatar
Quentin Hamitouche committed
47
- Node.js v22+
timothe 2004's avatar
timothe 2004 committed
48 49 50 51 52
- MetaMask ou un autre portefeuille Ethereum installé dans votre navigateur

## Installation et démarrage

1. **Cloner le dépôt et installer les dépendances**
timothe 2004's avatar
timothe 2004 committed
53 54

```bash
timothe 2004's avatar
timothe 2004 committed
55 56
git clone <url-du-repo>
cd voting-dapp
timothe 2004's avatar
timothe 2004 committed
57
npm install
timothe 2004's avatar
timothe 2004 committed
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
```

2. **Compiler les smart contracts**

```bash
npm run compile
```

3. **Démarrer un nœud Ethereum local**

```bash
npm run node
```

Ce nœud local s'exécutera à l'adresse `http://127.0.0.1:8545`.

4. **Déployer le contrat sur le nœud local**

Dans un nouveau terminal, exécutez:

```bash
npm run deploy
```

Notez l'adresse du contrat déployé, vous en aurez besoin pour configurer le frontend.

Quentin Hamitouche's avatar
Quentin Hamitouche committed
84 85 86 87 88 89
En cas de problème, exécuter arrêter le noeud puis exécuter cette commande :

```bash
npx hardhat clean
```

timothe 2004's avatar
timothe 2004 committed
90 91 92 93 94 95 96
5. **Configurer et démarrer le frontend Angular**

```bash
cd frontend-angular
npm install
```

Quentin Hamitouche's avatar
Quentin Hamitouche committed
97
Pour configurer l'adresse du contrat, ouvrez le fichier `src/utils/contract.js` et modifiez la ligne suivante avec l'adresse de votre contrat déployé:
timothe 2004's avatar
timothe 2004 committed
98 99

```javascript
Quentin Hamitouche's avatar
Quentin Hamitouche committed
100
export const CONTRACT_ADDRESS = "<ADRESSE_DU_CONTRAT_DÉPLOYÉ>";
timothe 2004's avatar
timothe 2004 committed
101
```
timothe 2004's avatar
timothe 2004 committed
102

timothe 2004's avatar
timothe 2004 committed
103 104 105
Puis démarrez l'application:

```bash
timothe 2004's avatar
timothe 2004 committed
106 107 108
npm run dev
```

Quentin Hamitouche's avatar
Quentin Hamitouche committed
109
L'application sera accessible à l'adresse `http://localhost:3000`.
timothe 2004's avatar
timothe 2004 committed
110 111 112 113 114 115 116

## Guide d'utilisation

### 1. Connexion à MetaMask

- Au démarrage de l'application, cliquez sur "Connecter votre portefeuille"
- Autorisez la connexion dans MetaMask
Quentin Hamitouche's avatar
Quentin Hamitouche committed
117
- Assurez-vous d'être sur le réseau local Hardhat (localhost:8545, Chain ID: 31337)
timothe 2004's avatar
timothe 2004 committed
118 119 120 121 122 123

### 2. Processus de vote

Le processus de vote suit plusieurs étapes:

#### Phase 1: Enregistrement des électeurs
Quentin Hamitouche's avatar
Quentin Hamitouche committed
124

timothe 2004's avatar
timothe 2004 committed
125 126 127 128
- Seul l'administrateur (le déployeur du contrat) peut enregistrer des électeurs
- Entrez l'adresse Ethereum de chaque électeur dans le formulaire

#### Phase 2: Enregistrement des propositions
Quentin Hamitouche's avatar
Quentin Hamitouche committed
129

timothe 2004's avatar
timothe 2004 committed
130 131 132 133
- L'administrateur démarre cette phase en spécifiant une durée en minutes
- Les électeurs enregistrés peuvent soumettre des propositions

#### Phase 3: Fin de l'enregistrement des propositions
Quentin Hamitouche's avatar
Quentin Hamitouche committed
134

timothe 2004's avatar
timothe 2004 committed
135 136 137
- L'administrateur termine cette phase manuellement ou la période expire automatiquement

#### Phase 4: Session de vote
Quentin Hamitouche's avatar
Quentin Hamitouche committed
138

timothe 2004's avatar
timothe 2004 committed
139 140 141 142
- L'administrateur démarre la session en spécifiant une durée en minutes
- Les électeurs peuvent voter pour une proposition ou déléguer leur vote

#### Phase 5: Fin de la session de vote
Quentin Hamitouche's avatar
Quentin Hamitouche committed
143

timothe 2004's avatar
timothe 2004 committed
144 145 146
- L'administrateur termine cette phase manuellement ou la période expire automatiquement

#### Phase 6: Dépouillement des votes
Quentin Hamitouche's avatar
Quentin Hamitouche committed
147

timothe 2004's avatar
timothe 2004 committed
148 149
- L'administrateur déclenche le comptage des votes
- Les résultats sont visibles par tous les utilisateurs
Quentin Hamitouche's avatar
Quentin Hamitouche committed
150
- L'administrateur peut démarrer une nouvelle session de vote
timothe 2004's avatar
timothe 2004 committed
151 152 153 154 155 156 157 158 159 160

## Tests

### Tests des smart contracts

```bash
npm test
```

Ces tests vérifient:
Quentin Hamitouche's avatar
Quentin Hamitouche committed
161

timothe 2004's avatar
timothe 2004 committed
162 163 164 165 166 167 168 169 170
- L'enregistrement des électeurs
- Le cycle de vie du workflow
- La soumission de propositions
- Le processus de vote et de délégation
- Le dépouillement des résultats

### Tests manuels du frontend

1. **Test du rôle administrateur**
Quentin Hamitouche's avatar
Quentin Hamitouche committed
171

timothe 2004's avatar
timothe 2004 committed
172 173 174 175
   - Utilisez le compte qui a déployé le contrat
   - Vérifiez que vous pouvez enregistrer des électeurs et gérer le workflow

2. **Test du rôle électeur**
Quentin Hamitouche's avatar
Quentin Hamitouche committed
176

timothe 2004's avatar
timothe 2004 committed
177 178 179 180 181 182 183 184 185 186
   - Connectez-vous avec un compte enregistré comme électeur
   - Soumettez des propositions et votez

3. **Test de l'utilisateur non autorisé**
   - Connectez-vous avec un compte non enregistré
   - Vérifiez que vous ne pouvez ni soumettre de propositions ni voter

## Fonctionnalités supplémentaires

1. **Limite de temps pour les phases**
Quentin Hamitouche's avatar
Quentin Hamitouche committed
187

timothe 2004's avatar
timothe 2004 committed
188 189
   - Les phases d'enregistrement des propositions et de vote ont des durées configurables
   - Le système verrouille automatiquement les actions après expiration
Quentin Hamitouche's avatar
Quentin Hamitouche committed
190 191 192 193 194 195
   - N.B. : Cette fonctionnalité n'a pas pu être finie, car nous nous sommes rendus compte qu'il était impossible de créer des évènements planifiés avec les contrats intelligents

1. (bis) **Réinitialisation du système de vote**

   - À la fin d'une session de vote, l'administrateur peut cliquer sur le bouton "Nouveau vote"
   - Cela réinitialisera les propopsitions
timothe 2004's avatar
timothe 2004 committed
196

Quentin Hamitouche's avatar
Quentin Hamitouche committed
197
1. **Système de délégation de vote**
timothe 2004's avatar
timothe 2004 committed
198 199 200 201 202 203 204 205 206 207 208 209
   - Les électeurs peuvent déléguer leur vote à un autre électeur enregistré
   - Vérification des boucles de délégation pour éviter les références circulaires

## Utilisation en production

Pour un déploiement en production, vous devrez:

1. Modifier le fichier `hardhat.config.js` pour spécifier un réseau public (Mainnet, Goerli, etc.)
2. Ajouter une clé privée sécurisée ou utiliser un gestionnaire de clés
3. Déployer le contrat sur le réseau choisi
4. Configurer le frontend avec la nouvelle adresse de contrat
5. Déployer le frontend sur un service d'hébergement
timothe 2004's avatar
timothe 2004 committed
210

timothe 2004's avatar
timothe 2004 committed
211
## Dépannage
timothe 2004's avatar
timothe 2004 committed
212

timothe 2004's avatar
timothe 2004 committed
213
### Problèmes courants
timothe 2004's avatar
timothe 2004 committed
214

timothe 2004's avatar
timothe 2004 committed
215
1. **Erreur "No such contract"**
Quentin Hamitouche's avatar
Quentin Hamitouche committed
216

timothe 2004's avatar
timothe 2004 committed
217 218
   - Vérifiez que le contrat est bien déployé
   - Assurez-vous que l'adresse du contrat dans le frontend est correcte
timothe 2004's avatar
timothe 2004 committed
219

timothe 2004's avatar
timothe 2004 committed
220
2. **Erreur "Cannot estimate gas"**
Quentin Hamitouche's avatar
Quentin Hamitouche committed
221

timothe 2004's avatar
timothe 2004 committed
222 223
   - La transaction peut échouer à cause des règles du contrat
   - Vérifiez que vous êtes dans la bonne phase du workflow
timothe 2004's avatar
timothe 2004 committed
224

timothe 2004's avatar
timothe 2004 committed
225 226 227
3. **MetaMask n'affiche pas la confirmation**
   - Assurez-vous d'être sur le bon réseau (localhost:8545)
   - Redémarrez MetaMask si nécessaire
timothe 2004's avatar
timothe 2004 committed
228

timothe 2004's avatar
timothe 2004 committed
229
### Support
timothe 2004's avatar
timothe 2004 committed
230

Quentin Hamitouche's avatar
Quentin Hamitouche committed
231
Pour toute question ou problème, veuillez ouvrir une issue sur le dépôt GitHub.