Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa

Pagina creata da Christian Giunta
 
CONTINUA A LEGGERE
Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa
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
Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa
1
Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa
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
Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa
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
Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa
 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
Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa
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
Criptovalute e Smart Contract - Giorgio Loi Prof. Michele Marchesi - UNIVERSITÀ DEGLI STUDI DI CAGLIARI - UniCa
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