Introduzione
In questo tutorial, esploreremo come utilizzare block.timestamp in Solidity per implementare scadenze e limitazioni temporali nei contratti intelligenti. La gestione del tempo è fondamentale in molte applicazioni decentralizzate, come aste, contratti di prestito e token di accesso. Comprendere come utilizzare block.timestamp ci permette di creare logiche di business più complesse e sicure.
Codice completo
pragma solidity ^0.8.0;
contract Scadenza {
address public proprietario;
uint256 public scadenza;
bool public attivo;
event Attivato(uint256 scadenza);
event ScadenzaRaggiunta();
modifier soloProprietario() {
require(msg.sender == proprietario, "Non sei il proprietario.");
_;
}
modifier soloAttivo() {
require(attivo, "Il contratto non è attivo.");
_;
}
modifier nonScaduto() {
require(block.timestamp Spiegazione
Il contratto Scadenza permette di gestire un periodo di attivazione per un´operazione specifica. Ecco i componenti principali:
- Variabili di stato:
proprietario: l´indirizzo del creatore del contratto.scadenza: timestamp che rappresenta la scadenza dell´attività.attivo: uno stato booleano che indica se il contratto è attivo.
- Eventi:
Attivato: emesso quando il contratto viene attivato con una scadenza.ScadenzaRaggiunta: emesso quando il contratto viene disattivato dopo la scadenza.
- Modificatori:
soloProprietario: consente l´accesso solo al proprietario del contratto.soloAttivo: verifica che il contratto sia attivo.nonScaduto: verifica che la scadenza non sia stata raggiunta.
- Funzioni:
attiva: attiva il contratto impostando una scadenza.verificaScadenza: restituiscetruese il contratto è ancora attivo.disattiva: disattiva il contratto se la scadenza non è stata raggiunta.
Quando il proprietario chiama la funzione attiva, il contratto calcola la scadenza aggiungendo il numero di secondi specificato al block.timestamp attuale. La funzione verificaScadenza permette di controllare se il contratto è ancora attivo, mentre la funzione disattiva consente al proprietario di disattivare il contratto prima della scadenza.
Best practice
- Controllo del tempo: Utilizzare
block.timestampcon attenzione, poiché i miner possono influenzare leggermente il timestamp. Non fare affidamento su di esso per logiche critiche. - Gestione degli eventi: Emissione di eventi per monitorare le azioni del contratto. Questo aiuta a mantenere la trasparenza e a facilitare il debug.
- Limitazioni temporali: Assicurati di gestire correttamente le scadenze, utilizzando modificatori per garantire che le funzioni siano chiamate solo quando appropriato.
- Test approfonditi: Testa il contratto in vari scenari per assicurarti che le scadenze e le attivazioni funzionino come previsto.
Riepilogo
In questo tutorial, abbiamo visto come utilizzare block.timestamp per gestire scadenze e limitazioni temporali in Solidity. Abbiamo implementato un contratto semplice che attiva e disattiva funzioni basate sul tempo, utilizzando eventi e modificatori per garantire la sicurezza e la chiarezza del codice. La gestione del tempo è un aspetto cruciale nello sviluppo di contratti intelligenti e, con le giuste pratiche, possiamo costruire applicazioni più robuste e affidabili.
