Università degli Studi di Padova - SIAGAS

Pagina creata da Giulio Ruggeri
 
CONTINUA A LEGGERE
Università degli Studi di Padova - SIAGAS
Università degli Studi di Padova
     Dipartimento di Matematica "Tullio Levi-Civita"
                   Corso di Laurea in Informatica

  Blockchain: Analisi ed Implementazione di un
      Caso d’Uso Mediante Smart Contract
                            Tesi di laurea

Relatore
Ch.mo Prof. Francesco Ranzato

                                                          Laureando
                                                       Federico Brian
                                                    Matricola 1122698

                      Anno Accademico 2018-2019
Università degli Studi di Padova - SIAGAS
Federico Brian: Blockchain: Analisi ed Implementazione di un Caso d’Uso Mediante Smart
Contract, Tesi di laurea, c 17 Settembre 2019.
“Fare le cose vecchie in modo nuovo - questa è innovazione.”
                                  Joseph Alois Schumpeter
Abstract

La tecnologia blockchain è ancora in fase nascente, tuttavia sta suscitando un considerevole
interesse. Nata dal genio di Satoshi Nakamoto, pseudonimo che può rappresentare un individuo
od una collettività, questa innovazione è finalizzata allo sviluppo di un sistema di pagamento
online, sicuro e indipendente da qualsiasi tipo di autorità centrale.
Con il presente documento, il laureando Federico Brian descrive il lavoro svolto durante il
periodo di stage avvenuto presso l’azienda Sync Lab S.R.L. nella sede di Padova, il cui scopo
era: analizzare lo stato dell’arte della tecnologia blockchain, studiarne le diverse tipologie ed, in
un primo momento, il linguaggio degli smart contract Solidity applicato alla catena Ethereum.
Nondimeno, un’idea di progetto software ha preso forma durante lo stage ed il laureando è stato
chiamato a contribuire allo sviluppo proprio per quanto riguarda il lato blockchain: grazie alle
conoscenze acquisite è stato in grado di offrire un contributo significativo anche dal punto di
vista decisionale.
Lo studio operato e le conoscenze acquisite si sono concretizzati nella realizzazione di un’in-
frastruttura permissioned che implementa, su Hyperledger Fabric, un caso d’uso relativo alla
compravendita ed al passaggio di proprietà di beni.
Lo stage è stato supervisionato dal tutor aziendale Ing. Fabio Pallaro ed ha avuto la durata
complessiva di trecento ore.

                                                 v
Ringraziamenti

Vorrei ringraziare in primo luogo il prof. Francesco Ranzato, relatore della mia tesi, per la
precisione delle comunicazioni e la disponibilità dimostratami durante la stesura di questo
documento.

Ringrazio Sync Lab S.R.L. per avermi dato la possibilità di sviluppare un progetto inno-
vativo, utilizzando tecnologie all’avanguardia che mai hanno mancato di mettermi alla prova.
Ringrazio Fabio Pallaro per essere un tutor eccezionale, i colleghi per la simpatia: grazie per
aver reso l’ufficio un ambiente lavorativo cordiale e mai noioso.

Desidero ringraziare la mia famiglia per il sostegno manifestato nei miei confronti nel corso di
questi anni.

Ringrazio gli amici di una vita, ormai sparsi per il globo, con i quali ho condiviso avven-
ture oltre ogni immaginazione: Sandro, Ferdi, Otto, Bally, Trink, Nardo, Dave, Gianni, Silvia,
Rocco, Secco, Aomo.

Ringrazio Margherita ed Emma per essere così speciali ed indispensabili. Ringrazio Marta
per l’affetto e la premurosità dimostratemi in questo ultimo anno.

Infine, desidero ringraziare il Conio per questi primi due anni indimenticabili.
Ringrazio i coinquilini meravigliosi che mi ha regalato: la Queen, il Depa, Riki, Giacomo,
Vlad, Sarci e Lucarmà.

Padova, 17 Settembre 2019                                                       Federico Brian

                                              vii
Indice

1   Introduzione                                                                                                                                     1
    1.1 L’azienda . . . . . . . . .     .   .   .   .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   1
         1.1.1 Servizi offerti . . .    .   .   .   .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   2
         1.1.2 Settori di impiego .     .   .   .   .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   3
    1.2 L’idea . . . . . . . . . . .    .   .   .   .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   3
    1.3 Organizzazione del testo .      .   .   .   .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   3

2   Processi e metodologie aziendali                                                                                                                 5
    2.1 Extreme Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                                5
         2.1.1 Concretizzazione dei principi Extreme . . . . . . . . . . . . . . . . .                                                               6
    2.2 Strumenti di supporto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                            8

3   Descrizione dello stage                                                                                                                           9
    3.1 Introduzione al progetto . . . . . .            .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
         3.1.1 Considerazioni preliminari               .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
         3.1.2 Descrizione del prodotto .               .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
    3.2 Studio tecnologico . . . . . . . .              .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
         3.2.1 Blockchain . . . . . . . .               .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10

4   Studio di fattibilità blockchain                                                                                                                 15
    4.1 Sintesi dello studio di fattibilità . . . . . . . . . . . . . . .                                    .   .   .   .   .   .   .   .   .   .   15
    4.2 Ethereum . . . . . . . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   .   .   .   15
         4.2.1 Smart contract . . . . . . . . . . . . . . . . . . .                                          .   .   .   .   .   .   .   .   .   .   16
         4.2.2 Linguaggi di programmazione degli smart contract                                              .   .   .   .   .   .   .   .   .   .   16
         4.2.3 Gas . . . . . . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   .   .   .   17
    4.3 Hyperledger Fabric . . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   .   .   .   17
         4.3.1 Descrizione . . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   .   .   .   17
         4.3.2 Architettura . . . . . . . . . . . . . . . . . . . . .                                        .   .   .   .   .   .   .   .   .   .   18
    4.4 Studio del dominio . . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   .   .   .   23
         4.4.1 Studio del dominio applicativo . . . . . . . . . . .                                          .   .   .   .   .   .   .   .   .   .   23
         4.4.2 Studio del dominio tecnologico . . . . . . . . . .                                            .   .   .   .   .   .   .   .   .   .   23
         4.4.3 Conclusioni . . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   .   .   .   .   26

5   Implementazione                                                                                                                                  27
    5.1 Progettazione Architetturale . . . . . . . . .                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
    5.2 Descrizione . . . . . . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
         5.2.1 Topologia di rete Hyperledger Fabric                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
         5.2.2 Istanziazione della rete . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
         5.2.3 Chaincode in Java . . . . . . . . . .                             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31

                                                        ix
x                                                                                                                                     INDICE

6   Conclusioni                                                                                                                               33
    6.1 Consuntivo finale . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   33
    6.2 Raggiungimento degli obiettivi    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   34
    6.3 Conoscenze acquisite . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   35
    6.4 Valutazione Personale . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36

Glossario                                                                                                                                     37
Elenco delle figure

 1.1   Logo Sync Lab S.R.L. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                             2

 2.1   Cicli di pianificazione e riscontro di Extreme Programming. . . . . . . . . .                                              6

 4.1   Logo di Ethereum . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
 4.2   Logo di Solidity . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
 4.3   Logo di Vyper . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
 4.4   Logo di Hyperledger Fabric . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   17
 4.5   Struttura del ledger in Hyperledger Fabric     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18

 5.1   Progettazione architetturale del prodotto software . . . . . . . . . . . . . . .                                           27
 5.2   Topologia di rete implementata. . . . . . . . . . . . . . . . . . . . . . . . .                                            28

Elenco delle tabelle

 6.1   Tabella degli obiettivi obbligatori . . . . . . . . . . . . . . . . . . . . . . . .                                        34
 6.2   Tabella degli obiettivi desiderabili . . . . . . . . . . . . . . . . . . . . . . .                                         34
 6.3   Tabella degli obiettivi facoltativi . . . . . . . . . . . . . . . . . . . . . . . .                                        35

                                             xi
Capitolo 1

Introduzione

In questo capitolo verrà brevemente esposto il contesto in cui si è svolto lo stage, descri-
vendo le motivazioni che hanno spinto l’azienda a proporlo.

Introduzione al contesto applicativo.

Esempio di utilizzo di un termine nel glossario
Proof-of-Work (PoW).

Esempio di citazione in linea.
[1]

Esempio di citazione nel pie’ di pagina
citazione1 .

1.1     L’azienda
Sync Lab S.R.L. è una società di consulenza informatica fondata nel 2002 con sedi a Napoli,
Roma, Milano, Verona e Padova.
Fin dai primi anni Sync Lab si è rapidamente sviluppata nel mercato ICT, raggiungendo
una solida base finanziaria e un’ampia diffusione sul territorio attraverso le sue cinque sedi.
L’organico aziendale è andato aumentando in modo continuo e rapido, in relazione all’apertura
delle varie sedi ed alla progressiva crescita delle stesse, raggiungendo le cento collaborazioni
nel 2007 e superando le duecento nel 2016.
    Le politiche di assunzione hanno reso Sync Lab un punto di riferimento per coloro che
intendono avviare o far evolvere in chiave professionale la loro carriera: l’alto tasso di assunzione
post-stage [9] ed il basso turn-over testimoniano la voglia di condividere il progetto comune,
assumendo ruoli e responsabilità che possono essere offerti solo da un processo evolutivo così
intenso.
    Il fatturato rispecchia la crescita dell’azienda, beneficiando dell’approccio adattativo e
diversificato al mercato [10].

                                                 1
2                                                             CAPITOLO 1. INTRODUZIONE

                                Figura 1.1: Logo Sync Lab S.R.L.

1.1.1    Servizi offerti
La principale attività di Sync Lab è la consulenza tecnologica: un processo continuo di identifi-
cazione e messa in opera di soluzioni su misura, finalizzate alla creazione di valore. Sync Lab
eroga servizi in ambito:

    ∗ Business Consultancy;

    ∗ Project Financing;

    ∗ IT Consultancy.

In questo modo, l’azienda è in grado di supportare le esigenze di innovazione di tutte le
organizzazioni ed in ogni settore di mercato dell’Information Technology.
    Un ulteriore punto di forza di Sync Lab è la qualità dei servizi offerti, come dimostrano
le certificazioni ISO 9001, ISO 14001, ISO 27001, OHSAS 18001 ottenute nel corso degli
anni. L’approfondita conoscenza di processi e tecnologie, maturata in esperienze altamente
significative e qualificanti, fornisce l’expertise e il know-how necessari per gestire progetti di
elevata complessità, dominando l’intero ciclo di vita:

    ∗ Studio di fattibilità;

    ∗ Progettazione;

    ∗ Implementazione;

    ∗ Governance;

    ∗ Post Delivery.

    L’offerta di consulenza specialistica trova le punte di eccellenza nella progettazione di
architetture software avanzate, siano esse per applicativi di dominio, per sistemi di Supporto
al Business (BSS), per sistemi di integrazione (EAI/SOA) o per sistemi di monitoraggio appli-
cativo/territoriale. Il laboratorio Ricerca e Sviluppo (RD) dell’azienda è sempre al passo con
i nuovi paradigmi tecnologici e di comunicazione, ad esempio Big Data, Cloud Computing,
Internet of Things (IoT), Mobile e Sicurezza IT, per supportare i propri clienti nella creazione
ed integrazione di applicazioni, processi e dispositivi. Le attività in ambito Educational ed
RD hanno permesso di acquisire una profonda conoscenza degli strumenti di finanza agevolata
fruendone direttamente ed interagendo con enti di supporto ai progetti innovativi dei propri
clienti.
    L’azienda, grazie alla rete di relazioni a livello nazionale ed internazionale, ha ottenuto
importanti finanziamenti in progetti RD europei (FP7 e H2020) [11].
1.2. L’IDEA                                                                                      3

1.1.2    Settori di impiego
Sync Lab si sta sempre più specializzando in vari settori d’impiego: dal mondo banking
all’assurance con una nicchia importante nell’ambito sanità in cui vanta un prodotto d’ec-
cellenza per la gestione delle cliniche private. L’azienda inoltre ha recentemente fondato un
reparto collegato Sync Security che si occupa espressamente del mondo della cyber security e
sicurezza informatica in genere.

1.2     L’idea
Non esiste ad oggi una procedura ben definita, tracciata e normata che descriva il processo di
compravendita di un bene generico. Gli attuali strumenti che cercano di adempiere a tale scopo,
per alcuni tipi di beni, sono dei documenti di “scrittura privata”: si tratta tuttavia di procedure
non regolamentate e lasciate al libero arbitrio delle persone.
    Questa mancanza potrebbe essere colmata attraverso un software opportunamente svilup-
pato, che tiene traccia in modo non falsificabile ed immutabile dello scambio di beni: per
questo caso d’uso la blockchain trova la sua applicazione ideale poiché soddisfa esattamente le
seguenti esigenze:

   ∗ Immutabilità delle transazioni;
   ∗ Verificabilità delle stesse;
   ∗ Sicurezza dei dati.
Lo scopo dello stage è realizzare una rete blockchain che dia la possibilità di utilizzare uno
specifico smart contract, ovvero un programma auto-eseguibile locato all’interno della struttura
stessa ed opportunamente sviluppato dal sottoscritto per il caso d’uso sopra citato. L’utente
deve avere la possibilità di registrare il pagamento relativo al passaggio del bene di valore in
questione e successivamente l’avvenuto scambio di quest’ultimo.
La tecnologia blockchain sarà descritta nella sezione 3.2.1.

1.3     Organizzazione del testo
Il secondo capitolo descrive le metodologie adottate per lo sviluppo del progetto.

Il terzo capitolo presenta lo studio del dominio tecnologico riguardante la tecnologia blockchain.

Il quarto capitolo affronta lo studio di fattibilità riguardante la tecnologia blockchain.

Il quinto capitolo descrive l’architettura del progetto, l’istanziazione della rete e l’implementa-
zione del chaincode.

Il sesto capitolo riporta le conclusioni tratte alla fine del periodo di stage, indicando un
consuntivo, le competenze acquisite e le impressioni avute relative all’esperienza di tirocinio.
Capitolo 2

Processi e metodologie aziendali

Nel presente capitolo verranno descritte le tecniche e metodologie di sviluppo del prodotto.
Più precisamente verranno descritti i principi cardine di Extreme Programming e successi-
vamente verrà illustrato come questi siano stati applicati durante lo stage.

   Come moltissime altre aziende, anche Sync Lab sta abbracciando le metodologie Agile
come modello di sviluppo prediletto. I principi di tali metodologie sono pochi e precisi:

   ∗ Le persone e le interazioni sono più importanti dei processi e degli strumenti;

   ∗ È più importante avere software funzionanti che documentazione;

   ∗ Bisogna essere pronti a rispondere ai cambiamenti oltre che aderire alla pianificazione.

Nel mio caso sono stato inserito in un contesto dove veniva utilizzato un modello di sviluppo
Agile declinato alla variante Extreme Programming (Extreme).

2.1     Extreme Programming
Extreme è un framework di sviluppo che mira alla qualità del software e, soprattutto, alla qualità
della vita del team di sviluppo. È il più preciso dei framework Agile per quanto riguarda le
pratiche di ingegneria appropriate per lo sviluppo software e trova la sua applicazione ottimale
quando:

   ∗ I requisiti del software cambiano rapidamente;

   ∗ Si conosce la data precisa del rilascio del progetto;

   ∗ Si utilizzano tecnologie nuove, poco conosciute;

   ∗ Il team di sviluppo è di piccole dimensioni e situato nella medesima località;

   ∗ La tecnologia usata permette l’utilizzo di Unit Test e Functional Test [13].

                                                5
6                                        CAPITOLO 2. PROCESSI E METODOLOGIE AZIENDALI

                 Figura 2.1: Cicli di pianificazione e riscontro di Extreme Programming.

Elementi chiave di Extreme sono il Pair Programming, l’uso sistematico di unit e functional
test, il Refactoring, il divieto ai programmatori di sviluppare codice non strettamente necessario
secondo il principio YAGNI 1 , l’enfasi sulla chiarezza e la semplicità del codice, la preferenza per
strutture gestionali non gerarchiche e l’importanza data alla comunicazione diretta e frequente
fra sviluppatori e cliente e fra gli sviluppatori stessi2 .
    Proprio come la metodologia Scrum, anch’essa derivata da Agile, Extreme prevede dei gior-
nalieri stand-up meeting in cui gli sviluppatori sono chiamati a rispondere fondamentalmente a
tre specifiche domande:

     ∗ Cos’è stato portato a termine ieri?

     ∗ Cosa sarà portato a compimento oggi?

     ∗ Quali problemi stanno causando ritardi?

Nondimeno, esiste anche in Extreme la suddivisione del progetto in blocchi di lavoro rapidi,
detti Sprint, alla fine di ciascuno dei quali creare un incremento del software.

2.1.1        Concretizzazione dei principi Extreme
Nel contesto del mio progetto di stage mi sono trovato in team di sviluppo chiamato Team933
di cui faccio tutt’ora parte e che mira a produrre un prodotto software completo per un cliente.
Questa situazione mi ha predisposto ad assimilare la maggior parte dei principi Extreme
immediatamente anche se, a volte, la velocità con cui era richiesta la realizzazione delle task
ha portato a compiere imprecisioni e inesattezze, dovute alla mia inesperienza professionale
nel campo IT.
    Per lo sviluppo dell’applicativo, il team ha adottato le seguenti metodologie Extreme,
suddivise per cadenza.
    1 “You Aren’t Gonna Need It” (ing. “non ne avrai bisogno”)
    2 dalprincipio Extreme:“Pair Negotiation” (ing. “negoziazione di coppia”), in cui gli sviluppatori sono chiamati a
dare il proprio contributo negli ambiti in cui hanno più esperienza
   3 dal momento che tutti i membri condividono lo stesso anno di nascita
2.1. EXTREME PROGRAMMING                                                                        7

Mensile:

   ∗ Release Plan: viene organizzata una videoconferenza con il cliente finale e gli stakehol-
     ders al fine di illustrare gli incrementi del software raggiunti, chiarire eventuali dubbi
     riguardanti il contesto del prodotto software e che possono potenzialmente influenzarne il
     comportamento, allineare le aspettative concernenti l’applicativo e concordando insieme
     i prossimi obiettivi da raggiungere.

Settimanale:

   ∗ Iteration Plan: ad inizio settimana vengono discussi, alla luce di quanto portato a termine
     la settimana precedente, gli obiettivi che si pianifica di riuscire a raggiungere nella
     settimana a venire. L’efficienza di pianificazione è una dote sovente mancante in lavoratori
     inesperti, per cui sono stato più volte sollecitato a rivedere quanto prefissato dato che si
     rivelava essere troppo ottimistico.

Giornaliera:

   ∗ Stand up meeting: una volta al giorno, non appena i componenti del team giungevano in
     ufficio ci si incontrava in sala conferenze per fare il punto della situazione secondo le
     regole del framework Extreme. È importante sottolineare che l’attenzione veniva posta
     anche ad eventuali problematiche extra-lavorative che potessero in qualche modo portare
     in una situazione di rischio la buona riuscita degli obiettivi prefissati, mettendo a proprio
     agio il lavoratore e permettendogli di risolvere l’eventuale problema ogniqualvolta ce ne
     fosse stato il bisogno.

Oraria:

   ∗ Pair programming il team di sviluppo, durante la fase di di analisi e progettazione
     architetturale, ha attuato questa metodologia che prevede che il più esperto del contesto
     trattato (piuttosto che del linguaggio di programmazione utilizzato) faccia da driver,
     cioè che scriva codice, mentre una o più persone facciano da navigator, vale a dire
     supervisione e revisione in tempo reale del codice scritto, segnalando eventuali errori o
     perplessità di concetti logici e tecniche riscontrate.

   ∗ Unit test: i test di unità sono sviluppati a monte della codifica del vero e proprio appli-
     cativo. Questa tecnica prende il nome di Test Driven Development (TDD) e permette
     di avere un’idea cristallina di come deve funzionare il software che si deve sviluppare.
     Nondimeno, scrivendo prima i test si forniscono esempi dettagliati che descrivono in
     modo univoco il comportamento del software e che, quindi, fungono da documentazione
     esaustiva.

   ∗ Hourly update: durante la codifica individuale è opportuno informare gli altri membri
     del team circa le attività portate a termine e le eventuali problematiche riscontrate. In
     questo modo si possono evitare situazioni che portano a perdere molto tempo e che
     possono mettere a rischio le scadenze prefissate.

   ∗ Half-an-our bug finding: letteralmente:“trovare il bug in mezz’ora”. Durante la codifica
     individuale si ha a disposizione al più mezz’ora di tempo per provare a risolvere un
     eventuale bug da soli, dopodiché si deve interpellare il responsabile del team per chiedere
     di essere assistiti. Se nemmeno lui è in grado di risolvere la situazione in un ulteriore
     mezz’ora, si ricorre all’aiuto del manager aziendale.
8                                  CAPITOLO 2. PROCESSI E METODOLOGIE AZIENDALI

Quest’ultimo principio non è proprio di Extreme ma si può considerare come tale, dato che
la metodologia si differenzia ad esempio da Scrum per l’estrema pianificazione, che a volte
avviene anche nell’ordine dei minuti.

2.2     Strumenti di supporto
Gli strumenti di supporto da me utilizzati in azienda sono i seguenti:

Slack: piattaforma di messaggistica altamente impiegata per il lavoro in team, che fa del
suo punto di forza la divisione per canali. Ogni canale ha un suo scopo e può avere accesso
libero o ristretto a membri selezionati. Il vantaggio dell’utilizzo di Slack è la velocità e facilità
dello scambio e reperimento delle comunicazioni ed informazioni e l’integrazione con diverse
applicazioni per un monitoraggio continuo ed immediato.

Trello: software gestionale in stile Kanban basato sul web. Ogni utente, a login effettuata,
può accedere a diversi workspace che può aggiornare inserendo o modificando una o più card,
a seconda delle task eseguite o da eseguire. Il vantaggio dell’utilizzo di Trello è rendere
consapevole l’utente dello stato in cui si trova lo sviluppo di un progetto software. Tramite la
creazione di una card l’utente può definire un requisito, un’azione atomica, un bug rilevato: in
questo modo si riesce a scomporre la complessità di un progetto software di grandi dimensioni,
rendendo la sua implementazione più schematica ed organizzata.

GitLab: servizio di versionamento online basato su Git. Il codice da me prodotto è salvato
su un repository privata su GitLab, aggiornata durante tutto il ciclo di sviluppo.
Capitolo 3

Descrizione dello stage

In questo capitolo si intende illustrare nel dettaglio lo studio iniziale e le considerazioni che
hanno portato allo sviluppo del progetto e che sono alla base della proposta di stage. Per
motivi di riservatezza mi è stato permesso solo di descrivere l’applicazione e le tecniche
utilizzate in modo sommario, senza scendere troppo nei dettagli, per tutelare la proprietà
intellettuale di Sync Lab S.R.L.

3.1     Introduzione al progetto
3.1.1    Considerazioni preliminari
È opportuno spendere del tempo per specificare la natura di questo progetto. Come descritto
nel sottotitolo del presente capitolo, non mi è possibile elargire dettagli con grande precisione
per non ledere la proprietà intellettuale dell’azienda ospitante Sync Lab. Il prodotto, descritto
nelle prossime sezioni, è stato sviluppato per un ente pubblico e costituisce una partizione di
un sistema più grande. Non deve essere considerato come un prodotto a sé stante; bensì come
un fondamentale ingranaggio di un meccanismo più vasto e complesso.

3.1.2    Descrizione del prodotto
Il progetto ha come scopo la realizzazione di:
    ∗ Una rete blockchain di almeno due nodi;
    ∗ Uno smart contract che consenta la registrazione nella blockchain di un atto di vendita
      relativo ad un bene.
In sintesi, il sistema desiderato dovrà registrare le informazioni relative ad un bene, le anagrafiche
del suo possessore, del suo acquirente ed il relativo atto di vendita.

3.2     Studio tecnologico
Lo studio inizia descrivendo la tecnologia blockchain, le sue peculiarità, le tipologie esistenti
e gli ambiti di utilizzo. Si proseguirà illustrando la tecnologia permissionless di Ethereum e
quella permissioned di Hyperledger Fabric, che avrà un capitolo dedicato.

                                                  9
10                                              CAPITOLO 3. DESCRIZIONE DELLO STAGE

3.2.1     Blockchain
Caratteristiche
La tecnologia blockchain è un database distribuito, decentralizzato ed immutabile, composto
da una sequenza concatenata di informazioni suddivise in strutture dati chiamate blocchi. Un
blocco appena inserito possiede un riferimento di tipo hash al blocco che lo precede ed, una
volta inserito, non è possibile modificarlo od eliminarlo in un secondo momento.
    Si definisce peer ogni utente che partecipa alla creazione di nuovi blocchi (miner) oppure
alla validazione degli stessi (validator). L’insieme dei peer di una blockchain forma una rete
peer-to-peer in cui non esiste un’entità centrale che svolge il ruolo di amministratore: l’integrità
e la validità dei dati sono garantite da specifici algoritmi di consenso, di cui si parlerà nella
sezione 3.2.1.
    Ogni peer possiede una copia del libro mastro (ledger) contenente tutte le transazioni
avvenute nell’intero ciclo di vita della blockchain. Il ledger di un peer è considerato valido solo
se identico ai ledger del 50% + 1 dei peer sulla stessa blockchain: è facile rendersi conto che
in una rete pubblica si deve rendere la modifica di uno o più blocchi estremamente difficoltosa
in termini computazionali e svantaggiosa in termini economici. Per questa precisa motivazione
il metodo di creazione dei blocchi più usato dalle blockchain permissionless è il Proof-of-Work
(PoW). Se un blocco dovesse essere modificato, allora anche il suo hash e quello di tutti i
blocchi successivamente creati dovrebbe essere ricalcolato.
    La blockchain, di conseguenza, vanta un alto grado di sicurezza in termini di protezione da
contraffazioni ed è ritenuta la scelta prediletta per l’implementazione del caso d’uso presentato.

Consenso
Si definisce consenso il processo di sincronizzazione delle transazioni attraverso i nodi della
rete atto ad assicurare che le diverse copie del ledger siano aggiornate solo quando le transazioni
sono effettivamente approvate.
    Le transazioni devono essere scritte su ogni copia del ledger nello stesso ordine, stabilito in
maniera univoca. Questa esigenza obbliga i nodi della blockchain ad aderire ad un accordo
comune, stabilito al momento della creazione della stessa. A questo fine vengono utilizzati
diversi algoritmi di consenso, aventi le seguenti proprietà:

     ∗ Integrità: ogni partecipante della rete effettua al più una scelta.

     ∗ Validità: un peer sceglie sempre un valore proposto da un altro partecipante;

     ∗ Accordo: tutti i peer scelgono lo stesso valore corretto;

     ∗ Terminazione: tutti i peer concordano un valore in un tempo finito.

In una rete blockchain pubblica e permissionless è necessario che tutti i peer abbiano una copia
identica del ledger. Poiché è fondamentale che i blocchi generati rispecchino in modo veritiero
le transazioni che avvengono su tale rete, vengono utilizzati diversi algoritmi che definiscono
come debbano essere generati i blocchi da inserire in coda alla blockchain.

Il problema dei generali bizantini
I sistemi informatici distribuiti, per essere considerati affidabili, devono gestire eventuali
anomalie di componenti mal funzionanti poiché c’è il rischio che possano fornire informazioni
contrastanti a diverse parti del sistema.
3.2. STUDIO TECNOLOGICO                                                                           11

   Questa situazione può essere espressa in modo astratto come problema dei generali bizantini,
formalizzato come segue:

      Un gruppo di generali dell’esercito bizantino è accampato con le loro truppe intor-
      no a una città nemica. Comunicando solo tramite un messaggero, i generali devono
      concordare un piano di battaglia comune. Tuttavia, uno o più di essi possono
      essere traditori che cercheranno di confondere gli altri.

Si deve disporre di un algoritmo per garantire le seguenti condizioni:

 (A) Tutti i generali leali decidono lo stesso piano d’azione (determinismo).
     I generali leali seguiranno ciò che l’algoritmo deciderà; allo stesso modo i traditori
     possono fare tutto ciò che desiderano.

L’algoritmo deve garantire la condizione (A) indipendentemente da ciò che fanno i traditori. I
generali leali non dovrebbero solo raggiungere un accordo, dovrebbero anche concordare un
piano ragionevole;

 (B) Un numero limitato di traditori non può indurre i generali leali ad adottare un piano
     negativo.

Il problema è trovare un algoritmo per garantire che i generali leali raggiungano un accordo. È
dimostrato che, usando solo messaggi orali, questo problema è risolvibile se e solo se più di
due terzi dei generali sono leali; così un singolo traditore può confondere due generali leali.
Con messaggi scritti falsificabili, il problema è risolvibile per qualsiasi numero di generali e
possibili traditori. [5] Nei sistemi distribuiti, la capacità degli algoritmi di risolvere il problema
sopra descritto viene indicata come Byzantine Fault Tolerance (BFT).
    È plausibile considerare che alcuni partecipanti ad una rete blockchain possano avere
intenzioni che mirino a ledere il benestare di uno o più fruitori. Alcuni, ad esempio, potrebbero
tentare di modificare le informazioni contenute in uno o più blocchi al fine di trarre vantaggi
economici, molto spesso a discapito di altri. La tecnologia blockchain è un registro distribuito
e non amministrato da alcuna autorità centrale: senza un algoritmo BFT un nodo potrebbe
essere in grado di trasmettere transazioni false. Queste sarebbero così registrate nelle copie dei
registri degli altri nodi, mettendo in pericolo l’affidabilità della rete.

Proof-of-Work
Una blockchain permissionless deve essere in grado di evitare la modifica dei blocchi, pena la
sua inaffidabilità. Per far fronte a questo problema è stato introdotto il concetto di generazione
dei blocchi attraverso complessi problemi matematici, la cui risoluzione richiede un grande
sforzo computazionale e un grosso dispendio di tempo ed energia: il Proof-of-Work.
    Questa metodologia comporta la ricerca di un valore che, una volta sottoposto ad una
funzione hash, restituisca un ulteriore hash che inizia con un certo numero di bit a zero. Il
lavoro medio richiesto è esponenzialmente proporzionale al numero di bit a zero richiesti e può
essere verificato immediatamente. Si adotta un valore hash con un numero selezionabile di
bit a zero al fine di non ipersemplificare la sua generazione, dal momento che l’avanzamento
tecnologico offre calcolatori di potenza crescente. Il nodo che riesce a trovare il valore hash
corretto prima degli altri crea il blocco: esso verrà aggiunto in coda alla blockchain e riceverà
un compenso sotto forma di valuta virtuale, chiamata cripto-valuta.
    L’algoritmo Proof-of-Work non risolve in modo ottimo la Byzantine Fault Tolerance ma
offre al contempo una delle implementazioni più sicure ed affidabili per le reti blockchain. [6].
12                                             CAPITOLO 3. DESCRIZIONE DELLO STAGE

Proof-of-Stake
In una tradizionale blockchain Proof-of-Work, i miners votano su quali transazioni sono arrivate
a che ora e più si dispone di potenza della CPU, più aumenta l’autorità esercitata sulla rete: è
necessaria una forza computazionale ed un dispendio di tempo ed energia non banali. Proof-
of-Stake segue un paradigma simile: le parti interessate esercitano il voto ma lo fanno con la
valuta interna di quel particolare sistema. Ogni account ha una certa possibilità al secondo di
generare un blocco valido, proprio come una componente hardware adibita al mining, e questa
possibilità è proporzionale al saldo del conto. Una formula molto semplice per raggiungere
questo scopo è la seguente:
                                                                             balance
              SHA256(prevhash + address + timestamp) ≤ 2256 ×                 dif f

dove:
     ∗ prevhash è il valore hash del blocco precedente;
     ∗ address è l’indirizzo del nodo miner;
     ∗ timestamp è il formato data corrente di Unix in termini di secondi;
     ∗ balance è il bilancio del nodo miner;
     ∗ diff è un parametro globale modificabile di difficoltà.
Se un miner soddisfa la precedente equazione può generare un blocco valido, ricevendo una
ricompensa in termini di cripto-valuta. Una conseguenza immediata di questo approccio è che
il peer avente il balance maggiore ottiene il controllo della rete: per questo viene implementato
un algoritmo che sceglie in maniera pseudo-casuale ma comunque proporzionale allo stake,
cioè alla «posta in gioco», l’account da premiare.
    Nel caso in cui la rete peer-to-peer rilevi una manomissione nel blocco appena generato
allora l’investimento non sarebbe più ritornato e l’utente viene estromesso dalla rete. Tuttavia,
questo algoritmo di consenso è difficile da implementare e le sue attuali implementazioni non
sono ancora mature per essere utilizzate in reti pubbliche [2].

Fork
Nell’ambito delle blockchain permissionless, quindi accessibili pubblicamente, chiunque può
partecipare al processo di consenso approvando o rifiutando l’ordine in cui sono state registrate
le transazioni. Al fine di stabilire e di rendere inequivocabile tale ordine, è necessario un
approccio di tipo probabilistico poiché due o più nodi potrebbero avere un’opinione differente
su quale blocco sia stato generato prima. È una condizione che si verifica specialmente quando
due blocchi vengono generati nello stesso istante o in un intervallo di tempo non misurabile dal
sistema. Questa condizione negativa viene definita come soft fork ed ogni rete blockchain attua
diversi protocolli per sanare tale situazione di inconsistenza.
Gli sviluppatori di una blockchain possono decidere di eseguire un fork manualmente, ad
esempio per aggiornare protocolli o cambiare l’algoritmo di consenso. Questa situazione
prende il nome di hard fork.

Blockchain per realtà enterprise
Con l’aumentare della popolarità di Bitcoin ed Ethereum è cresciuto anche l’interesse per tutte
le tecnologie che derivano da esse, ovvero le funzionalità di base della blockchain e le ÐApps.
Tuttavia, molti contesti aziendali richiedono caratteristiche prestazionali che le tecnologie
3.2. STUDIO TECNOLOGICO                                                                       13

blockchain permissionless non sono attualmente in grado di offrire, senza contare che in molti
casi d’uso conoscere l’identità dei partecipanti, limitare l’accesso alla rete e rendere alcune
transazioni private è un requisito fondamentale. L’uso di blockchain da parte di aziende private
è in costante crescita, tuttavia le esigenze possono essere significativamente diverse se non
addirittura in collisione con la politica delle blockchain permissionless. Ad esempio, l’accesso
alla rete aziendale deve avvenire previa identificazione ed è limitato ai soli utenti autorizzati,
cosa che una blockchain pubblica come Bitcoin od Ethereum non può fornire per costruzione,
poiché alla creazione di un nuovo account viene assegnato un valore hash pseudo-casuale.
Le transazioni dovrebbero essere portate a compimento e verificate in meno di un minuto,
mentre in una blockchain permissionless una transazione impiega diversi minuti per essere
incorporata in un blocco a causa del consenso Proof-of-Work; stessa cosa dicasi della conferma
di transazione, senza contare che il movimento di cripto-valuta sarebbe visibile pubblicamente,
anche se cifrato.
    Da qui nasce l’idea di sviluppare una blockchain permissioned, ovvero un sistema che
mantenga i benefici di una blockchain introducendo peculiarità che soddisfino le esigenze
del settore enterprise. Ad esempio, istituendo una rete non accessibile pubblicamente i cui
partecipanti sono identificati, che assicura privacy dei dati, transazioni quasi immediate e basso
ritardo della conferma.
In questo tipo di blockchain l’utilizzatore della rete può intraprendere solo le azioni che gli
è permesso eseguire, richiamare solo gli smart contract a lui associati oppure, a valle di una
autenticazione, esercitare i privilegi di amministratore.

Consenso in ambito permissioned
Le blockchain permissionless come Bitcoin ed Ethereum hanno cripto-valuta nativa per in-
centivare il mining delle transazioni che attualmente esso avviene mediante Proof-of-Work.
Quest’ultimo, tuttavia, presenta diversi svantaggi che comportano una sensibile latenza di
conferma delle transazioni e un basso numero di transazioni al minuto. Questi fattori rendono le
blockchain pubbliche non adatte ad un utilizzo a livello aziendale. Nelle catene permissioned il
consenso è definito come la verifica a tutto tondo della correttezza di un insieme di transazioni
comprendente un blocco. Occorrono quindi nuove architetture di rete e nuovi algoritmi per il
raggiungimento del consenso. La scelta dominante in questo settore prevede che il consenso
sia ottenuto tramite protocolli a votazione, che assicurano elevate performance.
Capitolo 4

Studio di fattibilità blockchain

Nel presente capitolo si affronta lo studio di fattibilità riguardante la tecnologia blockchain,
a partire dalla scelta della piattaforma ed a seguire alla selezione del linguaggio di pro-
grammazione degli smart contract. Lo studio di fattibilità inizia con la descrizione delle
due tecnologie prese in esame, Ethereum ed Hyperledger Fabric, mettendole in relazione
ai requisiti che dovranno soddisfare. Si proseguirà quindi con l’elencare i pregi e difetti
derivanti da ciascuna scelta. Verrà infine spiegato il motivo che ha portato a scegliere
Hyperledger Fabric come piattaforma blockchain e Java come linguaggio di programmazione
per il chaincode.

4.1     Sintesi dello studio di fattibilità
4.2     Ethereum

                                 Figura 4.1: Logo di Ethereum

Ethereum è una blockchain globale permissionless ed open source per il software decentraliz-
zato, le ÐApps. Le transazioni modificano la Ethereum Virtual Machine (EVM), una macchina
virtuale distribuita in grado di eseguire codice, il quale rappresenta le transazioni e la cui
esecuzione causa transazioni di cripto-valuta, in questo caso l’Ether. EVM è pensata per essere
turing-complete, ovvero per eseguire le stesse operazioni di una macchina di Turing con tempo
e memoria finiti: in altre parole, di eseguire algoritmi.

                                              15
16                                      CAPITOLO 4. STUDIO DI FATTIBILITÀ BLOCKCHAIN

4.2.1     Smart contract
La possibilità di eseguire codice sorgente tramite la EVM ha permesso ad Ethereum di di-
stinguersi dalle altre blockchain in quanto, oltre alle transazioni di Ether, è possibile scrivere
dei programmi eseguibili automaticamente noti con il nome di smart contract. Uno smart
contract permette di costruire una logica specifica attorno ad una transazione, crearne di nuove,
verificare certe condizioni oppure memorizzare i dati inseriti da utenti o da altri smart contract.
    Un esempio di applicazione degli smart contract è la gestione della proprietà intellettuale.
Ogni volta che un contenuto viene utilizzato a fini commerciali, ad esempio una canzone, il
proprietario dei diritti di quella canzone riceve una commissione. Molto spesso più parti sono
coinvolte nella creazione di una canzone e può essere difficile capire chi possiede questi diritti,
a chi spetta il pagamento e in che misura.
Gli smart contract possono garantire che i diritti vadano ai destinatari previsti, registrando
le proprietà intellettuali in una piattaforma blockchain. Il fruitore della canzone versa una
determinata somma allo smart contract, che provvederà a redistribuirla nei wallet degli autori
nella misura concordata.
    Dall’esempio presentato si evince la volontà di eliminare qualsiasi intermediario ed evitare
controversie. Di fatto, lo smart contract agisce in modo imparziale e non subisce il controllo di
nessun ente: esso viene eseguito automaticamente, assicurando che le condizioni contenute al
suo interno vengano rispettate.

4.2.2     Linguaggi di programmazione degli smart contract

         Figura 4.2: Logo di Solidity                           Figura 4.3: Logo di Vyper

I principali linguaggi di programmazione messi a disposizione per Ethereum sono due: Solidity
e Vyper.
Solidity è un linguaggio ad oggetti statically typed: il tipo delle variabili è dichiarato e quindi
determinato a tempo di compilazione, come C, C++ o Java. Supporta l’ereditarietà, l’uso di
librerie e la definizione di oggetti complessi definiti dall’utente[8].
     Vyper viene definito come linguaggio contract-oriented. Nato successivamente a Solidity
si trova ancora in fase di sviluppo ma promette di avere le seguenti caratteristiche[12]:

     ∗ Controllo di limiti e overflow sugli accessi di array e sul livello aritmetico;

     ∗ Supporto per numeri interi con segno e numeri decimali in virgola fissa;

     ∗ Decidibilità: dovrebbe essere possibile calcolare un limite superiore preciso per il
       consumo di gas di qualsiasi chiamata di funzione;
4.3. HYPERLEDGER FABRIC                                                                         17

    ∗ Supporto per le unità avanzate, come ad esempio timestamp, timedelta, secondi, wei,
      wei al secondo, metri al secondo al quadrato).
Ciò che accomuna i due linguaggi di programmazione è la semplicità data dall’obbligo di
interazione con la EVM: essa infatti dispone di limitata capacità computazionale, caratteristica
che influisce anche sui linguaggi con cui si relaziona.

4.2.3    Gas
La peculiarità del software decentralizzato di Ethereum, chiamato smart contract, è che richie-
de qualcosa in cambio per essere eseguito. I miner sono responsabili dell’inclusione delle
transazioni all’interno dei blocchi che generano; per farlo devono utilizzare la loro potenza
computazionale per convalidare gli smart contract. Il concetto di gas consente loro di addebitare
una determinata tariffa, conosciuta come miner’s fee che aiuta ad incentivare i miner a prendere
parte attiva nel sistema Ethereum.
    Viene utilizzato il concetto di gas per separare semanticamente l’Ether, che ha valore
monetario variabile, con il costo effettivo indispensabile all’esecuzione di uno smart contract,
che invece rimane sempre lo stesso. Un’analogia utile è data dal prezzo di un determinato
carburante, variabile nel tempo e dai litri dello stesso carburante necessari per viaggiare da una
località ad un’altra, che invece rimane una quantità fissa.

4.3     Hyperledger Fabric

                              Figura 4.4: Logo di Hyperledger Fabric

4.3.1    Descrizione
Hyperledger Fabric è una piattaforma open source permissioned che implementa la tecnologia
di registro distribuito, progettata per l’uso in contesti aziendali. Fabric fa parte di Hyperledger,
un progetto open source creato nel 2015 per far avanzare le tecnologie blockchain in più settori,
ospitata dalla Linux Foundation.
Hyperledger Fabric è mantenuta da sviluppatori di almeno trentacinque organizzazioni diverse
e la sua community di sviluppo conta, al momento della scrittura di questa tesi, più di duecento
collaboratori in tutto il mondo.
     Fabric dispone di un’architettura modulare e configurabile che promette innovazione, versa-
tilità ed ottimizzazione per numerosi casi d’uso in campo aziendale: realtà operanti in settori
come il bancario, finanziario, assicurativo, sanitario, risorse umane e fornitura utilizzano già
questo framework per gestire ed amministrare il loro business.
Fabric è la prima piattaforma a registro distribuito che permette lo sviluppo di smart contract
18                                   CAPITOLO 4. STUDIO DI FATTIBILITÀ BLOCKCHAIN

scritti in linguaggi di programmazione popolari come Java, Go e JavaScript, permettendo alla
maggior parte delle aziende di sviluppare applicazioni anche senza conoscere linguaggi specifici
di un determinato dominio, come avviene ad esempio con Vyper o Solidity in Ethereum.
    La blockchain generata con Fabric, essendo permissioned, non necessita di Proof-of-Work
o di potenti calcoli computazionali: il consenso è ottenuto tramite votazione e la presenza di
una cripto-valuta per incentivare il mining dei blocchi non è necessaria, rendendo il costo di
un’istanziazione della piattaforma molto simile ad un tradizionale sistema distribuito. [3].

4.3.2    Architettura
Ledger
In Hyperledger Fabric, un ledger consiste di due parti distinte ed in stretta relazione tra di loro:
la world state e la blockchain.

                       Figura 4.5: Struttura del ledger in Hyperledger Fabric

    La world state detiene il valore corrente dell’insieme di oggetti di business contenuti nella
blockchain, identificato univocamente come stato del ledger. In questo modo le applicazioni
che richiedono lo stato corrente di un oggetto possono interrogare direttamente la world state,
anziché scorrere l’intera blockchain alla ricerca dei dati desiderati. È implementata come un
database per offrire un vasto insieme di operazioni, dalle interrogazioni sui dati alla memoriz-
zazione degli stessi.
Le applicazioni inviano transazioni che apportano modifiche alla world state e queste transazioni
finiscono per essere scritte nella blockchain del ledger. Le applicazioni sono isolate dai dettagli
di questo meccanismo di consenso da una apposita SDK: invocano semplicemente uno smart
contract e vengono avvisati quando la transazione è stata inclusa nel ledger, nel caso in cui sia
valida.
    Mentre la world state contiene l’insieme aggiornato di valori degli oggetti di business, la
blockchain funge da registro cronologico delle transazioni: essa contiene tutte le transazioni
avvenute e tutti gli stati in cui si è trovato la world state. Fornisce quindi uno strumento di
tracciamento delle versioni della world state, comprensivo anche delle transazioni che hanno
causato un cambio di stato.
La blockchain è strutturata come un log sequenziale di blocchi interconnessi, in cui ogni blocco
contiene una sequenza di transazioni che hanno letto o modificato la world state. Ogni blocco
4.3. HYPERLEDGER FABRIC                                                                                       19

possiede un header, il quale contiene un valore hash della transazione che lo ha generato
assieme al valore hash del blocco precedente; un body che contiene le transazioni registrate in
modo ordinato più un ulteriore blocco di “metadati”, quali timestamp, certificati di sicurezza,
chiave pubblica e firma di chi ha operato la generazione del blocco [3].

Peer
Una rete blockchain è composta primariamente da un insieme di nodi peer, che detengono uno
o più ledger e talvolta anche diversi smart contract. Un peer espone un insieme di API che
permettono agli amministratori e alle applicazioni di interagire con i servizi che offre e può
essere creato, avviato, fermato, riconfigurato o eliminato in qualsiasi momento. Un peer può
assumere diversi ruoli, descritti come segue.

Committing peer: ogni nodo che fa parte di almeno un canale. Esso riceve blocchi generati
in seguito a transazioni e, se ritenuti validi, procede a marcarli come tali. Se tutti i committing
peer validano un blocco allora esso entra a far parte del ledger di tutti i nodi di quel canale.

Endorsing peer: un nodo che ha uno smart contract installato e che pone la sua personale fir-
ma digitale sulle transaction response. Questo meccanismo è noto con il nome di endorsement
procedure e sarà trattato nelle sezioni successive.

Leader peer: il nodo responsabile dell’organizzazione di cui fa parte e che ha lo scopo di
distribuire i blocchi ordinati dall’orderer ai Committing peer del canale.

Anchor peer: nodo adibito alla comunicazione con altre organizzazioni presenti nello stes-
so canale e che contribuisce all’applicazione del protocollo conosciuto come gossip data
dissemination protocol.

Orderer: tipologia speciale di peer che non contiene smart contract e stabilisce l’ordine delle
transazioni avvenute nei canali, mantenendo consistente il ledger degli altri peer.
Il nodo orderer adotta una politica di tipo FIFO1 e svolge una funzione cruciale poiché evita
l’inconveniente denominato Fork, trattato nella sezione 3.2.1.

Canali
Un canale è una sotto-rete di comunicazione riservata tra due o più specifici partecipanti alla
rete, adibito alla conduzione di transazioni private e confidenziali. Ogni peer sottoscrive una
transazione nel canale in cui è autorizzato ad accedere, in caso contrario la transazione viene
rigettata ed il world state non subisce modifiche.
    Un peer può partecipare a più canali e possiede un ledger per ogni canale a lui associato:
nessuna informazione appartenente ad un ledger può essere recuperata da un canale esterno. La
separazione di peer e ledger operata dai canali permette ai membri della rete che necessitano di
riservatezza di coesistere con i loro competitors nella stesse rete blockchain.
È possibile configurare i canali specificando le organizzazioni che ne usufruiranno e che
eventualmente potranno inserire a loro volta altre organizzazioni: diventa così possibile definire
due tipologie di privilegi sul canale. Nondimeno, esiste un canale speciale creato al momento
   1 First In First Out: l’ordine di arrivo delle transazioni concide con l’ordine con cui saranno memorizzate nei

blocchi.
20                                   CAPITOLO 4. STUDIO DI FATTIBILITÀ BLOCKCHAIN

dell’istanziazione della piattaforma chiamato canale di sistema ed utilizzato dall’ordering
service, descritto nelle sezini successive.

Membership Service Provider
I peer partecipanti ad una rete Hyperledger Fabric sono titolari di un’identità digitale formaliz-
zata con un certificato X.509, che permette di determinare i permessi di accesso alle risorse ed
alle informazioni presenti nella rete. In Fabric, l’attributo che identifica univocamente un peer
e che unisce l’identità dello stesso con i suoi permessi prende il nome di principal. Per essere
verificabile un’identità digitale deve essere rilasciata da un’autorità affidabile, che può essere
di tipo pubblico o di tipo privato. Questa autorità, in Fabric, prende il nome di Certificate
Authority (CA) e rappresenta un ente di terza parte abilitato a rilasciare un certificato digitale.
    Il bisogno di stabilire quali siano le CA affidabili ha portato alla definizione di un ulteriore
componente specifico: il Membership Service Provider (MSP), che si occupa anche di identifi-
care i ruoli specifici che i partecipanti alla rete ricoprono nel contesto di questa organizzazione.
Il MSP rappresenta la rete così definita, precisando i privilegi di accesso dei canali e, più
generalmente, della rete.

Chaincode e smart contract
Gli smart contract definiscono la logica di business eseguibile che genera nuove informazioni
da inserire all’interno del ledger, mentre con chaincode ci si riferisce tipicamente a insiemi di
smart contract raggruppati in base a logiche simili. In particolare, uno smart contract definisce
le regole di interazione tra organizzazioni diverse attraverso codice eseguibile: le applicazioni
invocano uno smart contract per generare transazioni, che saranno inserite nel ledger di tutti i
partecipanti al canale in cui è stato istanziato il chaincode contenente lo smart contract invocato.
Ad esempio, uno smart contract potrebbe garantire che la consegna di una nuova auto venga
effettuata entro un periodo di tempo specificato o che i fondi vengano rilasciati secondo i termini
prestabiliti, migliorando in questo modo il flusso di merci o di capitale.
     In Hyperledger Fabric, molto spesso si usano i termini smart contract e chaincode in modo
intercambiabile. In generale, uno smart contract definisce la logica di transazione che controlla
il ciclo di vita di un oggetto di business contenuto nella world state; esso viene quindi incapsulato
in un chaincode in modo da poter essere rilasciato nella rete blockchain. In altre parole, gli smart
contract sono le transazioni che modificano il ledger mentre il chaincode è la componente che
regola il modo in cui gli smart contract vengono messi in package, pronti per essere distribuiti
fra i peer dello stesso canale.
Naturalmente, uno smart contract può accedere alle informazioni presenti nel ledger: nello
specifico può eseguire operazioni di inserimento ed eliminazione di elementi nella world state
ed interrogazioni, sia alla world state che alla blockchain.
     Associata ad ogni chaincode c’è una politica di endorsement, applicata agli smart contract
definiti con essa, la quale indica quali organizzazioni nella rete debbano firmare una transazione
generata da uno smart contract affinché tale transazione sia considerata valida. Ad esempio,
una politica di endorsement può dichiarare che una transazione necessiti di essere firmata da tre
organizzazioni che partecipano alla stessa rete prima di essere considerata valida. È importante
sottolineare che tutte le transazioni, valide o non valide, vengono aggiunte alla blockchain del
ledger ma solo quelle valide aggiornano la world state.
Le politiche di endorsement sono ciò che rende Hyperledger Fabric diversa dalle altre blockchain
come Ethereum o Bitcoin: in questi sistemi una transazione valida può essere generata da ogni
nodo nella rete. Fabric, a differenza, modella la tecnologia blockchain per adattarla alle esigenze
4.3. HYPERLEDGER FABRIC                                                                          21

aziendali: le transazioni devono essere validate da organizzazioni riconosciute e ritenute sicure
ed affidabili.
    La piattaforma Fabric possiede un chaincode di sistema adibito alla riduzione dei costi di
comunicazione gRPC tra peer e chaincode e, al momento della stesura di questa tesi, svolge
mansioni di gestione del ciclo di vita del chaincode, gestione della configurazione dei canali ed
esposizione di API per l’interrogazione dei ledger.
    Il ciclo di vita di un chaincode è descritto come segue: il codice sorgente, presente nel file
system di un endorsing peer, viene installato lanciando un opportuno comando da terminale.
Anche se installato, un chaincode non è ancora utilizzabile dai partecipanti della rete: occorre
lanciare il comando di istanziazione da terminale, in questo modo esso viene installato in tutti i
peer che partecipano allo stesso canale, diventando disponibile ed eseguibile.
Ogni chaincode istanziato può essere aggiornato tramite una procedura simile all’istanziazione:
l’aggiornamento viene notificato e succesivamente installato in tutti i peer del canale e le
successive invocazioni di uno smart contract incapsulato nel suddetto chaincode verrà indirizzato
automaticamente alla nuova versione.

Ordering service
Nell’ambito delle blockchain permissionless, come ad esempio Ethereum e Bitcoin, ogni nodo
può partecipare al processo di consenso che consiste nell’ordinamento delle transazioni e nella
scrittura delle stesse in blocchi concatenati. Si è quindi costretti a fare affidamento ad algoritmi
che determinino la sequenza delle transazioni in modo probabilistico; da tali algoritmi non è
assicurato il determinismo poiché due o più peer possono avere una visione diversa sull’ordine
delle transazioni. Questa circostanza negativa è conosciuta come Fork, illustrata nella sezione
3.2.1.
    Hyperledger Fabric funziona diversamente: fornisce un nodo speciale chiamato orderer
che orchestra l’ordinamento delle transazioni. Questo processo prende il nome di ordering
service e vi prendono parte tutti gli orderer relativi alle diverse organizzazioni esistenti nella
rete. Questo assicura:

    ∗ determinismo, poiché ogni blocco che viene validato da un peer è considerato finale e
      corretto dal momento che viene generato dall’orderer, eliminando il rischio di Fork;

    ∗ efficienza di performance e scalabilità, poiché la separazione delle responsabilità di
      endorsing del chaincode e di ordering delle transazioni elimina possibili colli di bottiglia
      che possono verificarsi quando esecuzione del chaincode e ordinamento delle transazioni
      sono operate dallo stesso nodo.

Gossip Data Dissemination Protocol
Come detto nella precedente sezione, Fabric opera un disaccoppiamento delle responsabilità
dividendo il carico di lavoro tra esecuzione delle transazioni ed ordinamento delle stesse, la
prima operata dagli endorsing e committing peer mentre la seconda dai nodi orderer. Serve, a
questo punto, un protocollo di propagazione delle informazioni che sia affidabile, scalabile e
che assicuri la consistenza dei dati: il Gossip Data Dissemination Protocol2 . Tale protocollo
pone le sue fondamenta sullo scambio continuo di messaggi, contenenti informazioni circa
lo stato del ledger e la firma del peer che ha inviato il messaggio, tra i nodi facenti parte
dello stesso canale. In questo modo, i peer che intendono falsificare messaggi sono facilmente
identificabili e coloro che perdono o ricevono in ritardo un messaggio aggiorneranno il loro
  2 d’ora   in poi riferito come protocollo gossip
Puoi anche leggere