Creare un Contratto di Crowdfunding in Solidity

by theArchitect
SHARE
Creare un Contratto di Crowdfunding in Solidity
© Guida-HTML5.it

Introduzione

Il crowdfunding è un metodo innovativo per raccogliere fondi per progetti attraverso contributi da parte di molte persone. In questo tutorial, esploreremo come costruire un contratto intelligente di crowdfunding utilizzando Solidity. Questo contratto permetterà agli utenti di contribuire con Ether a un progetto e di ottenere un rimborso se l´obiettivo di finanziamento non viene raggiunto entro un certo periodo di tempo.

Codice completo


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Crowdfunding {
    address public owner;
    uint public goal;
    uint public deadline;
    uint public totalFunds;
    mapping(address => uint) public contributions;
    bool public goalReached;

    event FundReceived(address contributor, uint amount);
    event GoalReached(uint totalFunds);
    event RefundIssued(address contributor, uint amount);

    constructor(uint _goal, uint _duration) {
        owner = msg.sender;
        goal = _goal;
        deadline = block.timestamp + _duration;
        totalFunds = 0;
        goalReached = false;
    }

    function contribute() public payable {
        require(block.timestamp  0, "Devi inviare un importo maggiore di zero");

        contributions[msg.sender] += msg.value;
        totalFunds += msg.value;

        emit FundReceived(msg.sender, msg.value);

        if (totalFunds >= goal) {
            goalReached = true;
            emit GoalReached(totalFunds);
        }
    }

    function issueRefund() public {
        require(block.timestamp >= deadline, "Deadline non ancora superata");
        require(!goalReached, "Obiettivo raggiunto, nessun rimborso disponibile");

        uint amount = contributions[msg.sender];
        require(amount > 0, "Nessun contributo trovato");

        contributions[msg.sender] = 0;
        payable(msg.sender).transfer(amount);

        emit RefundIssued(msg.sender, amount);
    }

    function withdrawFunds() public {
        require(msg.sender == owner, "Solo il proprietario può prelevare fondi");
        require(goalReached, "Obiettivo non raggiunto");

        payable(owner).transfer(totalFunds);
    }
}

Spiegazione

Analizziamo il contratto di crowdfunding riga per riga:

  • Variabili di stato:
    • owner: l´indirizzo del creatore del contratto.
    • goal: l´obiettivo di finanziamento in wei.
    • deadline: il timestamp entro il quale deve essere raggiunto l´obiettivo.
    • totalFunds: l´importo totale raccolto.
    • contributions: una mappatura degli indirizzi degli utenti e dei loro contributi.
    • goalReached: un booleano che indica se l´obiettivo è stato raggiunto.
  • Eventi: Gli eventi FundReceived, GoalReached e RefundIssued vengono utilizzati per registrare le azioni significative nel contratto.
  • Costruttore: Inizializza il contratto impostando l´obiettivo e la durata. Calcola la scadenza in base al timestamp attuale.
  • Funzione contribute: Consente agli utenti di inviare Ether al contratto. Aggiorna il totale dei fondi e verifica se l´obiettivo è stato raggiunto.
  • Funzione issueRefund: Permette agli utenti di richiedere un rimborso se l´obiettivo non è stato raggiunto entro la scadenza.
  • Funzione withdrawFunds: Consente al proprietario di prelevare i fondi solo se l´obiettivo è stato raggiunto.

Best practice

  • Controlli di sicurezza: Assicurati di utilizzare require per gestire condizioni di errore e prevenire comportamenti indesiderati.
  • Gestione degli eventi: Utilizza eventi per tracciare le azioni significative nel contratto, facilitando il monitoraggio delle transazioni.
  • Testare il contratto: Prima di distribuire il contratto sulla rete principale, esegui test approfonditi su una rete di test per garantire che tutte le funzionalità funzionino come previsto.
  • Limitare l´accesso: Usa modificatori di accesso per limitare l´esecuzione di determinate funzioni solo a utenti autorizzati, come il proprietario del contratto.

Riepilogo

In questo tutorial, abbiamo creato un contratto intelligente di crowdfunding in Solidity. Abbiamo esplorato la struttura del contratto, le funzioni chiave e le best practice per garantire la sicurezza e l´efficacia del contratto. Questo esempio rappresenta un ottimo punto di partenza per comprendere come implementare logiche di raccolta fondi su blockchain.

Approfondisci con risorse ufficiali

SHARE