Inizialmente, pensavo che Ethereum fosse una cosa che sarebbe stata usata per scrivere semplici script finanziari. In realtà, la gente sta scrivendo su di essa cose come AUGUR.
Vitalik Buterin
Negli ultimi anni, con l’aumentare di tecnologie basate sulla Blockchain e con la costante nascita di nuove criptovalute, il concetto di Smart Contract ha iniziato a ricorrere sempre più di frequente. Proviamo ad analizzare brevemente cosa sono questi “contratti intelligenti” e perché stanno diventando così importanti ed utilizzati nei più svariati contesti.
Uno Smart Contract è un programma, scritto in un particolare linguaggio di programmazione ( Turing-completo o no ), che viene eseguito come programmato, senza possibilità di censura o manipolazione, dove il codice è legge e con l’obiettivo di facilitare operazioni tra persone ed istituzioni.
Si trovano Smart Contract in molti ambienti.
Per esempio, Bitcoin utilizza Script, un linguaggio di programmazione molto semplice che trae ispirazione da Forth – altro linguaggio di programmazione sviluppato negli anni ‘60 – scritto attraverso una notazione polacca inversa, basato su stack e processato da sinistra verso destra. Uno Smart Contract in Script è semplicemente una lista di istruzioni Opcodes registrate per ogni transazione. Tuttavia, sebbene gli Smart Contract di Bitcoin siano funzionali rispetto agli obiettivi posti, essi non sono utilizzati così ampiamente. Un motivo potrebbe essere legato al fatto che Script non è un linguaggio Turing-completo, senza possibilità di avere dei cicli nel codice, portandolo ad essere abbastanza limitato.
Attualmente, gli Smart Contract più conosciuti sono quelli di Ethereum, i quali saranno l’obiettivo principale di questa breve discussione. Essi possono essere scritti in vari linguaggi di programmazione quali Solidity, Serpent e LLL. Solidity, il più popolare tra essi, è un linguaggio ad alto livello, influenzato da C++, Python e Javascript. È stato progettato per essere in grado di parlare con la Ethereum Virtual Machine, l’ambiente di esecuzione del byte-code di Ethereum che ogni nodo esegue per essere in grado di inviare e ricevere transazioni.
Uno Smart Contract in Solidity è di questa forma
pragma solidity ^0.4.21;
contract Coin {
// “public” rende le variabili
// accessibili dall’esterno
address public minter;
mapping (address => uint) public balances;
// Gli eventi permettono ai client di
// visualizzare i cambianti nella Blockchain
// in maniera efficiente
event Sent(address from, address to, uint amount);
// Costruttore che viene eseguito
// solamente quando il contratto viene creato
function Coin() public {
minter = msg.sender;
}
function mint(address receiver, uint amount) public {
// msg.sender è l’indirizzo di colui che fa la transazione
if (msg.sender != minter) return;
balances += amount;
}
function send(address receiver, uint amount) public {
if (balances < amount) return;
balances -= amount;
balances += amount;
emit Sent(msg.sender, receiver, amount);
}
}
Solidity è un linguaggio di programmazione orientato ai contratti. Questo significa che esistono delle parole chiave dedicate, per esempio, a chi esegue transazioni, agli ether inviati e ricevuti ed a molto altro. Non approfondiremo ulteriormente i dettagli tecnici riguardanti la sintassi. Una guida completa si può trovare qui.
Con uno Smart Contract è possibile programmare vari tipi di scenari, da una semplice memorizzazione di dati, all’esecuzione di certe operazioni dopo la ricezione di denaro, da applicazioni decentralizzate (Dapps) a giochi decentralizzati.
Come tutte le transazioni all’interno di una Blockchain, anche gli Smart Contract sono salvati permanentemente senza alcuna possibilità di poter essere modificati. Questo significa che una volta inviati nella rete e memorizzati, non è più possibile alterarli. Per questo motivo la sicurezza negli Smart Contract è di importanza fondamentale. Basti pensare che essi possono gestire gli ether e quindi anche solo un piccolo errore logico nella loro programmazione può comportare grosse perdite economiche.
Un “famoso” esempio è il dramma di DAO, dove errori implementativi di una parte del codice hanno portato a perdite di milioni di dollari/ether.
Sviluppare gli Smart Contract non è un compito facile. Per aiutare in ciò, esistono alcune best practices che permettono ad un programmatore di sapere come non impostare un contratto, prevenendo così potenziali danni. Ci sono inoltre numerosi strumenti di supporto, come per esempio Truffle nel caso di Ethereum, che permettono di programmare in sicurezza in un ambiente locale in modo da poter testare in tutti i modi possibili gli Smart Contract prima della memorizzazione finale sulla Blockchain.
Gli Smart Contract possono essere uno strumento molto potente in grado sia di creare valore, sicurezza ed efficienza sia di creare caos persino da semplici errori. A tal proposito, è bene prestare particolare attenzione durante la fase di programmazione e di invio sulla rete principale, soprattutto nel caso in cui essi gestiscano dati sensibili o denaro.
TI È PIACIUTO QUESTO ARTICOLO? LEGGI ANCHE:
Trakti: Blockchain al servizio degli Smart Contracts
La Blockchain permissionless e il Bitcoin
Autenticazione: SCRAM-SHA256 feat. DH Key Exchange