Informazioni sulle nozioni di base del linguaggio

Completato

Tutti i contratti Solidity includono in genere:

  • Direttive pragma
  • Variabili di stato
  • Funzioni
  • Events

Anche se c'è molto di più da sapere per programmare i contratti intelligenti a livello di produzione, con queste informazioni sarà possibile iniziare nel modo giusto.

Se si conoscono già questi concetti, è possibile iniziare subito a scrivere contratti intelligenti per casi d'uso diversi.

Direttive pragma

Pragma è la parola chiave usata per chiedere al compilatore di controllare se la versione di Solidity corrisponde a quella richiesta. In caso di corrispondenza, sarà possibile eseguire correttamente il file di origine. In caso di mancata corrispondenza, il compilatore restituirà un errore.

Assicurarsi sempre di includere la versione più recente di Solidity nella definizione del contratto. Per trovare la versione corrente di Solidity, visitare il sito Web di Solidity. Usare la versione più recente nel file di origine.

Una direttiva pragma relativa alla versione è simile a quanto segue:

pragma solidity ^0.7.0;

Questa riga indica che il file di origine verrà compilato con un compilatore successivo alla versione 0.7.0, fino a 0.7.9. A partire dalla versione 0.8.0 verranno probabilmente apportate modifiche di rilievo che impediranno la corretta compilazione del file di origine.

Variabili di stato

Le variabili di stato sono fondamentali per qualsiasi file di origine Solidity. I valori delle variabili di stato vengono archiviati in modo permanente nell'archivio dei contratti.

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    uint price; // State variable  

Nota

I file di origine dei contratti iniziano sempre con la definizione contract NomeContratto.

In questo esempio la variabile di ambiente è denominata price, con tipo uint. Il tipo Integer uint indica che questa variabile è un intero senza segno a 256 bit. Ciò significa che può archiviare numeri positivi nell'intervallo compreso tra 0 e 2256 -1.

Per tutte le definizioni di variabili, è necessario specificare il tipo e il nome della variabile.

È anche possibile specificare la visibilità di una variabile di stato come segue:

  • public: fa parte dell'interfaccia del contratto ed è possibile accedervi da altri contratti.
  • internal: l'accesso è possibile solo internamente dal contratto corrente.
  • private: visibile solo per il contratto in cui è definita.

Funzioni

All'interno di un contratto, le unità di codice eseguibili sono note come funzioni. Le funzioni descrivono una singola azione per svolgere un'attività. Possono essere riutilizzate, nonché chiamate da altri file di origine, come le librerie. Le funzioni in Solidity si comportano in modo analogo alle funzioni in altri linguaggi di programmazione.

Di seguito è riportato un esempio di base di definizione di una funzione:

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    function buy() public {
        // ...
    }
}

Questo codice mostra una funzione denominata buy con visibilità pubblica, ovvero è possibile accedervi da altri contratti. Le funzioni possono usare uno degli identificatori di visibilità seguenti: public, private, internal e external.

Una funzione può essere chiamata internamente o esternamente da un altro contratto. Le funzioni possono accettare parametri e restituire variabili per passare parametri e valori.

Di seguito è riportato un esempio di una funzione che accetta un parametro, un tipo Integer denominato price, e restituisce un tipo Integer:

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    function buy(uint price) public returns (uint) {
        // ...
    }
}

Modificatori di funzione

I modificatori di funzione consentono di modificare il comportamento delle funzioni. Funzionano controllando una condizione prima dell'esecuzione della funzione. Una funzione può, ad esempio, controllare che solo un utente designato come venditore possa mettere in vendita un articolo.

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    address public seller;

    modifier onlySeller() {
        require(
            msg.sender == seller,
            "Only seller can put an item up for sale."
        );
        _;
    }

    function listItem() public view onlySeller {
        // ...
    }
}

Questo esempio introduce gli elementi seguenti:

  • Una variabile di tipo address che archivia l'indirizzo Ethereum a 20 byte dell'utente venditore. Altre informazioni su queste variabili verranno fornite più avanti in questo modulo.
  • Un modificatore denominato onlySeller che descrive che solo un venditore può mettere in vendita un articolo.
  • Un simbolo speciale _; per indicare la posizione in cui viene inserito il corpo della funzione.
  • Una definizione di funzione che usa il modificatore onlySeller.

Ecco altri modificatori di funzione che è possibile usare nella definizione di funzione:

  • pure per descrivere le funzioni che non consentono modifiche o l'accesso allo stato.
  • view per descrivere le funzioni che non consentono modifiche dello stato.
  • payable per descrivere le funzioni che possono ricevere Ether.

Events

Gli eventi descrivono le azioni eseguite nel contratto. Analogamente alle funzioni, gli eventi hanno parametri che devono essere specificati quando l'evento viene chiamato.

Per chiamare un evento, è necessario usare la parola chiave emit con il nome dell'evento e i relativi parametri.

pragma solidity >0.7.0 <0.8.0;

contract Marketplace {
    event PurchasedItem(address buyer, uint price);

    function buy() public {
        // ...
        emit PurchasedItem(msg.sender, msg.value);
    }
}

Quando si chiama un evento, l'evento viene acquisito come transazione nel log delle transazioni, che è una struttura dei dati speciale nella blockchain. Questi log sono associati all'indirizzo del contratto, sono incorporati nella blockchain e rimangono sempre in questa posizione. Il log e i dati degli eventi non sono accessibili dall'interno dei contratti e non possono essere modificati.