Uno “smart contract” non è altro che un programma che gira sulla blockchain di Ethereum. Nel dettaglio è una raccolta di codici (le sue funzioni) e di dati (il suo stato) che risiede a un indirizzo specifico sulla blockchain.
Gli smart contract sono un tipo di account Ethereum, i quali hanno un saldo e possono essere oggetto di transazioni. Tuttavia, non sono controllati da un utente, ma vengono distribuiti sulla rete ed eseguiti come da programma. Gli utenti possono, quindi, interagire con uno smart contract inviando transazioni che eseguono una funzione definita del medesimo. Tali contratti possono definire regole, come un normale contratto, e applicarle automaticamente tramite codice. Infine, non possono essere cancellati per default e le interazioni con essi sono irreversibili.
Indice dei contenuti
Smart contract: un distributore automatico digitale
Un esempio proposto da Nick Szabo per comprendere gli smart contract è il distributore automatico. Ricordiamo che, con i giusti input, viene garantito sempre un determinato output.
Per ottenere uno snack da un distributore automatico, questa è la logica:
money + snack selection = snack dispensed.
Uno smart contract, come un distributore automatico, ha una logica programmata al suo interno. Ecco un semplice esempio di come sarebbe se fosse programmato in Solidity:
pragma solidity 0.8.7;
contract VendingMachine {
// Declare state variables of the contract
address public owner;
mapping (address => uint) public cupcakeBalances;
// When 'VendingMachine' contract is deployed:
// 1. set the deploying address as the owner of the contract
// 2. set the deployed smart contract's cupcake balance to 100
constructor() {
owner = msg.sender;
cupcakeBalances[address(this)] = 100;
}
// Allow the owner to increase the smart contract's cupcake balance
function refill(uint amount) public {
require(msg.sender == owner, "Only the owner can refill.");
cupcakeBalances[address(this)] += amount;
}
// Allow anyone to purchase cupcakes
function purchase(uint amount) public payable {
require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake");
require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");
cupcakeBalances[address(this)] -= amount;
cupcakeBalances[msg.sender] += amount;
}
}
Da tale esempio possiamo comprendere che un distributore automatico elimina la necessità di aver un dipendente, mentre gli smart contract possono sostituire gli intermediari in molti settori.
Costruire uno smart contract: cosa serve
Chiunque può scrivere uno smart contract e distribuirlo sulla rete, basta imparare un linguaggio per programmare contratti smart e avere abbastanza ETH per distribuirlo. La sua distribuzione è, tecnicamente, una transazione per cui è necessario pagare gas, cioè una commissione relativa alla potenza computazionale richiesta per eseguire operazioni specifiche sulla rete Ethereum.
Ethereum dispone di due linguaggi principali per programmare smart contract, puoi usare:
- Solidity;
- Vyper.
Per avere, invece, ETH a disposizione per distribuire un contratto, puoi consultare la nostra guida su come acquistare criptovalute.
Tuttavia, prima di poter essere distribuiti, devono essere compilati in modo che la macchina virtuale di Ethereum possa interpretarli e memorizzare il contratto.
Smart contract: API aperte
Gli smart contract sono pubblici su Ethereum e possono essere considerati come Application Programming Interface (API) aperte. Ciò significa che ogni contratto è una sorta di Lego: si possono usare smart contract di altri progetti come blocchi di costruzione per il proprio progetto.
Ad esempio, potete utilizzare gli smart contract esistenti di Uniswap, un exchange decentralizzato, per gestire tutta la logica di scambio dei token nella vostra applicazione, senza dover partire da zero.
La componibilità degli smart contract si basa generalmente su tre principi: modularità, autonomia e scopribilità. Scopriamo nel dettaglio i vari principi.
- Modularità: la capacità dei singoli componenti di svolgere un compito specifico. In Ethereum, ogni smart contract ha un caso d’uso specifico (come mostrato nell’esempio di Uniswap).
- Autonomia: i componenti componibili devono essere in grado di operare in modo indipendente. In Ethereum ogni smart contract è autoesecutivo e può funzionare senza dipendere da altre parti del sistema.
- Scopribilità: gli sviluppatori non possono usufruire di contratti esterni o integrare librerie software nelle applicazioni se i primi non sono pubblicamente disponibili. Gli smart contract sono open-source: chiunque può richiamare un contratto o eseguire il fork di una base di codice.
Limiti dello smart contract
Gli smart contract da soli non sono in grado di ottenere informazioni sugli eventi del “mondo reale” perché non possono inviare richieste HTTP. Tale limite è dovuto alla progettazione in quanto affidarsi a informazioni esterne potrebbe compromettere il consenso, importante per la sicurezza e la decentralizzazione.
Tuttavia, ci sono modi per aggirare questo problema utilizzando gli oracoli, che sono feed di dati che portano i dati da fonti di dati esterne alla blockchain (off-chain) e li mettono sulla blockchain (on-chain) per essere utilizzati dagli smart contract.
Un’altra limitazione degli smart contract è la dimensione massima che si aggira ai 24 KB, pena l’esaurimento del gas. Ciononostante anche tale limite può essere aggirato utilizzando il Diamond Pattern.
Contratti multisig
I contratti multisig (a firma multipla) sono smart contract che richiedono più firme valide per eseguire una transazione. Questo è molto utile per evitare singoli punti di fallimento per i contratti che contengono quantità sostanziali di ether o altri token.
Inoltre, tali contratti dividono la responsabilità dell’esecuzione del contratto e della gestione delle chiavi tra più parti e impediscono che la perdita di una singola chiave privata comporti una perdita irreversibile di fondi. Per questi motivi, possono essere utilizzati per una semplice governance DAO.
I multisig richiedono N firme su M possibili firme accettabili (dove N ≤ M, e M > 1) per essere eseguiti. Sono comunemente utilizzati i casi N = 3, M = 5 e N = 4, M = 7. Una multisigma 4/7 richiede quattro firme valide su sette possibili. Ciò significa che i fondi sono ancora recuperabili anche se tre firme vengono perse. In questo caso, significa anche che la maggioranza dei detentori delle chiavi deve essere d’accordo e firmare affinché il contratto venga eseguito.