Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
UNIVERSITÀ DEGLI STUDI DI CAGLIARI FACOLTÀ DI INGEGNERIA E ARCHITETTURA CORSO DI LAUREA IN INGEGNERIA ELETTRICA ED ELETTRONICA Tesi di laurea Criptovalute e Smart Contract Giorgio Loi Relatore Prof. Michele Marchesi ANNO ACCADEMICO 2015-2016
Indice Analitico Introduzione ………………………………………………………………………………………………………... 5 Capitolo 1. Criptovalute 1.1. Definizione ….……………………………………………………………………………………………...…. 7 1.2. Caratteristiche ………………………………………………………………………………………………. 8 1.3. Crittografia ……………………………………………………………………………………………………. 9 1.3.1. Funzione Hash ………………………………………………………………………………….. 9 1.3.2. Crittografia a chiave pubblica ………………………………………………………….. 10 1.3.3. Firme digitali ……………………………………………………………………………………. 12 Capitolo 2. Bitcoin 2.1. Cos’è Bitcoin? ………………………………………………………………………………………………… 14 2.2. Storia del Bitcoin ……………………………………………………………………………………………. 15 2.3. Come funziona ………………………………………………………………………………………………. 16 2.3.1. Architettura …………………………………………………………………………………….. 16 2.3.2. Indirizzi ……………………………………………………………………………………………. 17 2.3.3. Transazioni ………………………………………………………………………………………. 18 2
2.3.4. Verifica ……………………………………………………………………………………………. 20 2.3.5. Blockchain ……………………………………………………………………………………….. 21 2.4. Mining …………………………………………………………………………………………………………… 23 Capitolo 3. Smart Contract 3.1. Cosa sono gli smart contract ………………………………………………………………………….. 27 3.2. Come si costruiscono gli Smart Contract ………………………………………………………… 28 3.3. Invocazione del contratto ……………………………………………………………………………… 29 3.4. Un assaggio del design degli Smart Contract …………………………………………………. 30 Capitolo 4. Ethereum 4.1 . Cos’è Ethereum ………………………………………………………………………………………………. 32 4.2 . Come funziona Ethereum ………………………………………………………………………………… 32 4.2.1. Ethereum Accounts …………………………………………………………………………….. 33 4.2.2. Transazioni ………………………………………………………………………………………….. 34 4.2.3. Messaggi …………………………………………………………………………………………….. 36 4.2.4. La funzione di transizione di stato …………………………..………………………….. 37 4.2.5. Esecuzione del codice …………………………………………………………………………. 40 4.2.6. Blockchain e Mining …………………………………………………………….……………… 41 3
Capitolo 5. RootStock 5.1. Perché RootStock è importante per il sistema Bitcoin …………………………….…….. 43 5.2. RootStock come rete di pagamenti BTC low-cost …………….…………………………….. 44 5.3. Specifiche tecniche ………………………………………………………………………………………… 45 5.3.1. Macchina Virtuale Turing- completa …………………………………….……………… 46 5.3.2. Sidechain …………………………………………………………………………………………….. 46 5.3.3. Merged-mining ………………………………………………….……………………………….. 47 5.3.4. Federazione ………………………………………………………………..………………………. 47 5.4. Casi d’uso ………………………………………………………………………………………………………. 48 Conclusioni …………………………………………………………………………………………………………. 49 Bibliografia ……………………………………………………………………………………….………………… 52 Fonti iconografiche ……………………………………………………………………………..….…………. 53 Ringraziamenti …………………………………………………………………………………………………… 54 4
Introduzione Questa tesi si propone di analizzare il tema delle criptovalute, in particolare del Bitcoin, analizzandone le caratteristiche principali, le applicazioni e le possibili evoluzioni future. Verrà portata avanti, inoltre, la descrizione degli smart contract e di come le organizzazioni decentrate hanno la potenzialità di cambiare il rapporto tra imprese e governo. Le aziende saranno in grado di utilizzare le tecnologie blockchain per sostituire molte funzioni della pubblica amministrazione, avendo un impatto enorme sui metodi di tassazione e migliorando l’efficienza dell'economia. Bitcoin è una rete di consenso che consente un sistema di pagamento ed è una forma di denaro completamente digitale. Si tratta della prima rete decentralizzata di pagamento peer-to-peer, gestita dai suoi utenti senza alcuna autorità centrale o intermediari. Bitcoin permette di inviare denaro digitale in maniera rapida, sicura ed economica attraverso Internet. Nei capitoli seguenti verranno analizzate le principali caratteristiche del Bitcoin e della tecnologia su cui esso si basa: la blockchain; inoltre, verranno descritte due piattaforme (Ethereum e Rootstock) che si basano sulla tecnologia blockchain per portare avanti lo sviluppo degli “smart contract”. Si è scelto di trattare questo argomento per il suo carattere innovativo e per gli innumerevoli vantaggi che è in grado di offrire. A rendere innovativa e ricca di vantaggi questa nuova tecnologia, vi sono diversi aspetti, tra cui: la libertà di pagamento (è possibile inviare e ricevere qualsiasi quantità di denaro istantaneamente, dovunque nel mondo e in qualsiasi momento), la riduzione dei costi (i pagamenti Bitcoin sono senza costi o richiedono addebiti estremamente bassi), la riduzione dei rischi (le transazioni Bitcoin sono sicure, irreversibili e non contengono dati sensibili o informazioni personali del cliente), la sicurezza e il controllo (gli utenti di Bitcoin controllano totalmente le proprie transazioni e i pagamenti possono effettuarsi senza alcuna informazione personale connessa alla transazione, in modo da prevenire il furto d'identità), la 5
trasparenza (tutte le informazioni riguardanti il Bitcoin sono prontamente disponibili sulla blockchain a chiunque). La blockchain contiene tutte le transazioni che sono state elaborate, permettendo agli utenti di verificare la validità di ogni transazione. L'autenticità di ogni transazione è protetta da firme digitali. Un ulteriore vantaggio è che chiunque può processare transazioni ed ottenere un premio in bitcoin per questo servizio. Questo processo viene spesso chiamato "mining". Molta della fiducia in Bitcoin deriva dal fatto che non richiede alcuna fiducia. Bitcoin, infatti, è completamente open-source e decentralizzato e ogni transazione e bitcoin creato possono essere consultati in qualsiasi momento con trasparenza assoluta. Ogni pagamento può essere effettuato senza dipendere da terzi e l'intero sistema é protetto da algoritmi criptografici. Nessuna organizzazione o individuo può controllare Bitcoin e il sistema rimane sicuro, garantendo anche una significativa forma di protezione contro molte forme di crimini finanziari. I bitcoin sono impossibili da falsificare e gli utenti hanno pieno controllo dei loro pagamenti e non possono ricevere addebiti non approvati, come quelli delle frodi delle carte di credito. Tutte queste caratteristiche fanno del Bitcoin e degli Smart Contract un mezzo rivoluzionario per migliorare le attività finanziarie. 6
Capitolo 1. Criptovalute 1.1. DEFINIZIONE Una criptovaluta (o crittovaluta o criptomoneta) è una valuta paritaria, decentralizzata e digitale, la cui implementazione si basa sui principi della crittografia per convalidare le transazioni e la generazione di moneta in sé. Come ogni valuta digitale, consente di effettuare pagamenti online in maniera sicura. Le implementazioni di criptovalute spesso usano uno schema proof-of-work come salvaguardia alla contraffazione digitale. Esse utilizzano tecnologie di tipo peer-to-peer (p2p) su reti i cui nodi sono computer di utenti disseminati in tutto il globo. Su questi computer vengono eseguiti appositi programmi che svolgono funzioni di portamonete. Non c'è attualmente alcuna autorità centrale che le controlli, infatti, le transazioni e il rilascio delle criptomonete avvengono collettivamente in rete, pertanto non c'è una gestione di tipo "centralizzato". Queste proprietà uniche nel loro genere non possono essere esplicate dai sistemi di pagamento tradizionale. Sono state definite oltre trenta specifiche e protocolli diversi di criptovalute per lo più simili o derivanti dalla prima criptovaluta mai implementata: il Bitcoin. Ad oggi, tutte le criptovalute sono valute alternative rispetto alle valute con valore legale. La maggior parte delle criptovalute sono progettate per introdurre gradualmente nuove unità di valuta, ponendo un tetto massimo alla quantità di moneta in circolazione. Ciò viene fatto sia per imitare la scarsità (e il valore) dei metalli preziosi, sia per evitare l'iperinflazione. Confrontata con le valute ordinarie gestite dagli istituti finanziari o tenute come contante, le criptovalute sono meno suscettibili a confische da parte delle forze dell'ordine. [1] 7
1.2. CARATTERISTICHE Un sistema di pagamenti digitali sicuro dovrebbe avere le seguenti caratteristiche per prevenire le frodi: 1. Autenticità – Solo il proprietario di una certa quantità di denaro può spenderlo. 2. Sicurezza – Il denaro non può essere contraffatto e il proprietario può spendere quella somma solo una volta (il problema della “doppia spesa”). 3. Non ripudiabilità – Chi invia il messaggio non può in seguito negare di averlo inviato. Ci sono altre tre caratteristiche opzionali che rendono il sistema più potente: 1. Anonimato – L’identificazione del pagante non viene rivelata al beneficiario o a terze parti. 2. Nessun intermediario – Il pagante può avere la sicurezza di ricevere fondi da una transazione senza contattare una terza parte come una banca. 3. Decentralizzata – Non è necessaria alcuna fiducia in terze parti per il processo di transazione. Un sistema di pagamenti elettronici deve affrontare il cosiddetto “problema della doppia spesa” e cercare una soluzione per ovviarlo; la doppia spesa è un tipo di frode che riguarda i pagamenti digitali e si verifica quando un utente cerca di spendere la stessa cifra due volte. Per esempio, immaginiamo che una persona di nome Chuck abbia una carta di credito con 100 € nel suo conto. Chuck apre due schede nel suo browser, una per Amazon e una per Ebay, per ogni sito aggiunge al carrello un oggetto dal valore di 100 €, mette i dati per la propria carta di credito e preme il tasto “Compra” in entrambe le schede nello stesso momento. Se la sua banca ha un sistema di sicurezza 8
carente, entrambi i siti vedono che lui ha 100 € nel suo conto e approvano l’acquisto, cedendo beni dal valore di 200 €; questa è la doppia spesa. Per i sistemi online centralizzati come le carte di credito, individuare le doppie spese è facile se tutte le transazioni sono viste immediatamente. Per i sistemi offline o decentralizzati, individuare le doppie spese risulta più difficile. L’unico modo di individuare la doppia spesa è quello di stare attenti a tutte le transazioni e cercare i duplicati. Dopo aver individuato una doppia spesa si hanno due opzioni. Un’opzione è quella di rivelare l’identità di chi sta effettuando la doppia spesa, in modo tale che la vittima possa denunciarlo. Ovviamente questa opzione non è quella ideale perché implica un’azione legale e richiede inoltre l’intervento di altre autorità. La seconda, e migliore opzione, è quella di considerare valida la prima transazione della doppia spesa. Rifiutare entrambe le spese non andrebbe bene e in questo caso è necessario che il sistema sia capace di determinare quale delle due spese sia la prima. [2] 1.3. CRITTOGRAFIA Per capire molti meccanismi alla base del Bitcoin è necessario introdurre alcuni concetti di crittografia. Un sistema di pagamenti digitale come Bitcoin richiede una forte sicurezza contro le frodi, per questo occorre spiegare le basi delle tecnologie crittografiche che Bitcoin utilizza per garantire al sistema la sicurezza contro gli hacker. 1.3.1. FUNZIONE HASH Quando vengono trasmessi i dati attraverso una rete, è molto importante assicurarsi che i dati non si corrompano durante la trasmissione. Una funzione hash crittografica può risolvere questo problema. Tale funzione accetta come input un valore di lunghezza 9
variabile e restituisce un valore di lunghezza fissa, di solito minore, chiamato valore di hash. Il valore di hash non dipende in maniera diretta dall’input, ma deve apparire come se fosse un valore casuale. Bisogna tenere conto che: 1. La funzione di hash consente di calcolare facilmente l’hash di qualsiasi valore di input. 2. Cambiare qualsiasi bit del valore di input produce un output molto diverso. 3. Non è fattibile trovare un valore di input che corrisponda a un dato output, né due valori qualsiasi di input che diano lo stesso output, a meno di provare tutti i casi possibili di input. La funzione hash usata in Bitcoin è chiamata SHA-256. L’output del SHA-256 sono 256 bit o 32 byte. Ad esempio: sha256(‘Bitcoin’) = 0xb4056df6691f8dc72e56302ddad345d 65fead3ead9299609a826e2344eb63aa4 sha256(‘bitcoin’) = 0x6b88c087247aa2f07ee1c5956b8e1a9 f4c7f892a70e324f1bb3d161e05ca107b Anche se l’unica differenza del valore di input è la prima lettera minuscola, gli output sono completamente differenti. [2] 1.3.2. CRITTOGRAFIA A CHIAVE PUBBLICA La crittografia simmetrica, anche detta a chiave privata, è stata la prima forma di crittografia sviluppata dall’uomo. Per occultare un messaggio, in modo che sia leggibile solo dal destinatario, il mittente deve prima cifrarlo. Questo metodo è utile in situazioni 10
dove le due parti possono comunicare di persona, ma non è l’ideale per la comunicazione attraverso Internet. Figura 1.1 – Crittografia simmetrica La crittografia a chiave pubblica consente la comunicazione codificata senza cambiare la chiave privata. Ad esempio, Alice e Bob vogliono comunicare in modo sicuro, possono farlo sulla base del seguente protocollo; per prima cosa, entrambi eseguono uno speciale algoritmo per produrre una coppia di chiavi: la chiave pubblica e quella privata. Entrambi tengono segrete le loro chiavi private, ma pubblicano la loro chiave pubblica, che diventa visibile a tutto il mondo. La chiave pubblica e la chiave privata hanno una relazione matematica che permette ad Alice di criptare un messaggio M usando la chiave pubblica di di Bob Kpub che solo la chiave privata di Bob Kpriv può decriptare. Ponendo C come messaggio criptato, avremo: C = encrypt(M, Kpub ) M = decrypt(C, Kpriv ) 11
Tutto questo è compiuto usando delle formule matematiche che non possono essere invertite. Usando la crittografia a chiave pubblica, due individui possono inviarsi messaggi in sicurezza attraverso un canali insicuri come internet. [2] 1.3.3. FIRME DIGITALI Le coppie di chiavi nella crittografia a chiave pubblica sono complementari e possono essere scambiate. Per la normale azione di codifica/decodifica, la chiave pubblica è usata per codificare e la chiave privata è usata per decodificare. Se invece usiamo la chiave privata per codificare, solo la sua corrispondente chiave pubblica può essere usata per decodificare il risultato. Questo metodo può essere adoperato per creare una firma digitale che prova che un particolare individuo ha inviato un messaggio. Il destinatario di un messaggio firmato può avere conferma del fatto che il messaggio non sia stato spedito da un impostore (autenticità) e che non sia stato manomesso (integrità) e può smentire qualsiasi mittente che neghi di aver inviato il messaggio (non ripudiabilità). Questo è esattamente quello di cui Bitcoin ha bisogno per prevenire transazioni fraudolente. Per inviare un messaggio firmato che contenga un messaggio M: 1. Prendere l’hash di M: H = sha256(M) 2. Codificare H con la chiave privata, per “ottenere” la firma: S = encrypt(H, Kpriv) 3. Inviare la firma S con il messaggio M Per verificare che la firma S è valida per il messaggio M: 12
1. Prendere l’hash di M: H = sha256(M) 2. Decriptare S con la con la chiave pubblica: H’ = decrypt(S, Kpub ) 3. Confrontare se H = H’. La firma è valida se sono uguali. Bitcoin usa lo schema di firma digitale chiamata Elliptic Curve Digital Signature Algorithm (ECDSA). La matematica presente in questo algoritmo è molto più complessa rispetto a quella dell’algoritmo di firma a chiave pubblica RSA. [2] Figura 1.2 Firma digitale 13
Capitolo 2. Bitcoin 2.1. COS’É BITCOIN? Bitcoin è un insieme di concetti e tecnologie che formano le basi di un ecosistema di moneta digitale. [3] Questo ecosistema include una valuta, le cui unità sono chiamate bitcoin, che è usata per memorizzare e trasmettere valore tra i partecipanti alla rete Bitcoin. Gli utenti dei Bitcoin possono comunicare gli uni con gli altri attraverso il protocollo bitcoin, principalmente via Internet, sebbene ci siano anche altre reti da poter utilizzare. Oltre che alla moneta ed al software, Bitcoin si riferisce anche alla rete P2P (peer-to- peer o pari a pari) che si forma in conseguenza del funzionamento del software Bitcoin (BTC). BTC utilizza una base dati distribuita su una rete P2P per eseguire le transazioni commerciali, insieme a firme digitali e "proof-of-work" (POW o prova di lavoro) che garantiscono la sicurezza. Ciò assicura che i BTC possano essere spesi solo dalla persona che li possiede. La topologia P2P e la mancanza di sistema amministrativo centralizzato, rendono difficile per qualsiasi autorità manipolare la quantità di bitcoin in circolazione e, di conseguenza, impediscono l'inflazione. [4] Gli utenti possono trasferire i bitcoin attraverso la rete per poter fare tutto quello che si fa con le valute convenzionali: comprare e vendere beni o inviare denaro a persone o organizzazioni. I bitcoin possono essere acquistati o venduti e cambiati per un'altra valuta ad un certo tasso. In un certo senso Bitcoin è una forma di moneta perfetta per Internet: veloce, sicura e senza confini. [3] Bitcoin usa la tecnologia peer-to-peer per non operare con alcuna autorità centrale o con le banche; la gestione delle transazioni e l'emissione di Bitcoin viene effettuata collettivamente dalla rete. Bitcoin è open-source e la sua progettazione è pubblica, infatti nessuno possiede o controlla Bitcoin e ognuno può prendere parte al progetto. [5] 14
Con Bitcoin: Il costo delle transazioni può essere ridotto a pochi centesimi (in contrasto con i costi dei tassi delle tipiche carte di credito). I pagamenti elettronici possono essere confermati in meno di un ora senza costi di trasferimenti o di commissione. C’è un limitato rischio di inflazione monetaria perché la frequenza di produzione dei bitcoin è limitata da un algoritmo e non si possono produrre più di 21 milioni di bitcoin. I pagamenti sono irreversibili, così da ridurre il rischio di frode. I pagamenti possono essere effettuati senza identificazione. La responsabilità è tutta dei consumatori, che possono perdere completamente i propri bitcoin se perdono le loro chiavi di criptazione. [2] 2.2. STORIA DEL BITCOIN Bitcoin è stato inventato nel 2008 da “Satoshi Nakamoto” con la pubblicazione di un articolo intitolato “Bitcoin: A Peer-to-Peer Electronic Cash System”. Satoshi Nakamoto ha combinato diverse invenzioni, come b-money e HashCash, per creare un sistema completo di pagamenti digitali completamente decentralizzato. Il 9 Gennaio 2009, è la data del rilascio della prima versione: Bitcoin 0.1. Le versioni dalla 0.1.0 fino alla 0.1.5 sono supportate solo da Windows 2000, Windows NT e Windows XP. Subito dopo il primo rilascio, Satoshi ha perfezionato il client, ha corretto alcuni errori di comunicazione con i nodi e ha lavorato con alcuni collaboratori per migliorare l'usabilità del client; per esempio hanno impedito di inserire il tuo stesso indirizzo nell'elenco e la possibilità di inserire dettagli e spiegazioni sulle transazioni dei bitcoin generati. Durante 15
i successivi quattro anni la rete Bitcoin è cresciuta anche in termini di sicurezza e affidabilità. Nel 2013 il valore totale di mercato del Bitcoin era stimato a più di 10 miliardi di dollari, attualmente è sui 7 miliardi. La più grande transazione processata dalla rete è stata di 150 milioni di dollari ed è stata trasmessa istantaneamente senza costi di commissione. Alla fine del 2010, Satoshi ha pubblicato la versione “di addio” 0.3.9, lasciando il progetto definitivamente. Il distacco del creatore non è stato critico per la valuta e la comunità si è fatta carico dello sviluppo. Il nome Satoshi Nakamoto è un alias e l’identità della persona o delle persone che stanno dietro a questa invenzione è ancora ignota. Né Satoshi Nakamoto né nessun altro può controllare il sistema Bitcoin, che opera sulla base di principi matematici. [5] 2.3. COME FUNZIONA Per inviare denaro si trasmette alla rete l’ordine di diminuire l’importo sul proprio conto e di aumentare della stessa quantità il conto del destinatario. I nodi della rete Bitcoin applicano tale operazione alla loro copia del registro e poi passano la transazione agli altri nodi. L'utente genera una coppia di chiavi pubblica e privata. Scrive un messaggio che contiene la quantità di denaro che vuole trasferire e la chiave pubblica del destinatario. A questo punto firma con la propria chiave privata il messaggio e lo invia. Il destinatario verificando la firma avrà quindi la prova crittografica del mittente, del destinatario e della quantità di denaro trasferita. [2] 2.3.1. ARCHITETTURA Il sistema Bitcoin è eseguito da una rete peer-to-peer di computer chiamati nodi. Questi ultimi hanno il compito di processare le transazioni e di occuparsi del mantenimento di tutti i record dei proprietari. 16
Chiunque può scaricare il software open source Bitcoin e diventare un nodo. Ogni nodo è trattato allo stesso modo, e nessun nodo è “fidato”. Il sistema è basato sul fatto che la maggior parte della potenza computazionale arriverà da nodi “onesti”. I record dei proprietari sono replicati in ogni nodo. Il registro di Bitcoin è conosciuto come la “blockchain”, la quale può essere pensata come un record di tutti i destinatari di tutte le transazioni che sono avvenute nel sistema Bitcoin. Al contrario del registro delle banche, la blockchain non contiene i bilanci degli account, ma tiene il record delle transazioni. La transazione precedente nella quale i bitcoin sono stati presi è chiamata input. Quando una transazione è usata come input, si dice che quella transazione è stata “spesa”, perché tutto il suo valore verrà inviato ad altri e la transazione non potrà essere usata come input di nuovo. [2] 2.3.2. INDIRIZZI La blockchain non registra i proprietari con la loro vera identità, ma usa codici chiamati indirizzi. Per creare un indirizzo, il client Bitcoin genera una coppia di chiave pubblica-privata. L’indirizzo è formato applicando la seguente funzione alla chiave pubblica (in pseudocodice ++ rappresenta la concatenazione): version = (1 byte version number) keyHash = RIPEMD-160(SHA-256(publicKey)) data = version ++ keyHash dataHash = SHA-256(SHA-256(data)) checksum =(first 4 bytes of dataHash) address = Base58Encode(data ++ checksum) 17
Il byte di versione rappresenta la versione dell’indirizzo, che ha come valore zero per gli indirizzi normali della maggior parte della rete Bitcoin. [6] Ci sono altri tipi di indirizzi e diverse reti che usano diversi numeri di versione. La funzione RIPEMD-160 è una funzione hash con 20 byte di output. Si è preferito utilizzare come identificatore del destinatario, al posto della chiave pubblica, un hash lungo 160 bit della stessa, codificato in Base58Encode e chiamato indirizzo. La codifica permette di verificare la correttezza formale dell'indirizzo al momento del suo inserimento. [2] 2.3.3. TRANSAZIONI Ora sappiamo che le firme digitali garantiscono che una transazione sia autorizzata. Nei nodi non viene salvato il saldo dei conti, al posto dei saldi la proprietà dei fondi è verificata attraverso collegamenti alle transazioni precedenti. Quando un utente Bitcoin esegue un pagamento, il client crea un messaggio di transazione e lo invia alla rete peer-to-peer. Una transazione contiene le seguenti informazioni, con CTxIn e CTxOut mostrate qui sotto. [2] class CTransaction int nVersion; std::vector vin; std::vector vout; unsigned int nLockTime; 18
Figura 2.1: Diagramma di un trasferimento di Bitcoin dove A sta inviando Bitcoin a B. La transazione alla sinistra mostra diversi input (CTxIn) in vin e diversi output (CTxOUT) in vout per mostrare che vin e vout sono degli array. Le etichette “(n=0)” e “(n=1)” indicano la posizione negli array. La transazione ha una lista di input (vin) che si riferiscono alle precedenti transazioni e una lista di output che specificano gli indirizzi di destinazione. Questo permette di inviare denaro a più destinatari. La variabile nVersion contiene il numero di versione per la transazione così la rete peer-to-peer può funzionare anche con versioni del client Bitcoin diverse. La variabile nLockTime è usata per prevenire che la transazione sia processata prima di un determinato tempo; questo è molto utile per creare contratti. Un input (CTxIn) referenzia un output di una precedente transazione (prevout), che rappresenta l’output da spendere. class CTxIn CoutPoint prevout; Cscript scriptSig; 19
unsigned int nSequence; class COutPoint uint256 hash; unsigned int n; Per riferirsi unicamente a un output di una transazione, è sufficiente provvedere che l’hash della transazione sia in hash e che l’indice dell’output sia dentro il vettore vout della transazione(n). Questo è precisamente ciò che è contenuto nella variabile prevout di tipo COutPoint. Questo output referenziato in prevout sarà completamente speso. Gli input specificano anche un scriptSig che contiene la chiave pubblica del proprietario e una firma che prova che la transazione è valida. Class CTxOut int64 nValue; Cscript scriptPubKey; L’output di una semplice transazione (CTxOut) specifica un indirizzo (dentro scriptPubKey) e quanto bisogna inviare a quell’indirizzo(nValue), espresso in Satoshi, la più piccola unità della valuta di Bitcoin, che vale 1/100,000,000 di bitcoin. Lo script può essere personalizzabile e può essere più complicato di questo appena visto. Script più complessi possono essere utilizzati per personalizzare contratti che prevedono che una certa transazione non possa essere completata fino a quando certe condizioni non siano verificate. [2] 2.3.4. VERIFICA Quando un cliente Bitcoin invia una nuova transazione alla rete peer-to-peer, gli altri nodi della rete inizieranno a processarlo nella blockchain (Mining). Il primo step di 20
questo processo verifica che la transazione sia valida. I seguenti controlli sono eseguiti durante la validazione: Garantire che la transazione abbia passato i controlli di validazione (bond checking, controlli sintattici, etc.). Rifiutare se la stessa transazione è già nella blockchain o sta per essere processata. Questo previene che la stessa transazione possa essere processata due volte. Per ogni input, concatenare scriptSig dell’input con scriptPubKey script dell’output e verificare che il risultato sia True. Se questi script sono nel formato standard, questo confermerà che il proprietario dei bitcoin ha avviato la transazione. Rifiutare la transazione se qualsiasi output delle transazioni specificate nell’input sono state già usate in un'altra transazione della blockchain. Questo previene la doppia spesa. Garantire che la somma dei valori degli input sia maggiore o uguale alla somma dei valori di output. [2] 2.3.5. BLOCKCHAIN La rete Bitcoin adotta una soluzione che rappresenta un modo intelligente per determinare e salvaguardare la rete, attraverso una sorta di gara matematica (proof-to- work). La rete Bitcoin ordina le transazioni inserendole in gruppi chiamati blocchi e li unisce in una catena chiamata blockchain. La blockchain viene utilizzata per ordinare le transazioni, mentre la catena di transazioni tiene traccia di come cambia la proprietà. 21
Ogni blocco ha un riferimento a un blocco precedente e questo serve a dargli un ordine nel tempo; in questo modo è possibile percorrere i riferimenti a ritroso, fino al primo gruppo di transazioni processate. Le transazioni dello stesso blocco sono considerate come accadute nello stesso momento e le transazioni non ancora presenti in un blocco sono chiamate non confermate o non ordinate; ogni nodo può raccogliere un insieme di transazioni non confermate in un blocco e trasmettere al resto della rete un “suggerimento” che dovrebbe essere il blocco successivo. Dato che più persone possono creare blocchi nello stesso momento, ci potrebbero essere diverse opzioni tra cui scegliere. Come fa la rete a scegliere quale blocco dovrebbe essere il successivo? Non possiamo basarci sull’ordine con cui i blocchi arrivano, in quanto essi possono arrivare con diversi ordini in diversi punti della rete. Una parte della soluzione Bitcoin prevede che ogni blocco debba contenere una risposta a un problema matematico molto particolare; i computer passano l’intero testo di un blocco più un numero casuale a una funzione hash crittografica, fino a quando il risultato della funzione non è inferiore a un certo valore. L’uscita è completamente imprevedibile, quindi l’unico modo per trovare un particolare valore di output è quello di fare prove casuali. Con tutti i computer della rete ci vogliono in media 10 minuti affinché qualcuno trovi la soluzione; la prima persona che risolve il problema trasmette il blocco e il suo gruppo di transazioni viene accettato come il successivo nella catena. Occasionalmente però, più di un blocco può essere risolto allo stesso tempo, portando a diversi rami possibili. In questo caso la regola dice che bisogna accettare il ramo più lungo possibile. 22
Figura 2.2: I blocchi neri rappresentano il ramo accettato, quello più lungo. I blocchi grigi sono mantenuti nella block chain ma sono ignorati perché non sono nel ramo più lungo. Il blocco più a sinistra è il primo blocco della block chain, chiamato blocco genesi. I nodi minatori considerano sempre come corretta la catena più lunga e continueranno a lavorare per estenderla. Nel caso due nodi trovino due differenti versioni dello stesso blocco contemporaneamente, ognuno trasmetterà la propria versione al resto dei nodi. Ogni nodo lavora sul blocco che ha ricevuto per primo, ma conserva l’altro nel caso diventi parte del ramo più lungo. [7] 2.4. MINING Da dove provengono i bitcoin? Per generare e distribuire lentamente, in modo casuale le monete, viene attribuito un premio a chi risolve un blocco, questo è il motivo per cui risolvere blocchi è chiamato “mining”, anche se il suo vero scopo è quello di verificare le transazioni e salvaguardare la blockchain. Ogni quattro anni il premio viene dimezzato, in modo che alla fine non saranno più rilasciate monete; verranno create in totale circa 21 milioni di monete, considerando che è possibile inviare fino a un cento milionesimo di bitcoin. 23
Una volta che la ricompensa del blocco termina, quale incentivo avranno i minatori per elaborare le transazioni? Oltre ai premi, i minatori ottengono anche le commissioni di transazione facoltative, che sono incluse con le transazioni. Per ora i minatori includono anche operazioni senza commissioni nei blocchi perché il loro incentivo principale è la ricompensa del blocco, ma in futuro le transazioni saranno probabilmente lavorate in base alle commissioni pagate e saranno probabilmente ignorate quelle senza commissioni. L’invio di denaro in Bitcoin non è gratis, ma sarà sempre più conveniente rispetto alle attuali commissioni con carta di credito. Ricapitolando, il lavoro dei minatori consiste nei seguenti step, eseguiti in loop: 1) Le nuove transazioni sono trasmesse a tutti i nodi. 2) Ogni minatore controlla che le transazioni siano valide e le raccoglie in un blocco insieme all’hash del blocco precedente. 3) Ogni minatore lavora per trovare un proof-of-work valido per il proprio blocco. 4) Quando un minatore trova un proof-of-work, trasmette il blocco a tutti gli altri nodi. 5) I nodi accettano il blocco solo se tutte le transazioni in esso sono valide e non sono già state spese. 6) I minatori esprimono l'accettazione del nuovo blocco come valido mediante il tentativo di creare il prossimo blocco nella catena, utilizzando l'hash del blocco accettato come hash precedente. 24
Figura 2.3: Quantità di BTC in circolazione “Minare” bitcoin funziona come una lotteria dove ogni computer (unità di potenza computazionale) corrisponde a un biglietto della lotteria. Come nella lotteria, solo un biglietto è vincente (nel nostro caso un computer) e prenderà la ricompensa per aver risolto un blocco. Avere più biglietti/computer (potenza computazionale), consente di aumentare la possibilità di ricevere la ricompensa. Per questo i minatori molte volte si raggruppano e collaborano assieme per formare i cosidetti “mining pools” in modo da risolvere i problemi di “proof of work” e poi condividere i guadagni. 25
Figura 2.3: Una tipica Mining Farm Se all’inizio, grazie ad una bassa difficoltà, bastavano un computer recente e una CPU veloce per minare svariati di blocchi al giorno, nel corso degli anni è stato necessario passare all’utilizzo delle GPU, più veloci nei calcoli paralleli. Successivamente si è passati all’utilizzo di FPGA (Field Programmable Gate Array) le quali sono più veloci rispetto a CPU e GPU. Si tratta di schede integrate che possono essere programmate per svolgere determinati calcoli e per eseguire più velocemente il calcolo dello SHA-256. Nel 2013 sono stati rilasciati i primi dispositivi ASIC (Application Specific Integrated Circuit). Essi sono simili agli FPGA, ma una volta realizzati, non possono essere riprogrammati, essi sono appositamente realizzati per minare BTC; questi dispositivi sono in grado di sviluppare una potenza di calcolo svariate volte maggiore delle FPGA. 26
Capitolo 3. Smart Contracts 3.1. COSA SONO GLI SMART CONTRACT Gli smart contract sono dei programmi definiti dall’utente che specificano regole che governano le transazioni e sono potenziati dalla rete peer-to-peer. In confronto con i tradizionali contratti finanziari, gli smart contract portano avanti la promessa di bassi costi legali e di transazione. Figura 3.1: Schema di come funzionano gli smart contract in un sistema di una cripto valuta decentralizzate Un contratto è un’istanza di un programma di un computer che è avviata nella blockchain. Al contrario dei sistemi centralizzati, memorizzare i contratti nella blockchain garantisce che i dati siano distribuiti e protetti da fenomeni naturali come incendi, inondazioni o altri disastri che porterebbero alla distruzione dei data center. Un contratto consiste in un codice di programma, un file di memorizzazione e un saldo di un 27
account. Ogni utente può creare un contratto postando una transazione nella blockchain. Il codice del programma del contratto viene impostato quando il contratto viene creato e non può essere cambiato. Il file di memorizzazione del contratto è salvato nella blockchain pubblica (vedi Figura 3.1). La logica del programma del contratto è eseguita dalla rete di minatori che riscuotono consensi dal risultato dell’esecuzione e aggiornano la blockchain. Il codice del contratto viene eseguito quando esso riceve un messaggio, da un utente o da un altro contratto. Durante la sua esecuzione, il contratto può leggere o scrivere nel suo file di memorizzazione. Un contratto può anche ricevere denaro da memorizzare nel suo saldo e inviare denaro ad altri contratti o utenti. [8] 3.2. COME SI COSTRUISCONO GLI SMART CONTRACT Il codice degli smart contract, contenuto all'interno delle transazioni, è scritto in linguaggio low-level e consiste in una serie di bytes, dove ogni byte rappresenta un’operazione. Ovviamente, vista la difficoltà nel programmare in linguaggio low-level, sono stati sviluppati alcuni linguaggi high-level che permettono di scrivere gli smarts contract senza alcuna difficoltà. Uno tra i più utilizzati, in ambiente Ethereum, è Solidity che, per quanto riguarda la sintassi, si avvicina a Javascript. Una volta terminato il codice sarà Solidity a trasformarlo in codice EVM (Ethereum Virtual Machine). Malgrado la complessità di costruire gli smart contracts, il sito etherscripter.com aiuterà nel costruirli con un linguaggio ad alto livello (a blocchi), quasi "umano" e poi a convertirli nei linguaggi Serpent, XML o LLL. [9] 28
Figura 3.2: Costruzione degli smart contracts con l'aiuto di Etherscripter. 3.3. INVOCAZIONE DEL CONTRATTO Il codice del contratto sarà invocato ogni volta che riceve una transazione da un utente. Un contratto può definire molti metodi (entry point) di esecuzione; nel linguaggio Serpent di Ethereum ogni entry point è definito da una funzione. I contenuti di una transazione specificheranno gli entry point nei quali il codice del contratto verrà invocato, perciò le transazioni rappresentano delle funzioni chiamate secondo l’ordine del linguaggio di programmazione. Dopo che un contratto finisce di processare un messaggio ricevuto, passerà un valore di ritorno al mittente. [8] 29
3.4. UN ASSAGGIO DEL PROGETTO DEGLI SMART CONTRACT In questo paragrafo verrà presentata una panoramica del progetto degli smart contract, descrivendo l’implementazione di un semplice, ma utile esempio. Il contratto in questione ammette due parti. Alice e Bob, fanno delle scommesse opposte riguardo il prezzo di un determinato bene (stock) in un tempo futuro e ogni parte, inizialmente, deposita una quantità uguale di denaro (come unità di Ether, “wei”). Alla scadenza, il prezzo corrente dello stock viene “interrogato” interagendo con un’autorità designata per attribuire il prezzo. Tale autorità dovrebbe essere implementata come uno smart contract – ci riferiamo a StockPriceAuthority. A seconda del prezzo dichiarato da quest’ultima, l’intero deposito combinato è assegnato ad Alice o Bob. [8] Figura 3.3: Questo programma scritto in Serpent implementa un semplice strumento di scambio, illustrando quanto gli smart contract siano potenti e utili strumenti per programmare con il denaro. 30
La memoria del contratto alloca spazio per le chiavi pubbliche di Alice e Bob (1 linea di codice) e per la scadenza e soglia del contratto di scambio; il contratto definisce, inoltre, una funzione determine_outcome, che ogni parte può invocare. Questo esempio serve per spiegare gli utili aspetti dello smart contract come strumento finanziario. Di seguito vengono presentati alcuni tipi di applicazione che si possiamo sviluppare con gli Smart Contract: Applicazioni finanziarie che permettono agli utenti di utilizzare e gestire dei contratti. Di tale categoria fanno parte i derivati finanziari, i testamenti, i contratti di hedging, i libretti di risparmio e altro ancora. Applicazioni "quasi" finanziarie, in cui non è soltanto il lato monetario ad essere coinvolto. Un esempio ad hoc sono le auto-assegnazioni di premi per le soluzioni di problemi di calcolo. Applicazioni non finanziarie come il voto on-line. [8] 31
Capitolo 4. Ethereum 4.1. COS’È ETHEREUM Ethereum è una piattaforma open source creata per sviluppare e distribuire la prossima generazione di smart contract, ovvero applicazioni senza intermediari dove gli utenti interagiscono con sistemi sociali, sistemi finanziari e interfacce di gioco in maniera peer- to-peer, in cui ogni nodo partecipa all’esecuzione dei programmi. Lo scopo di Ethereum è quello di facilitare lo sviluppo degli smart contract. Ethereum è anche il nome del linguaggio Turing completo, ideato per programmare tramite tale piattaforma. Dal momento che il network Ethereum sarà distribuito su centinaia di migliaia di computer intorno al mondo questo processo avviene su fondamenta a prova di censura. Gli sviluppatori si occupano di creare il programma, caricarlo sulla rete e inviare all’indirizzo del programma una certa quantità di criptovaluta, denominata Ether. A questo punto i nodi che sono interessati ad eseguire il codice possono farlo, e ricevono ad ogni ciclo una quantità prefissata di Ether. [10] 4.2. COME FUNZIONA ETHEREUM Al centro di Ethereum c’è la tecnologia blockchain; Ethereum rende questa tecnologia adottabile con qualsiasi altra applicazione, ognuna delle quali può essere rappresentata matematicamente e può essere modellata, resa sicura e scambiata. Proprio come con Bitcoin, non si ha bisogno di fidarsi di una banca o di un’autorità centrale per tenere i propri fondi al sicuro; su Ethereum, infatti, le informazioni personali, l’identità e il proprio capitale, restano sotto il proprio controllo in ogni momento. 32
Figura 4.1: Logo Ethereum 4.2.1. ETHEREUM ACCOUNTS In Ethereum, lo stato è costituito da oggetti chiamati "accounts", ciascuno dei quali ha un indirizzo di 20-byte e le transizioni di stato sono trasferimenti diretti di valore e di informazione tra gli account. Un account contiene quattro campi: 1. Il nonce: un contatore utilizzato per assicurarsi che ogni transazione può essere elaborata una sola volta; 2. Il conto corrente dell'account (in ether); 3. Il contract code dell'account, se presente; 4. Lo storage dell'account (vuoto di default). "Ether" è il crypto-carburante di Ethereum e viene usato per pagare le commissioni di transazione. In generale, esistono due tipi di account: account posseduti dall'esterno, controllati da chiavi private, e gli account contratto, controllati dal loro codice di contratto. Un account posseduto dall'esterno non ha codice, e si possono mandare messaggi esterni 33
dall'account posseduto esternamente, creando e firmando una transazione; in un account contratto, invece, ogni volta che quest’ultimo riceve un messaggio, il suo codice si attiva, permettendogli di leggere e scrivere verso uno storage interno e spedire altri messaggi o creare contratti a sua volta. Si noti che i "contratti" in Ethereum non dovrebbero essere visti come qualcosa da "riempire" o "da compilare con"; piuttosto, essi sono più "agenti autonomi", che vivono all'interno dell'ambiente di esecuzione di Ethereum, eseguendo sempre una porzione specifica di codice che viene attivata da un messaggio o da una transazione; i contratti hanno il controllo diretto sul proprio conto di ether e sulla propria chiave/valore di store, e possono tenere traccia delle proprie variabili persistenti. [11] 4.2.2. TRANSAZIONI Il termine "transazione" è utilizzato in Ethereum per riferirsi al pacchetto di dati firmati che contengono un messaggio da inviare da un account posseduto dall'esterno. Le transazioni contengono: Il destinatario del messaggio; Una firma che identifica il mittente; L'ammontare di ether da trasferire al destinatario; Un campo dati opzionale; Un valore STARTGAS, che rappresenta il massimo numero di step computazionali che l'esecuzione della transazione può impiegare; Un valore GASPRICE, che rappresenta la commissione che il mittente paga per lo step computazionale. 34
I primi tre sono campi standard previsti in qualsiasi criptovaluta. Il campo dati non ha nessuna funzione da default, ma la virtual machine ha un codice operativo con cui un contratto può accedere ai dati; ad esempio, se un contratto sta funzionando come un servizio di registrazione di dominio basato sulla blockchain, allora può desiderare di interpretare i dati che vengono passati ad esso come contenenti due "campi": il primo campo è un dominio da registrare ed il secondo è l'indirizzo IP da registrare. Il contratto dovrebbe leggere questi valori dai dati dei messaggi e collocarli appropriatamente nello storage. I campi STARTGAS e GASPRICE sono cruciali per il modello di servizio anti-denial di Ethereum. Al fine di prevenire loops infiniti, accidentali o ostili, o altro spreco computazionale di codice, ad ogni transazione è richiesto di impostare un limite per l'uso di step computazionali di codice di esecuzione. L'unità fondamentale di computazione è il "gas". Ethereum usa il concetto di “gas” per scoraggiare un consumo eccessivo di risorse. L’utente che crea una transizione deve spendere “denaro” per acquistare gas. Di solito uno step computazionale costa un gas, ma alcune operazioni richiedono più unità di gas, perché sono computazionalmente più complesse, o richiedono un numero più elevato di dati che devono essere conservati come parte dello stato. Durante l’esecuzione della transazione, ogni istruzione del programma consuma un dato valore di gas. Se il gas finisce prima che la transazione arrivi, verrà trattata come un’eccezione e la transazione non avrà effetto. Nonostante ciò, l’ether usato per acquistare gas non verrà rimborsato. C'è anche una commissione di gas per ogni byte nei dati della transazione. L'obiettivo del sistema di commissioni è quello di obbligare un aggressore di pagare proporzionalmente ad ogni risorsa consumata, includendo la computazione, la larghezza di banda, e lo storage. Quindi, qualsiasi transazione che comporta che il network consumi una quantità più grande di una qualsiasi di queste risorse deve dare una commissione gas più o meno proporzionale alla grandezza dell'incremento. [11] 35
Puoi anche leggere