- 23/07/2019
In un post precedente ho definito uno smart contract come “un contratto scritto in un linguaggio di programmazione in modo da determinare, automaticamente, l’esecuzione delle clausole contrattuali all'avverarsi delle determinate condizioni inserite nel contratto stesso”.
Per ottenere l’esecuzione automatica delle clausole contrattuali è necessario che lo smart contract agisca in maniera deterministica –cioè che, a parità di condizioni, i risultati siano sempre gli stessi -e che sia privo delle sfumature linguistiche del linguaggio umano presenti nei contratti stipulati tra soggetti giuridici.
Di conseguenza, la scelta del linguaggio di programmazione per codificare gli smart contract è estremamente importante.
Il linguaggio di programmazione non deve essere obbligatoriamente deterministico, ma è necessario che gli sviluppatori evitino di inserire funzioni che potrebbero creare problemi di affidabilità agli smart contract.
Per eliminare la possibilità che gli smart contract possano comportarsi in maniera errata, alcuni progetti blockchain, quali ad esempio Ethereum e Libra, hanno scelto di permettere agli sviluppatori l’utilizzo di soli linguaggi deterministici. Diamo ora un’occhiata ai linguaggi utilizzati dalle diverse blockchain.
Linguaggi di programmazione versatili, non specializzati nella redazione di smart contract
Dalla tabella è possibile verificare come diverse blockchain permettano lo sviluppo di smart contract mediante l’utilizzo di linguaggi di programmazione versatili, il cui scopo non è perciò solamente la scrittura di smart contract.
La possibilità di programmare in linguaggi molto noti e diffusi quali C++, Java e Javascript, oppure in linguaggi più moderni e sempre più utilizzati quali Go, Python, Rust e Kotlin, consente ad un numero estremamente ampio di programmatori di poter scrivere smart contract senza dover acquisire nuove competenze.
Questa semplicità d’uso potrebbe così stimolare l’adozione di una blockchain a favore di altre in cui la curva di apprendimento sia più difficoltosa. D’altro canto, l’utilizzo di linguaggi non specializzati in assenza di una adeguata preparazione potrebbe causare comportamenti non deterministici nell'utilizzo di smart contract e, di conseguenza, seri problemi nella qualità e validità dei dati transati su blockchain.
Per far fronte a questa possibilità alcune blockchain che permettono l’utilizzo di linguaggi versatili, quale ad esempio Hyperledger Fabric, “traducono” lo smart contract nel linguaggio specifico della piattaforma, riducendo o eliminando le possibili problematiche.
Linguaggi di programmazione specializzati nella redazione di smart contract
Tra i linguaggi più noti sviluppati appositamente per la scrittura di smart contract si annoverano Solidity, per la blockchain Ethereum, e il “nuovo entrato” Move per la blockchain Libra.
Solidity – Ethereum
Solidity, il cui sviluppo è stato influenzato dai linguaggi C++, Python e JavaScript, è stato realizzato appositamente per interagire con la blockchain Ethereum. È un linguaggio ad alto livello, cioè “caratterizzato da una significativa astrazione dai dettagli del funzionamento di un calcolatore e dalle caratteristiche del linguaggio macchina” (Wikipedia).
Oltre che per la codifica di smart contract, Solidity può essere utilizzato per sviluppare delle Decentralized Apps, chiamate comunemente dApps, cioè applicazioni decentralizzate appositamente create per interagire con la blokchain Ethereum.
Solidity può inoltre essere utilizzato per la creazione di token ERC20 e per lanciare delle ICO, con i dovuti parametri di attuazione, su blockchain Ethereum.
Move - Libra
Move è il linguaggio proposto dalla blockchain Libra per la scrittura di smart contract – chiamati “Move modules” - e per la gestione delle transazioni. Ad oggi, le applicazioni possibili del linguaggio Move sono:
- L'emissione di criptovalute, token e altre risorse digitali
- La gestione delle transazioni su blockchain
- La gestione dei validatori, i nodi che hanno l'incarico di verificare la validità delle transazioni sulla blockchain
- La gestione delle policy della blockchain
Move, diversamente da Solidity, è un linguaggio “bytecode”, un linguaggio intermedio tra linguaggio macchina e linguaggio di programmazione, perciò più veloce ed efficiente di un linguaggio ad alto livello.
Esempi di smart contract
SOLIDITY
Un semplice esempio di utilizzo di Solidity per la scrittura e la lettura di dati sulla blockchain Ethereum può essere visionato sul sito della documentazione del linguaggio, al seguente link.
pragma solidity >=0.4.0 <0.7.0;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
La prima riga di codice indica in quale versione del linguaggio il codice debba essere compilato, così da impedirne l’utilizzo con eventuali release non verificate.
Successivamente viene enunciato il nome dello smart contract, “Simple Storage” in questo caso, seguito dalla dichiarazione delle variabili (storedData, di tipologia uint, cioè un numero intero non negativo) e dalle funzioni che devono essere eseguite.
Le due funzioni codificate sono “set”, per scrivere un valore uint sulla blockchain, e “get” per leggere il valore scritto.
MOVE
Anche l’esempio in linguaggio MOVE, di cui mostrerò solo una parte, proviene dalla documentazione ufficiale, che può essere visualizzata al seguente link.
module EarmarkedLibraCoin {
import 0x0.LibraCoin;
resource T {
coin: R#LibraCoin.T,
recipient: address
}
public create(coin: R#LibraCoin.T, recipient: address) {
let t: R#Self.T;
t = T {
coin: move(coin),
recipient: move(recipient),
};
move_to_sender<T>(move(t));
return;
}
…….
Il fine di questo modulo è creare una riserva di fondi da trasferire da un account pagante ad un account beneficiario.
Nello smart contract, questa riserva di fondi viene chiamata “EarmarkedLibraCoin”. Pur rimanendo dei coin Libra a tutti gli effetti, questi EarmarkedLibraCoin vengono stanziati nella riserva di fondi con un nome differente così da differenziarli dagli altri coin Libra di proprietà dell’account pagante.
Come in Solidity, la prima riga di codice serve ad enunciare il nome dello smart contract/modulo, “EarmarkedLibraCoin” in questo caso.
Dopo l’enunciazione del nome, viene importato il modulo LibraCoin - la valuta in oggetto - e creata una nuova risorsa di nome “T” che funge da contenitore del valore da trasferire e dell’indirizzo del benificario.
Successivamente questa risorsa “T” viene pubblicata (“public create”) a nome dell’account pagante, “impacchettata” con nome “t” e inviata al beneficiario.
La nuova risorsa diviene perciò visibile come inviata dal primo account che successivamente – nel codice presente sul sito con la documentazione – potrà reclamare e trasferirla nel proprio wallet.
Ad oggi è impossibile predire se il predominio tra blockchain per smart contract sarà di chi preferisce permetterne la scrittura in linguaggi versatili, limitando le possibili problematiche, oppure delle blockchain scritte in linguaggi dedicati.
L’apparizione di Libra e Move ha portato molto fermento nel mondo delle blockchain e delle criptovalute. Il linguaggio Move è stato costruito guardando all'esempio di Solidity cercando di risolverne le criticità, nello stesso modo in cui la stessa blockchain Libra appare come una sorta di evoluzione delle attuali blockchain con smart contract, a prescindere dalle molteplici opinioni sull'essere o meno Libra una blockchain.
Mentre ad oggi sono già visibili esempi di smart contract e dApps sviluppate su Ethereum, Neo, EOS e Hyperledger, sarà necessario attendere il debutto di Libra per capirne le reali potenzialità e capacità di attrazione.