Creazione di un Sistema di Voto Decentralizzato con Solidity e Web3.js

by theArchitect
SHARE
Creazione di un Sistema di Voto Decentralizzato con Solidity e Web3.js
© Guida-HTML5.it

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.

Approfondisci con risorse ufficiali

SHARE