EDIT:

vista l’attuale enorme attenzione sull’argomento ICO questo post ha ricevuto un numero di visite considerevole. Mi preme precisare alcune cose: fare una ICO non è una cosa che si fa “in pochi semplici passi”. Il titolo era un po’ catchy ma la verità è che una ICO non è più una cosuccia da niente dove con un po’ di tecnologia si raccolgono soldi a palate. Una ICO necessità di soldi per iniziare, tanti soldi per il marketing, lo sviluppo e la gestione complessiva. Le ICO hanno raccolto l’attenzione di tanti, e anche dei regulator. Quindi occhio, potreste trovarvi a fare i conti con qualche tribunale o organismo di vigilanza se non sapete cosa state facendo. La raccolta di denaro va sempre inquadrata in qualche framework legale e per questo rivolgetevi ad un legale, esperto di ICO preferibilmente. Questo articolo parla solo degli aspetti tecnici, anzi in realtà parla solo di un aspetto tecnico: il token. Infatti il token è un mero pezzo di codice che effettivamente chiunque può lanciare sulla blockchain. Da qui a venderlo però …

FINE EDIT:

 

Impariamo a fare una ICO, prima che il gruppo mamme su whatsapp ci preceda con la ICO “festa di fine anno” e prenda un vantaggio competitivo su noi techies di lungo corso.

La ICO, Initial Coin Offering o come a volte mi viene di dire Initial Crypto Offering è appunto un modo molto in voga per raccogliere fondi emettendo in cambio un token digitale verificabile su blockchain che ci dà in teoria qualche diritto. In realtà quale sia la funzione del token ricevuto in cambio dei fondi versati non è chiara in generale, ogni caso è un caso a sé. Comunque per chi emette il token si tratta di un’opportunità per ottenere dei capitali e sviluppare il progetto descritto da un immancabile white paper. In altri casi è un modo per intascare qualche ether o bitcoin e poi sparire nel nulla. E’ un territorio nuovo, il lungo braccio della legge non è ancora arrivato. Ma noi ragioniamo in termini di fiducia e onestà e vediamo come sviluppare la nostra prima ICO

Gli ingredienti per la nostra prima ICO sono:

  • uno smart contract per gestire e distribuire i token
  • una landing page con un countdown per creare tensione
  • un white paper che descrive il nostro progetto

Cominciamo dalla parte un po’ più ostica, ovvero lo smart contract. Prima di poter scrivere lo smart contract per una ICO dobbiamo imparare a scrivere uno smart contract qualunque, diciamo un HelloWorld.

A differenza di altri miei articoli del blog questo è un po’ più tecnico nel senso che “mostra” pezzi di codice sorgente e comandi per eseguire e testare i contratti. Il post cerca di essere autocontenuto ma in pratica servirebbe conoscere un minimo di programmazione e poi per approfondire consultare la documentazione tecnica degli smart contract su Ethereum. Metto qualche link qui sotto …

https://solidity.readthedocs.io/en/develop/introduction-to-smart-contracts.html

https://solidity.readthedocs.io/en/develop/index.html

 

Per preparare il nostro primo contratto abbiamo bisogno di alcuni strumenti. Prima di tutto ci serve un client per la rete Ethereum che ci permetta di creare transazioni e contratti e firmarli con le chiavi private che andremo a creare. Ci sono varie possibilità ma personalmente utilizzerò il client Parity. Per le istruzioni di installazione conviene riferirsi al sito ufficiale parity.io

Una volta installato parity dovrà essere lanciato in modo che sincronizzi la blockchain locale, se è la prima volta che viene usato ci metterà un bel po’ di tempo. Diciamo un paio d’ore ma dipende dalla velocità di connessione. Siccome stiamo “giocando” e non vogliamo spendere o magari sprecare soldi veri invece della rete Ethereum ufficiale, la cosiddetta mainnet, utilizzeremo una delle reti di test. Nel nostro caso la Kovan. Lanciare parity sulla testnet Kovan è molto semplice

parity --chain kovan

A questo punto bisogna aspettare …

Una volta che la blockchain è in sync possiamo occuparci del resto. Prima di tutto creiamo qualche account usando parity. In generale parity ha un’intefaccia web raggiungibile all’indirizzo localhost:8080

Screenshot 2017-07-24 11.21.23.png

 

Creare nuovi account è molto semplice, basta premere +account e seguire le istruzioni. Nel mio caso ho potuto anche importare un account da un altro wallet chiamato metamask. Gli importi di ogni account sono in ether ovviamente e su rete Kovan in particolare. Una prima cosa di cui abbiamo bisogno è ottenere alcuni ether su rete kovan. Per fare questo esistono faucet e slack dove si chiedono e si ottengono senza troppi problemi. Un esempio è https://gitter.im/kovan-testnet/faucet ma naturalmente è meglio cercare con Google dato che questi servizi nascono e muoiono continuamente.

Una volta ottenuti gli ether possiamo concentrarci sul nostro contratto, cioè sul nostro HelloWorld contract.

Hello World

Proviamo dunque a sviluppare un nuovo contract. Cominciamo a collegarci alla tab contracts

http://127.0.0.1:8180/#/contracts/

Screenshot 2017-07-24 11.23.49

Intanto vediamo la semplice sintassi dove una funzione è usata come costruttore mentre l’altra chiamata sendMoney ha la keyword payable che indica che una transazione che invoca sendMoney può anche portare con sé un pagamento che va a finire a rimpinguare il saldo del contratto stesso che ricordiamoci può ricevere e spedire ether.

Come si può vedere le funzioni sono vuote. Questo volutamente perché è un contratto minimale che di fatto non fa nulla a parte esistere ed eventualmente ricevere degli ether. Non essendoci poi delle funzioni che permettono di estrarre gli ether depositati di fatto questo contratto è un pozzo senza fondo dal quale non è possibile recuperare i fondi depositati. Quindi non serve a niente se non a bruciare ether e a mostrare la struttura elementare di un contratto. Per una panoramica più completa della documentazione di solidity e sulla struttura dei contratti vi invito a leggere la doc ufficiale.

Una volta compilato lo possiamo lanciare su blockchain con deploy et voilà, il nostro contratto è in esecuzione pronto a ricevere transazioni. Basterà ad esempio invocare sendMoney da un nostro wallet e metterci dentro un po’ di ether per vedere il balance del contratto aumentare.

 

Ora passiamo ad un vero token.

Prima di tutto i token sono degli smart contract che in generale possono essere implementati con una logica qualunque. Tuttavia, dato che è molto facile scrivere del codice non sicuro, sono state proposte delle convenzioni o meglio dei pattern per realizzare il token perfetto o perlomeno non troppo imperfetto. Partiamo dall’interfaccia ERC20. Un’interfaccia è un insieme di funzioni che ci aspettiamo un contratto di tipo ERC20 debba implementare. Questa è una convenzione tipica dei linguaggi di programmazione ad oggetti anche se solidity non è esattamente un linguaggio ad oggetti. La sintassi e la semantica delle funzioni ERC20 è descritta qui sotto.

totalSupply

function totalSupply() constant returns (uint256 totalSupply)

Get the total token supply

balanceOf

function balanceOf(address _owner) constant returns (uint256 balance)

Get the account balance of another account with address _owner

transfer

function transfer(address _to, uint256 _value) returns (bool success)

Send _value amount of tokens to address _to

transferFrom

function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

Send _value amount of tokens from address _from to address _to

The transferFrom method is used for a withdraw workflow, allowing contracts to send tokens on your behalf, for example to “deposit” to a contract address and/or to charge fees in sub-currencies; the command should fail unless the _from account has deliberately authorized the sender of the message via some mechanism; we propose these standardized APIs for approval:

approve

function approve(address _spender, uint256 _value) returns (bool success)

Allow _spender to withdraw from your account, multiple times, up to the _value amount. If this function is called again it overwrites the current allowance with _value.

allowance

function allowance(address _owner, address _spender) constant returns (uint256 remaining)

Returns the amount which _spender is still allowed to withdraw from _owner

In pratica con il nostro client parity possiamo subito creare un token erc20. Infatti parity fornisce già degli snippet di codice pronti per creare un token con pochi clic di mouse.

Per il codice completo vai qui.

https://github.com/paritytech/parity/tree/master/js/src/contracts/snippets

Il primo pezzo è proprio l’interfaccia Token.sol, ovvero un contratto vuoto, senza implementazione che definisce solo le funzioni necessarie per ERC20

Screenshot 2017-07-24 11.29.43.png

Per brevità non inserisco tutto il codice di Token.sol che è reperibile qui. Quello che serve ora è un secondo contratto che “implementa” ciò che Token.sol definisce. In questo caso parity fornisce ancora un utile esempio:

Screenshot 2017-07-24 11.31.01.png

In questo snippet le funzioni hanno una loro implementazione. La riga 12 mostra l’istruzione

Contract StandardToken is Token

Che esprime la relazione di ereditarietà fra i due contratti.

La figura sopra mostra solo una parte del contratto. Il resto è visibile sotto.

 

Screenshot 2017-07-24 11.32.02

La parte essenziale è la penultima riga che contiene l’equivalente di una tabella address->balance che di fatto stabilisce chi possiede cosa, dove il chi è sempre un indirizzo di un account mentre il cosa è la quantità di token posseduta.

Tuttavia anche questo contratto da solo non è sufficiente, infatti implementa le funzioni ERC20 ma non ha modo di interagire con ad esempio un’applicazione o un essere umano che genera transazioni. A questo scopo parity fornisce uno snippet detto HumanStandardToken.sol

 

Screenshot 2017-07-24 11.33.38.png

Prima di tutto notiamo che HumanStandardToken importa il codice di StandardToken e lo estende.

 

Screenshot 2017-07-24 11.34.44.png

Alla riga 36 troviamo il costruttore dove possiamo inserire come parametri la quantità iniziale di token, il tokenName, le unità decimali ed il simbolo

Una volta che abbiamo tutti gli elementi possiamo compilare il nostro HumanStandardToken.sol per poi “lanciarlo” nella blockchain.

In questo caso ci verrà chiesto di configurare, cioè passare quei parametri del costruttore visibili nel codice.

Screenshot 2017-07-24 11.38.02.png

Nel nostro caso abbiamo creato un contratto di nome Toki, come il leggendario guerriero manga, con un supply di 100 toki e nessuna cifra decimale consentita.

Una volta in esecuzione possiamo andare a ripescarlo da qualsiasi blockchain explorer.

Ad esempio, etherscan lo vede così

Screenshot 2017-07-24 11.38.57.png

 

Ok, ora abbiamo creato e deploy-iato il nostro token. Come facciamo a distribuire i token? Infatti a quanto pare non esiste una funzione nel nostro contract che permette di acquistare toki in cambio di ether. Ci saremmo aspettati una funzione tipo

buy(amount) 

… etc. E invece no.

I token sono tutti assegnati al creatore del contratto, nel mio caso l’account “prova”. Lui può decidere cosa farne e a chi assegnarli o venderli. Questa è una scelta implementativa non dettata da nessuno standard. Risulta comunque flessibile e ci permette di stabilire delle politiche di prezzo dei token non codificate nel contract del token stesso. Possiamo in generale avere un altro contratto che vende i token oppure semplicemente possiamo in modo manuale o semi-manuale spedire i token a chi ci invia gli ether. Nel caso del nostro tutorial lo facciamo manualmente ma non è certo quello che farei in una vera ICO.

Finalmente la ICO

Abbiamo già stabilito che il codice di un token non contiene la logica per vendere i token stessi ai partecipanti, ma invece i token sono inizialmente assegnati al creatore del contratto. Sarà lui a poter assegnare i token a chi vuole previo pagamento. Quindi il modo più semplice e manuale di fare una ICO è quello di metter su una bella landing page con un contatore, un white paper e poi in backend scrivere uno script che assegna tutti i token in proporzione agli ether versati. Un modo è quello di creare una landing page con http://www.proofsuite.com/i/ . E’ un generatore di ICO pages e con pochi passaggi ci restituisce un risultato come questo

Screenshot 2017-07-24 11.43.02.png

Il nostro token si chiama Toki e useremo toki anche come simbolo.

Se volete divertirvi è disponibile la versione online (non garantisco che duri a lungo visto che un servizio gratuito di una piccola azienda) potete visitarla qui http://www.proofsuite.com/i/1HKqYT4HSF

In ogni caso il contratto su Kovan esiste davvero

0xe26B960E36eb85b20799B6ac95D9913Cafe9BD9A

e si può inviare ether all’indirizzo

0x0017a3B477E612d8bF44756889975e591f4a1f26

Non aspettatevi niente di che. La distribuzione dei fondi agli acquirenti è manuale e i token sono solo 1000, se spedite etere e i token sono finiti, beh perdete i soldi. Non ho mica detto che questa ICO funziona bene. E’ solo un gioco.

In generale

Want to buy Toki tokens?

The price is 1 toki = 0.1 ether

send to Kovan network only to address

0x006FE4320f1fbbEBa4a6df4c72173186962bb71B

Beware Toki is a fake ico, send Kovan ether only. Money is lost forever.

Con questo abbiamo finito. In realtà manca una cosa, il white paper. Ebbene visto che il post è già piuttosto lungo ve lo risparmio 🙂

 

Se ti è piaciuto l’articolo potresti scaricare il mio Kindle ebook Dagli Smart Contract alle ICO.Screenshot 2017-10-25 21.22.57

Oppure in alternativa mettere un mi piace alla Facebook page

Ultima raccomandazione: niente di quello che scrivo è un invito ad investire i tuoi soldi, è al massimo un invito a conoscere la tecnologia sottostante. Se investi non investire più di quello che sei disposto a perdere e soprattutto non investire in cose che non capisci, siano queste i bitcoin, Ripple o bipcucù (cit.)

Annunci