Vai al contenuto principale
Change page

Anatomia dei contratti intelligenti

Un contratto intelligente è un programma che viene eseguito a un indirizzo su Ethereum. Sono costituiti da dati e funzioni che possono essere eseguiti alla ricezione di una transazione. Ecco una panoramica di ciò che compone un contratto intelligente.

Prerequisiti

Assicurati di aver prima letto dei contratti intelligenti. Questo documento presuppone che tu abbia già familiarità con linguaggi di programmazione come JavaScript o Python.

Dati

Qualsiasi dato del contratto deve essere assegnato a una posizione: storage o memory. Modificare lo storage in un contratto intelligente è costoso, quindi devi considerare dove dovrebbero risiedere i tuoi dati.

Storage

I dati persistenti sono definiti storage e sono rappresentati da variabili di stato. Questi valori vengono archiviati in modo permanente sulla blockchain. Devi dichiararne il tipo in modo che il contratto possa tenere traccia di quanto spazio di archiviazione sulla blockchain necessita durante la compilazione.

// Esempio in Solidity
contract SimpleStorage {
    uint storedData; // Variabile di stato
    // ...
}
# Vyper example
storedData: int128

Se hai già programmato in linguaggi orientati agli oggetti, probabilmente avrai familiarità con la maggior parte dei tipi. Tuttavia, address dovrebbe esserti nuovo se sei agli inizi con lo sviluppo su Ethereum.

Un tipo address può contenere un indirizzo Ethereum, che equivale a 20 byte o 160 bit. Viene restituito in notazione esadecimale con un 0x iniziale.

Altri tipi includono:

  • booleani
  • interi
  • numeri a virgola fissa
  • array di byte a dimensione fissa
  • array di byte a dimensione dinamica
  • letterali razionali e interi
  • letterali di stringa
  • letterali esadecimali
  • enumerazioni (enum)

Per ulteriori spiegazioni, dai un'occhiata alla documentazione:

Memory

I valori che vengono archiviati solo per la durata dell'esecuzione di una funzione del contratto sono chiamati variabili di memoria (memory). Poiché non vengono archiviati in modo permanente sulla blockchain, sono molto più economici da usare.

Scopri di più su come l'EVM archivia i dati (Storage, Memory e Stack) nella documentazione di Solidity (opens in a new tab).

Variabili d'ambiente

Oltre alle variabili che definisci nel tuo contratto, ci sono alcune variabili globali speciali. Sono utilizzate principalmente per fornire informazioni sulla blockchain o sulla transazione corrente.

Esempi:

ProprietàVariabile di statoDescrizione
block.timestampuint256Timestamp dell'epoca del blocco corrente
msg.senderaddressMittente del messaggio (chiamata corrente)

Funzioni

Nei termini più semplici, le funzioni possono ottenere informazioni o impostare informazioni in risposta alle transazioni in entrata.

Esistono due tipi di chiamate di funzione:

  • internal – queste non creano una chiamata EVM
    • Le funzioni interne e le variabili di stato possono essere accessibili solo internamente (cioè, dall'interno del contratto corrente o dai contratti che ne derivano)
  • external – queste creano una chiamata EVM
    • Le funzioni esterne fanno parte dell'interfaccia del contratto, il che significa che possono essere chiamate da altri contratti e tramite transazioni. Una funzione esterna f non può essere chiamata internamente (cioè, f() non funziona, ma this.f() funziona).

Possono anche essere public o private

  • le funzioni public possono essere chiamate internamente dall'interno del contratto o esternamente tramite messaggi
  • le funzioni private sono visibili solo per il contratto in cui sono definite e non nei contratti derivati

Sia le funzioni che le variabili di stato possono essere rese pubbliche o private

Ecco una funzione per aggiornare una variabile di stato in un contratto:

// Esempio in Solidity
function update_name(string value) public {
    dapp_name = value;
}
  • Il parametro value di tipo string viene passato alla funzione: update_name
  • È dichiarata public, il che significa che chiunque può accedervi
  • Non è dichiarata view, quindi può modificare lo stato del contratto

Funzioni View

Queste funzioni promettono di non modificare lo stato dei dati del contratto. Esempi comuni sono le funzioni "getter": potresti usarle per ricevere il saldo di un utente, ad esempio.

// Esempio in Solidity
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dapp_name: public(String[24])

@external
@view
def readName() -> String[24]:
    return self.dapp_name

Cosa è considerato una modifica dello stato:

  1. Scrivere su variabili di stato.
  2. Emettere eventi (opens in a new tab).
  3. Creare altri contratti (opens in a new tab).
  4. Usare selfdestruct.
  5. Inviare ether tramite chiamate.
  6. Chiamare qualsiasi funzione non contrassegnata come view o pure.
  7. Usare chiamate di basso livello.
  8. Usare assembly inline che contiene determinati opcode.

Funzioni Constructor

Le funzioni constructor vengono eseguite solo una volta quando il contratto viene distribuito per la prima volta. Come il constructor in molti linguaggi di programmazione basati su classi, queste funzioni spesso inizializzano le variabili di stato ai loro valori specificati.

# Vyper example
@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Funzioni integrate

Oltre alle variabili e alle funzioni che definisci nel tuo contratto, ci sono alcune funzioni integrate speciali. L'esempio più ovvio è:

  • address.send() – Solidity
  • send(address) – Vyper

Queste consentono ai contratti di inviare ETH ad altri account.

Scrivere funzioni

La tua funzione necessita di:

  • variabile e tipo del parametro (se accetta parametri)
  • dichiarazione di internal/external
  • dichiarazione di pure/view/payable
  • tipo di ritorno (se restituisce un valore)
@external
def update_name(value: String[24]):
    self.dapp_name = value

Un contratto completo potrebbe assomigliare a questo. Qui la funzione constructor fornisce un valore iniziale per la variabile dapp_name.

Eventi e log

Gli eventi consentono al tuo contratto intelligente di comunicare con il tuo frontend o altre applicazioni iscritte. Una volta che una transazione è convalidata e aggiunta a un blocco, i contratti intelligenti possono emettere eventi e registrare informazioni, che il frontend può quindi elaborare e utilizzare.

Esempi annotati

Questi sono alcuni esempi scritti in Solidity. Se desideri giocare con il codice, puoi interagirvi in Remix (opens in a new tab).

Hello world

Token

Risorsa digitale unica

Letture di approfondimento

Dai un'occhiata alla documentazione di Solidity e Vyper per una panoramica più completa sui contratti intelligenti:

Ultimo aggiornamento della pagina: 15 aprile 2026

Questo articolo è stato utile?