Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
“MOFICARE”.
Una guida completa per la realizzazione di Pete’s Pet Shop è presente su:
http://truffleframework.com/tutorials/pet-shop. [20]
2.4.3.1.1 Adoption.sol
Il file Adoption.sol è uno smart contract scritto in Solidity ed è responsabile di
tracciare le adozioni, corrisponde alla logica di back-end e di archiviazione
sulla blockchain. Di seguito è riportata la sua implementazione:
pragma solidity ^0.4.17;
contract Adoption {
address[16] public adopters;
// Adotta un animale
function adopt(uint petId) public returns (uint) {
require(petId >= 0 && petId <= 15);
31
adopters[petId] = msg.sender;
return petId;
}
// Recupera adottatori
function getAdopters() public view returns (address[16]) {
return adopters;
}
}
Nella prima riga, mediante il comando pragma, è indicata la versione minima di
Solidity da utilizzare, un’informazione che interesserà esclusivamente il
compilatore.
In seguito alla definizione del nome del contratto viene dichiarata una variabile
address[16] public adopters. Essa è pubblica e corrisponde ad un array
contenente una serie di indirizzi Ethereum, quelli degli adottatori.
La funzione adopt è publica e parametrizzata, consente passandogli
l’identificativo dell’animale (petId) da adottare di associarlo all’indirizzo del
suo nuovo padrone. Il comando require è utilizzato per stabilire delle
condizioni necessarie per proseguire nell’esecuzione, in questo caso che l’id
ricevuto sia un numero tra zero e quindici (questo perché gli animali all’interno
del negozio sono sedici). La msg.sender consente di recuperare l’indirizzo
Ethereum dell’utente che ha richiamato la funzione, questa è poi inserita nella
posizione petId dell’array adopters. La funzione ritorna l’id ricevuto come
parametro in modo da segnalare la sua corretta terminazione.
La getAdopters() è una funzione pubblica e consente di restituire nella sua
interezza l’array adopters. Il comando views specifica che tale funzione non
andrà a scrivere sulla blockchain ma esclusivamente a leggere.
2.4.3.1.2 Esecuzione
Una volta aperta la DApp all’interno di un browser correttamente configurato
verranno visualizzati i sedici animali, ad una prima esecuzione saranno tutti
sprovvisti di un proprietario, dunque adottabili.
Ciascun animale possiede un id che permette di identificarlo univocamente, per
ognuno di essi è possibile visualizzare informazioni quali:
32
- nome;
- razza;
- anni;
- posizione.
Ad ogni animale del Pete’s Pet Shop sarà inoltre associato un pulsante “Adopt”
che ne consonetirà l’adozione.
Parte della schermata principale di Pete’s Pet Shop
Figura 2.9:
Una prima visibile interazione con lo smart contract Adoption.sol avviene nel
momento in cui si preme il pulsante di adozione, in quell’istante infatti viene
richiamata la funzione adopt(uint petId) dove il parametro equivale all’id
dell’animale in questione.
Se si utilizza un browser come Chrome, Mozilla o Opera con l’estensione
MetaMask (plugin mostrato presentato nel quarto capitolo) verrà
automaticamente richiesto di approvare la transazione prima di iniziare la
scrittura su blockchain, questo perché l’operazione di scrittura ha un costo in
ether per chi manda il messaggio (figura 2.10). Nel caso in cui non si possegga
una quantità di ether sufficiente la transazione verrà rifiutata.
Una volta fatto click su invia sarà possibile vedere, accanto all’animale
adottato, il pulsante di adozione disabilitato e la scritta “Success”, questo grazie
alla funzione getAdopters(). Questa permette infatti di disattivare i pulsanti
laddove all’interno dell’array restituito è presente un indirizzo diverso da quello
nullo. 33
Schermata di adozione avvenuta con successo
Figura 2.11:
La transazione è dunque completata, questo consentirà a Pete di archiviare in
maniera efficace le adozioni del suo negozio sulla blockchain con tutti i
vantaggi del caso. 34
Capitolo 3 - Metodologia
35
3.1 ICO
La sigla ICO è l’acronimo di Initial Coin Offering, che tradotto letteralmente in
italiano significa offerta di moneta iniziale. Anche nota come IPCO (Initial
Public Coin Offering) è un mezzo con cui vengono raccolti fondi per una nuova
impresa: crowdfunding. In estrema sintesi altro non è che una nuova forma di
finanziamento utilizzata da startup o da soggetti che intendono realizzare un
progetto su blockchain. Una ICO è utilizzata dalle startup per aggirare il
rigoroso e regolamentato processo di raccolta di capitali. In una campagna di
questo tipo, una percentuale di monete associate al progetto viene venduta ai
suoi sostenitori in cambio di Ether o Bitcoin. Queste monete virtuali, dette
token, sono simili a delle azioni societarie.[12]
Il primo passo necessario per una startup che vuole raccogliere fondi tramite
una Initial Coin Offering è di solito quello di creare un piano su un white paper.
Tale documento serve a presentare e descrivere il progetto: di cosa si tratta,
quali necessità soddisferà al completamento, il capitale necessario per
intraprendere l'impresa, quanti token gli investitori del progetto manterranno
per sé, i metodi di investimento e la durata della campagna. Se i requisiti di
fondi sono soddisfatti entro le tempistiche previste, verrà avviato il nuovo
schema, al contrario se il capitale raccolto non soddisfa i fondi minimi richiesti,
verrà restituito ai sostenitori e la ICO sarà considerata non riuscita.
Come strumento di finanziamento, le ICO stanno realizzando numeri notevoli:
tra il 2016 e il 2017 sono stati raccolti oltre 300 milioni di dollari in
finanziamenti. Tuttavia i rischi di investimento sono evidenti a causa di una
mancanza di trasparenza: le attuali ICO non vengono infatti valutate prendendo
in considerazione parametri finanziari tradizionali, ma sulla base di una
promessa futura. Il fenomeno dunque necessita ancora di maggiore
regolamentazione, di modo da tutelare eventuali investitori.
3.1.1 Token
Le criptovalute sono un esempio calzante di come una valuta virtuale basata su
blockchain possa essere distribuita sul mercato, sebbene soggetta a molte
limitazioni dovute alla mancanza di una chiara regolamentazione.
Le criptovalute delineano solo l'inizio di una rivoluzione, il cui secondo step è
rappresentato dai token. Nonostante i token abbiano molte analogie con le
36
criptovalute, il loro scopo è ben più ampio. Essi sono più di una valuta perché
possono essere utilizzati in una gamma più vasta di applicazioni e la maggior
parte di essi fa affidamento sul protocollo blockchain di Ethereum che, secondo
il parere degli esperti, è più completo di altri.
William Mougayar definisce un token [8]
“un'unità di misura di valore creata da un'organizzazione per auto-governare
il proprio modello di business e consentire agli utenti di interagire con i
prodotti, facilitando al tempo stesso la distribuzione e la condivisione di premi
e benefici a tutti i suoi stakeholder”.
Dunque un token non è altro che un nuovo termine per fare riferimento a
un'unità di valore emessa da un'entità privata su un protocollo esistente, ciò li
rende più facili da implementare. I token rappresentano un asset o un’ utility e
possono essere classificati nelle seguenti categorie [8]:
- security token: considerati dei veri e propri asset sono soggetti a severe
regolamentazioni e normative. Rappresentano partecipazioni in termini di
dividendi, diritti di voto, tassi di interessi e/o percentuale sugli utili.
Il loro utilizzo più comune è quello di rappresentare beni e proprietà, proprio
come delle azioni;
- utility token: a differenza dei security token non nascono come una forma di
investimento, pertanto sono esclusi dalle normative. Sono utilizzati per
effettuare transazioni, scambi e accedere a prodotti o servizi. Forniscono
essenzialmente una “utilità” di qualche tipo.
3.1.2 ERC20
L’ERC20 è uno standard che definisce quali funzioni ed eventi devono essere
implementati all’interno di un token Ethereum.
I principali token rilasciati sulla blockchain di Ethereum sono infatti conformi a
tale modello, ciò li consente di essere compatibili con il portafoglio Ethereum o
qualsiasi altro client e smart contract utilizzi tale campione.[19]
Una possibile interfaccia scritta in Solidity di un contratto che realizza l’ERC20
è:
contract ERC20Interface {
function totalSupply() public constant returns (uint);
37
function balanceOf(address tokenOwner) public constant returns (uint balance);
function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
Di seguito sono riportate delle sintetiche illustrazioni sugli scopi delle funzioni:
• La funzione totalSupply() viene eseguita una sola volta, al momento della
distribuzione del contratto sulla rete Ethereum. Questa funzione serve
essenzialmente a stabilire qual è la fornitura totale di token. Restituisce
dunque un numero intero corrispondente al tetto massimo di token in
circolazione.
• BalanceOf restituisce il saldo, ovvero la quantità di token detenuti, dall’indirizzo
passato come parametro di input: address tokenOwner.
• La funzione allowance è alla base di ogni transazione. Consente a due indirizzi di
effettuare trasferimenti unidirezionali. Ha come parametri di input l’indirizzo del
portafoglio tokenOwner e un secondo indirizzo spender.
Nello specifico spender ritirerà un determinato importo da tokenOwner.
• Transfer, insieme alla funzione transferFrom definita successivamente,
rappresentano il cuore di qualsiasi token ERC20, esse sono di fatto responsabili di
ogni transazione. La funzione consente di inviare, in maniera esplicita, gettoni in
quantità pari a tokens dal portafoglio di proprietà dell'utente all’indirizzo to. Il
valore di ritorno è un booleano che conferma il corretto conseguimento della
transazione.
• La transferFrom funziona esattamente come la transfer, ha però tre parametri di
input. Alla quantità di toke