Gestione dei Fondi in Contratti Solidity: Creazione di un Portafoglio Semplice

by theArchitect
SHARE
Gestione dei Fondi in Contratti Solidity: Creazione di un Portafoglio Semplice
© Guida-HTML5.it

Introduzione

In questo tutorial, esploreremo come gestire i fondi in un contratto Solidity creando un semplice portafoglio. Questo portafoglio permetterà agli utenti di depositare e prelevare Ether in modo sicuro. Impareremo a implementare funzioni per la gestione dei saldi e a garantire che solo il proprietario del portafoglio possa effettuare prelievi. Questo esempio pratico è utile per comprendere le basi della gestione dell´ether all´interno di un contratto intelligente.

Codice completo


pragma solidity ^0.8.0;

contract SimpleWallet {
    // Variabile per memorizzare l´indirizzo del proprietario del contratto
    address public owner;

    // Mappatura per tenere traccia dei saldi degli utenti
    mapping(address => uint256) private balances;

    // Evento per il deposito di fondi
    event Deposited(address indexed user, uint256 amount);

    // Evento per il prelievo di fondi
    event Withdrawn(address indexed user, uint256 amount);

    // Modificatore per limitare l´accesso al proprietario
    modifier onlyOwner() {
        require(msg.sender == owner, "Non sei il proprietario del contratto");
        _;
    }

    // Costruttore per impostare il proprietario del contratto
    constructor() {
        owner = msg.sender;
    }

    // Funzione per depositare Ether nel portafoglio
    function deposit() public payable {
        require(msg.value > 0, "Devi inviare un importo maggiore di zero");
        balances[msg.sender] += msg.value;
        emit Deposited(msg.sender, msg.value);
    }

    // Funzione per prelevare Ether dal portafoglio
    function withdraw(uint256 amount) public onlyOwner {
        require(amount <= balances[owner], "Saldo insufficiente");
        balances[owner] -= amount;
        payable(owner).transfer(amount);
        emit Withdrawn(owner, amount);
    }

    // Funzione per controllare il saldo dell´utente
    function getBalance() public view returns (uint256) {
        return balances[msg.sender];
    }
}

Spiegazione

Analizziamo il codice del nostro contratto SimpleWallet:

  • Variabili:
    • address public owner; - Questa variabile memorizza l´indirizzo del proprietario del contratto, impostato nel costruttore.
    • mapping(address => uint256) private balances; - Questa mappatura tiene traccia dei saldi di Ether per ogni indirizzo che interagisce con il contratto.
  • Eventi:
    • event Deposited(address indexed user, uint256 amount); - Evento emesso quando un utente deposita Ether.
    • event Withdrawn(address indexed user, uint256 amount); - Evento emesso quando il proprietario preleva Ether.
  • Modificatori:
    • modifier onlyOwner() - Questo modificatore verifica che solo il proprietario del contratto possa eseguire determinate funzioni, come il prelievo.
  • Funzioni:
    • function deposit() public payable - Permette agli utenti di depositare Ether nel contratto. Utilizza msg.value per ottenere l´importo inviato.
    • function withdraw(uint256 amount) public onlyOwner - Permette al proprietario di prelevare Ether dal contratto, assicurandosi che il saldo sia sufficiente.
    • function getBalance() public view returns (uint256) - Restituisce il saldo attuale dell´utente che chiama la funzione.

Best practice

Quando si sviluppano contratti intelligenti per la gestione di Ether, è importante seguire alcune best practice:

  • Controllo degli accessi: Utilizzare modificatori per limitare l´accesso a funzioni critiche, come il prelievo di fondi.
  • Gestione degli errori: Utilizzare require per gestire condizioni di errore e garantire che le funzioni non vengano eseguite in caso di input non validi.
  • Eventi: Emissione di eventi per tenere traccia delle operazioni di deposito e prelievo, facilitando la trasparenza e la tracciabilità.
  • Test e audit: Testare ampiamente il contratto e considerare l´audit da parte di esperti per identificare potenziali vulnerabilità.

Riepilogo

In questo tutorial, abbiamo creato un semplice portafoglio in Solidity che consente agli utenti di depositare e prelevare Ether. Abbiamo esaminato le variabili, gli eventi, i modificatori e le funzioni necessarie per gestire i fondi in modo sicuro. Seguendo le best practice, possiamo garantire che il nostro contratto sia robusto e sicuro.

Approfondisci con risorse ufficiali

SHARE