Index
Quindi vuoi creare uno smart contract? Vuoi capire come funzionano, e creare la tua cryptovaluta? o vuoi lanciare la prima ICO miliardaria? non importa quali siano le tue intenzioni, capire come funzionano gli smart contract è importante. In questa guida ti andrò a spiegare come creare uno smart contract con solidity. La piattaforma ethereum possiede un potenziale enorme per creare token che potrebbero cambiare il modo con cui interagiamo. Ethereum usa degli smart contract che funzionano come una normale transazione nella blockchain, hanno una particolare condizione che deve essere soddisfatta prima che possa essere eseguita la funzione. Gli smart contract possono essere usati per il crowdfunding, i voti, le aste, e altro ancora.
Leggi anche: Come creare un Token su Ethereum in un’ora
Ed anche: Come creare un token su Ethereum in 20 minuti
Ecco un veloce esempio di Smart Contract
Bob ha la sua attività di deposito di scarti di ferro negli stati uniti. Eric è un fornitore di scarti di ferro e si trova in Cina. Bob e Eric hanno una buona relazione di lavoro. Si fidano tra di loro e fanno questa cosa da molto tempo. Bob crea uno smart contract dove nel momento in cui il suo inventario di ferro raggiunge una certa quantità, invia automaticamente un ordine a Eric per x kg di scarti di ferro. Eric accetta e accetta il pagamento di bob. Adesso Eric può scambiare il suo ethereum in un exchange online in Yen per una piccola tassa e saranno scambiati istantaneamente.
Bob avrebbe dovuto usare la sua banca e richiedere un trasferimento di denaro nella banca di Eric in Cina. E di solito ci vogliono 48 ore per il trasferimento. Inoltre la banca di Bob farà pagare una tassa per l’invio dei soldi, e inoltre entrambi devono pensare al cambio di valuta dai dollari agli yen.
Cosa imparerò?
Come dice il detto devi imparare a gattonare prima di imparare a camminare. Prima di creare il tuo primo smart contract inizieremo dalle basi.
Leggi anche: Solidity: la guida definitiva
In questo tutorial andremo ad affrontare:
- I nodi Ethereum
- Creare una rete per una Blockchain privata
- Un plugin per i browser di nome Metamask
- Il browser Mist
- Il wallet Ethereum
- Web3 Ethereum JavaScript API
- Remix Web Browser IDE
- Geth l’interfaccia di comando per ethereum
- Il linguaggio di programmazione di solidity
Impostare un nodo di Ethereum
Nella forma più semplice un nodo di ethereum è un qualsiasi dispositivo che usa un protocollo Ethereum. I nodi di solito vengono usati sui pc, ma si stanno sviluppando anche dei nodi per i telefoni. Quando ci connettiamo ad un protocollo Ethereum siamo sulla rete della Blockchain di Etehreum e stiamo avviando un nodo. Avviando il nodo possiamo connetterci ad altri nodi nella rete, avere accesso alla Blockchain, minare blocchi di ethereum, fare transazioni e creare Smart Contract.
I nodi sono scritti in Go (go ethereum/geth), C++, e Python, in questo tutorial andremo ad usare il più popolare dei tre, Go. E’ importante notare che scaricando geth stai scaricando l’intera blockchain di Ethereum. Detto questo devi avere 35 GB di spazio di memoria prima di continuare
- Visita il sito Go ethereum e istalla geth
Il sito è qui: https://geth.ethereum.org/downloads/
- Scarica l’ultima versione di geth (al momento è la 1.7.2) per windows, e assicurati di scaricare la versione 64 bit.
Geth Ethereum Downloadable Releases
- Una volta che il download è completo, apri l’installer e clicca su “accetto”.
- Spunta geth e poi clicca next
- Verrai mandato a selezionare la cartella di destinazione della cartella per il tuo download.
- Chiudi una volta che l’istallazione è completa
- Apri il promt dei comandi (userò git bash, quindi dovresti scaricarlo qui https://git-scm.com/) vai nella directory di geth digitando “C:\programmi\Geth”
- Inizia a sincronizzare la blockchain ethereum digitando geth. Dato che questa è la tua prima volta scaricherai tutta la blockchain. Per questo ci vorrà un po di tempo.
Questo è quello che vedrai quando avvierai geth per la prima volta dopo il download.
Fatto? Ok adesso hai avviato un nodo di Ethereum. Iniziamo con il divertimento.
Creiamo la nostra rete privata di Ethereum
Adesso che hai accesso al protocollo ethereum attraverso il nodo, andremo a creare il nostro server privato per sviluppare il nostro smart contract. In questo modo non andremo a mettere il nostro smart contract nella blockchain di Ethereum ma nella nostra.
Inizieremo con il creare il primo vero blocco della nostra blockchain,
- Crea una nuova cartella sul tuo desktop e chiamala “blockchain privata”.
- Apri il prompt dei comandi e crea una cartella directory di dati per la nostra chain digitando “Mkdir chaindata”.
- Puoi aprire il prompt dei comandi nella cartella tenendo shift e cliccando il tasto destro e selezionando “apri la finestra di comando”.
- Adesso dobbiamo creare e salvare il nostro blocco genesis.json nella nostra cartella. Il blocco di genesi verrà usato per far partire il nostro network privato e immagazzinare i dati nella cartella chaindata.
- Apri il blocco note, copia e incolla il codice qui sotto in un nuovo file, chiamalo genesis.json e salva il file nella cartella blockchain privata.
{ "coinbase" : "0x0000000000000000000000000000000000000001", "difficulty" : "0x20000", "extraData" : "", "gasLimit" : "0x2fefd8", "nonce" : "0x0000000000000042", "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp" : "0x00", "alloc": {}, "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 } }
- Adesso dobbiamo inizializzare la nostra rete privata nella directory chaindata usando il nostro file genesis.json. Andremo a dire a geth che vogliamo i dati della directory nella directory chaindata e gli diremo dove trovare il file genesis.json ( genesis.json non deve trovarsi nella cartella chaindata) inserendo questo codice nella finestra dei comandi della cartella blockchain privata.
geth –datadir=./chaindata/ init ./genesis.json
- Adesso vedrai che genesis è stato scritto correttamente
- Adesso possiamo avviare geth e connetterlo alla nostra blockchain privata. Come puoi vedere il socket di conesssione endpoin geth.ipc sarà aperto e la porta sarà 30303.
geth –datadir=./chaindata/
Ogni volta che apriremo geth l’endpoint IPC sarà aperto, e sarà usato per le connessioni a geth di programmi come metamask, ethereum wallet o mist.
Adesso abbiamo finalmente creato la nostra rete privata
Cos’è MetaMask
MetaMask è sia un wallet che un browser ethereum. Attraverso metamask puoi interagire con gli smart contract e le dapps senza scaricare tutta la blockchain o istallare software. Puoi semplicemente aggiungere metamask come estensione di chrome, creare un wallet, e depositare ether.
Al momento è disponibile solo per chrome, ma in futuro potrà essere usato anche su firefox.
Il problema di metamask è lo stesso di molti wallet online, devi fidarti di metamask. C’è la possibilità che metamask venga hackerato o che rubino la tua chiave privata, ma è il prezzo che si paga per avere un wallet online.
Puoi scaricare metamask qui:
<a href="https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=en">https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=en</a>
Il browser Mist
Mist è un programma ibrido che funziona sul pc ma ha anche una interfaccia web. Questo permette dei cambiamenti e uno sviluppo dell’interfaccia di mist più veloci. Mist è in beta quindi potrebbe ancora avere qualche problema qui e la.
Mist include un nodo di geth che si avvia in background insieme al programma, e si connette subito alla blockchain di ethereum. Ma dato che vogliamo fare pratica con gli smart contract, useremo la nostra rete privata e non avremmo bisogno che mist si connetta al nodo di geth.
Qui puoi leggere altro su mist: https://github.com/ethereum/mist/wiki
Wallet Ethereum
Il wallet ethereum è un aggiunta di mist che può accedere a una singola dapp. Il wallet è scritto in puro codice javascript e HTML, usa web3.js per controllare gli account, e viene avviato nel browser di mist. Puoi anche scaricare la versione separata se vuoi. Il wallet non ha ancora fatto un rilascio ufficiale e quindi ci sono dei bug.
Wallet ethereum https://github.com/ethereum/meteor-dapp-wallet
Scarichiamo mist e connettiamolo alla nostra rete privata
- Vai nella pagina di download di Mist e scarica l’ultima versione dell’installer di mist —
<a href="https://github.com/ethereum/mist/releases"><strong>https://github.com/ethereum/mist/releases</strong></a>
- Apri l’installer e clicca accetto
3. Conferma il percorso dell’istallazione C:\Program Files\Mist (default) cliccando next
- Conferma che i dati della blockchain vengano messi nel percorso di default..\Roaming\Ethereum e clicca istalla.
Connettere Mist alla nostra rete privata
Adesso dobbiamo aprire una finestra di comando nella cartella della blockchain privata per dire a geth di connettersi alla nostra directory. Scrivi il seguente commando nel prompt.
geth –datadir=./chaindata/
Geth adesso partirà e quando apriremo mist l’endpoint ipc geth si aprirà, mist poi si connetterà alla nostra rete privata. Assicurati che mist sia connesso controllando in alto a destra che ci sia scritto rete privata.
Ignora la scritta looking for peers perché siamo nella nostra rete privata e non si connetterà mai ad altri peers.
Le basi di Mist
Apriamo Mist e iniziamo a familiarizzare con alcune cose
- In cima possiamo vedere la nostra tool bar. Andando su ethereum node sotto develop vedremo che non siamo connessi su geth, perché siamo connessi alla nostra rete.
- Come per Chrome, sotto develop possiamo anche accedere ai developer tools.
- Sul lato sinistro del browser possiamo vedere molte tab differenti come qualsiasi altro browser. Cliccando sul box verde possiamo aprire il wallet ethereum. Il wallet è un applicazione che rende facile interagire con l’interfaccia javascript di go ethereum.
- Come puoi vedere siamo connessi al wallet ethereum attraverso https://wallet.ethereum.org/, non dimenticare che mist è solo un browser. Da qui possiamo fare cose come vedere le transazioni, inviare ether e controllare i nostri smart contract.
- Sotto la tabella wallet possiamo vedere i nostri account, possiamo aggiungere altri account, creare contratti per il wallet e esaminare le vecchie transazioni.
- Creiamo un account cliccando add account, poi create new account e inserendo una password super sicura, (anche se comunque non saremo connessi alla rete di etehereum ma alla nostra, è sempre una buona abitudine) clicca ok e crea il tuo wallet.
Sotto la tab send possiamo inviare ether da un wallet a un altro o anche da un wallet ad un contratto. Come puoi vedere sotto, prima di cliccare send abbiamo l’opzione di pagare una tassa per la transazione. Ogni transazione richiede una tassa per incentivare la transazione. A seconda di quanto vogliamo che sia veloce il processo possiamo aumentare e diminuire la tassa.
Per finire sotto contract possiamo creare nuovi contratti, controllare quelli esistenti e controllare i token già creati. Qui andremo a creare il nostro contract hello world.
Possiamo anche vedere l’opzione watch contracts e token. Se volete controllare un contratto già creato, dovete cliccare su watch contracts e inserire il nome del contratto, l’indirizzo e l’ABI.
Adesso passiamo a una parte più eccitante, se andiamo nel box blu con la lente di ingrandimento vedremo aprirsi una barra di indirizzo e una pagina web che si sta caricando. Se clicchiamo connect in alto a destra dello schermo, possiamo connettere il browser al nostro wallet. Lo vedremo quindi connesso a web 3.0 e da qui possiamo vedere le applicazioni che usano l’ethereum (dapps) e usare il nostro wallet.
Dato che siamo sulla nostra rete privata, possiamo connettere il nostro wallet ma non vedere nessun vero ether. E quindi non potremo fare molto con le dapps. Per usarle meglio dobbiamo connetterci alla rete di ethereum e depositare ether nel nostro wallet.
Ti chiederai come fa mist a connettere un wallet ad un browser e interagire con la blockchain di ethereum, Mist è semplicmente un browser, un browser che usa una libreria web3.js e che può comunicare con un nodo ethereum o interagire con un smart contract creato sulla blockchain. La libreria web3.js comunica con il nodo ethereum attraverso JSON RPC connettendosi a un http o un IPC.
Adesso inizieremo a parlare del Remix web IDE, a creare il nostro primo smart contract e ad avviarlo su Mist.
Remix Web Browser IDE
Adesso iniziamo sul serio a scrivere del codice. Possiamo scriverlo direttamente su mist, ma per adesso andremo a scrivere il nostro sodility code nel Remix browser IDE. Perché? Remx ha molte funzioni che rendono più facile la creazione degli smart contract. Le funzioni di Remix includono:
- debugger integrato.
- Avvertimenti, come per un codice che non funziona.
- Integrated testing & deployment environment
- Analisi statica
- Evidenziamento degli errori di sintassi
- Works with injected Web3 objects
- Può avviare il contratto direttamente su metamask o mist
Andiamo su Remix dal sito: https://remix.ethereum.org/
Possiamo subito vedere al centro della pagina lo spazio per il nostro codice. In alto a sinistra dello schermo possiamo vedere le opzioni per i file: create new file, add local file, publish all open flies to an anonymus github gist, copy all files to another instance, e connect to localhost. Possiamo anche vedere la lista dei contratti che stiamo sviluppando.
Nel lato in alto a destra dello schermo possiamo vedere molte tab che possiamo selezionare. La tab compile ci permette di compilare il nostro contratto una volta completato (è impostato di default su auto).
Per questo tutorial utilizzeremo la tab run. Se clicchiamo su run possiamo vedere diverse impostazioni per il contratto.
Environment: Ci sono 3 tipi di environments che si possono usare. Sia web3 provider che injected web 3 richiedono altri tool come metamask o mist. Noi andremo ad usare Javascript VM, perché ci permetterà di eseguire il contratto nel nostro browser e di avviarlo su Mist.
Account: Remix ha 5 differenti account con 100 ether per caricati, questi possono essere usati durante lo sviluppo se servono.
Gas limit: Qui si deve impostare un limite alla tassa che si vuole mettere al contratto.
Gas Price: Qui si deve impostare la tassa minima.
Value: Questa è la quantità di ether con cui iniziare il contratto.
E adesso iniziamo a scrivere il codice
Per quelli di voi che conoscono Javascript, vedrete sicuramente molte similitudini con solidity. Come Javascript, solidity è un linguaggio di alto livello progettato per la macchina virtuale di etehreum.
Nel nostro contract hello world andremo a creare una variabile chiamata counter e gli assegneremo un valore iniziale di 5. Poi andremo a creare una funzione che aumenterà la nostra variabile di 1, una funzione che diminuisce la variabile di 1, una funzione che ritorna al punto di partenza, e una che distrugge il contratto.
La prima parte di codice che andremo a scrivere e la versione del codice. Al momento solidity è nella versione 0.4.16, quindi andremo a scrivere:
pragma solidity ^0.4.16;
La keyword pragma indica un’istruzione per il compilatore su come trattare il codice sorgente.
Se guardiamo lo scheletro di uno smart contract possiamo vedere che è formato di connessioni tra il codice e i dati che corrispondono ad uno specifico indirizzo di contratto sulla blockchain.
Creazione del contratto
Iniziamo la creazione del nostro contratto hello world creando per prima cosa un contratto chiamato:
[donationlocker]
pragma solidity ^0.4.16; contract HelloWorld { }
[/donationlocker]
Adesso possiamo includere la variabile del counter di cui abbiamo parlato prima
pragma solidity ^0.4.16; contract HelloWorld { uint256 counter = 5; }
Adesso vediamo se riesci a creare 2 funzioni con queste variabili. Abbiamo bisogno di una funzione che aumenta il counter di 1 e di 2 e una che lo diminuisce di 1
[donationlocker]
pragma solidity ^0.4.16; contract HelloWorld { uint256 counter = 5; //state variable we assigned earlier function add() public { //increases counter by 1 counter++; } function subtract() public { //decreases counter by 1 counter--; } }
[/donationlocker]
Ci siamo quasi ma manca ancora qualcosa. La nostra variabile può cambiare a seconda della funzione, ma abbiamo bisogno di una funzione che mostri il valore del counter. Prova a creare una funzione che si chiama “getCounter()” che rimanda a counter.
pragma solidity ^0.4.16; contract HelloWorld { uint256 counter = 5; //state variable we assigned earlier function add() public { //increases counter by 1 counter++; } function subtract() public { //decreases counter by 1 counter--; } function getCounter() public constant returns (uint256) { return counter; } }
Adesso abbiamo un contratto che ci permette di cambiare il valore di counter. Possiamo aumentarlo di 1, diminuirlo di uno e far ritornare il valore come prima.
Adesso testiamolo
Adesso vai su Run clicca su create e vedrai il contratto creato come qui sotto.
Puoi notare che la quantità di ether sul nostro account è scesa da 100 dopo aver creato il contratto.
Puoi vedere 3 funzioni add, substract e get counter.
Clicca su add per aumentare il counter di 1. Poi clicca su get counter per vedere il counter modificato. E potrai vedere che il counter è aumentato a 6. Substract funziona allo stesso modo.
Ecco, ce l’hai fatta, adesso hai creato un contratto.
Far partire il contratto su mist
Adesso che abbiamo testato e confermato il nostro codice su Remix, avviamo mist, sempre sul network privato. Andiamo su contracts del wallet ethereum di mist. Clicchiamo su deploy new contract e incolliamo il nostro codice nel box.
Prima di procedere dobbiamo avere un po di ether nel wallet. Possiamo minare l’ether nella nostra rete avviando il miner. Lo faremo attraverso la console javascript di geth.
Apri un altro prompt dei comandi sulla cartella della rete privata
(C:/users/name/desktop/private network) e digita geth attach. Clicca invio e vedrai la console javascript di geth dove potrai inserire comandi in geth. Iniziamo il mining digitando miner.start();. Vedrai che la console mostrerà nul e mining has begun. Adesso puoi andare a vedere il tuo wallet su mist e vedere l’incremento di 5 ether constantemente. Puoi fermare il miner quando vuoi digitando miner.stop(); o puoi continuare a minare ether falsi.
Adesso torniamo a contract, deploy new contract. A destra del codice seleziona hello world per avviare il contratto
Dopo aver inserito la password, torna al wallet, e a lastest transactions e vedrai il contratto che è stato creato. Vedrai anche che il contratto mostra 0 su 12 conferme ed è bloccato sempre in creating contract.
La ragione per cui il contratto non è stato creato completamente è perché non ci sono miner nella nostra rete che confermano il contratto. Avvia di nuovo il miner come prima. E una volta che iniziamo a minare possiamo veder apparire le conferme e il contratto verrà creato completamente.
Adesso clicca sul nome del contratto. Da qui possiamo fare di tutto. Possiamo mandare ether al contratto, copiare l’indirizzo, generare un codice QR e altro.
Come puoi vedere il nostro contract hello world mostra la funzione getcounter() con il counter a 5. Vai su select function e seleziona o add o substract. Una volta selezionato clicca execute.
E abbiamo fatto, il nostro contract ha eseguito la funzione di sottrazione e il valore è diventato 4. Adesso abbiamo uno smart contract live nella nostra rete privata.