Introduzione
In questo tutorial, esploreremo come creare un sistema di voto decentralizzato utilizzando Solidity per scrivere il nostro smart contract e Web3.js per interagire con la blockchain di Ethereum. Questo esempio pratico ci permetterà di comprendere come gestire le votazioni in modo sicuro e trasparente, sfruttando le potenzialità della tecnologia blockchain.
Codice completo
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Voting {
struct Candidate {
uint id;
string name;
uint voteCount;
}
mapping(uint => Candidate) public candidates;
mapping(address => bool) public voters;
uint public candidatesCount;
string public electionName;
constructor(string memory _electionName) {
electionName = _electionName;
}
function addCandidate(string memory _name) public {
candidatesCount++;
candidates[candidatesCount] = Candidate(candidatesCount, _name, 0);
}
function vote(uint _candidateId) public {
require(!voters[msg.sender], "Hai già votato.");
require(_candidateId > 0 && _candidateId <= candidatesCount, "ID candidato non valido.");
voters[msg.sender] = true;
candidates[_candidateId].voteCount++;
}
function getCandidate(uint _candidateId) public view returns (string memory, uint) {
require(_candidateId > 0 && _candidateId <= candidatesCount, "ID candidato non valido.");
Candidate memory candidate = candidates[_candidateId];
return (candidate.name, candidate.voteCount);
}
}
Spiegazione
Analizziamo il codice dello smart contract per il sistema di voto decentralizzato:
- Struttura Candidate: Definiamo una struttura per rappresentare un candidato, con un ID, un nome e un conteggio dei voti.
- Mapping: Utilizziamo un mapping per memorizzare i candidati e un altro per tenere traccia degli indirizzi che hanno già votato.
- Costruttore: Il costruttore inizializza il nome dell´elezione.
- addCandidate: Questa funzione consente di aggiungere un nuovo candidato all´elezione. Incrementiamo il contatore dei candidati e memorizziamo il nuovo candidato nel mapping.
- vote: La funzione di voto verifica che l´utente non abbia già votato e che l´ID del candidato sia valido. Se entrambe le condizioni sono soddisfatte, registra il voto.
- getCandidate: Questa funzione restituisce il nome e il conteggio dei voti di un candidato specifico.
Best practice
Quando si sviluppano smart contract, è fondamentale seguire alcune best practice per garantire la sicurezza e l´efficienza del codice:
- Controllo degli accessi: Assicurati di implementare controlli adeguati per limitare chi può eseguire determinate funzioni, come l´aggiunta di candidati.
- Test approfonditi: Scrivi test unitari per verificare il corretto funzionamento del tuo smart contract. Utilizza strumenti come Truffle o Hardhat per facilitare il testing.
- Gestione degli errori: Utilizza require e assert per gestire gli errori e garantire che le condizioni siano soddisfatte prima di eseguire le operazioni.
- Documentazione: Commenta il tuo codice e scrivi una documentazione chiara per facilitare la comprensione e la manutenzione futura.
Riepilogo
In questo tutorial abbiamo creato un semplice sistema di voto decentralizzato utilizzando Solidity e Web3.js. Abbiamo visto come definire uno smart contract per gestire candidati e voti, e abbiamo discusso alcune best practice per lo sviluppo di smart contract. Questo esempio rappresenta un ottimo punto di partenza per sviluppare applicazioni più complesse e sicure sulla blockchain.
