Introduzione
In questo tutorial, esploreremo come utilizzare i modificatori in Solidity per gestire le autorizzazioni nei contratti decentralizzati. I modificatori sono una potente funzionalità di Solidity che consente di riutilizzare il codice e di applicare logiche di controllo degli accessi in modo semplice ed efficace. Impareremo a creare un contratto che utilizza i modificatori per limitare l´accesso a determinate funzioni in base ai ruoli degli utenti.
Codice completo
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract RuoliAutorizzazione {
address public proprietario;
mapping(address => bool) public amministratori;
mapping(address => bool) public utenti;
// Eventi per il logging delle azioni
event AmministratoreAggiunto(address indexed amministratore);
event AmministratoreRimosso(address indexed amministratore);
event UtenteAggiunto(address indexed utente);
event UtenteRimosso(address indexed utente);
// Modificatore per limitare l´accesso al proprietario
modifier soloProprietario() {
require(msg.sender == proprietario, "Solo il proprietario può eseguire questa operazione.");
_;
}
// Modificatore per limitare l´accesso agli amministratori
modifier soloAmministratore() {
require(amministratori[msg.sender], "Solo gli amministratori possono eseguire questa operazione.");
_;
}
constructor() {
proprietario = msg.sender; // Imposta il creatore del contratto come proprietario
}
// Funzione per aggiungere un amministratore
function aggiungiAmministratore(address _amministratore) public soloProprietario {
amministratori[_amministratore] = true;
emit AmministratoreAggiunto(_amministratore);
}
// Funzione per rimuovere un amministratore
function rimuoviAmministratore(address _amministratore) public soloProprietario {
amministratori[_amministratore] = false;
emit AmministratoreRimosso(_amministratore);
}
// Funzione per aggiungere un utente
function aggiungiUtente(address _utente) public soloAmministratore {
utenti[_utente] = true;
emit UtenteAggiunto(_utente);
}
// Funzione per rimuovere un utente
function rimuoviUtente(address _utente) public soloAmministratore {
utenti[_utente] = false;
emit UtenteRimosso(_utente);
}
// Funzione per verificare se un indirizzo è un utente
function èUtente(address _utente) public view returns (bool) {
return utenti[_utente];
}
}
Spiegazione
Il contratto RuoliAutorizzazione gestisce due ruoli principali: il proprietario e gli amministratori. Il proprietario è colui che ha creato il contratto e ha il potere di aggiungere o rimuovere amministratori. Gli amministratori, a loro volta, possono gestire gli utenti.
Abbiamo definito due modificatori:
- soloProprietario: consente l´accesso solo al proprietario del contratto.
- soloAmministratore: consente l´accesso solo agli indirizzi che sono stati designati come amministratori.
Ogni volta che un amministratore o un utente viene aggiunto o rimosso, viene emesso un evento per tenere traccia delle modifiche. Questo è utile per la trasparenza e per il monitoraggio delle azioni nel contratto.
Best practice
- Utilizzare eventi: Gli eventi sono fondamentali per il tracciamento delle azioni nel contratto. Assicurati di emettere eventi per ogni operazione che modifica lo stato del contratto.
- Limitare l´accesso: Utilizza i modificatori per limitare l´accesso alle funzioni critiche. Questo aumenta la sicurezza del contratto e riduce il rischio di accessi non autorizzati.
- Testare il contratto: Prima di distribuire il contratto sulla rete principale, esegui test approfonditi su una rete di test per garantire che tutte le funzioni e i modificatori funzionino come previsto.
- Documentazione: Documenta il tuo codice e le tue funzioni. Questo aiuta altri sviluppatori (e te stesso in futuro) a capire rapidamente come funziona il contratto.
Riepilogo
In questo tutorial, abbiamo visto come implementare un sistema di gestione delle autorizzazioni utilizzando i modificatori in Solidity. Abbiamo creato un contratto che consente al proprietario di gestire gli amministratori e agli amministratori di gestire gli utenti. I modificatori ci hanno permesso di semplificare il controllo degli accessi e di rendere il codice più leggibile e manutenibile.
