Creazione smartcontract in una blockchain privata (parte 2 – implementazione)

Nel precedente articolo abbiamo capito come si crea una blockchain privata Ethereum.

In questo articolo creeremo un semplice smartcontract, con linguaggio solidity, che restituisce semplicemente un numero e consente di sommare o sottrarre il numero per 10.

Utilizzeremo, a tale scopo, un editor online remix che ci consente di fare debug del codice e di renderlo attivo nella blockchain.

Accedendo su remix possiamo creare un nuovo progetto che chiameremo myown.sol.

Remix consente anche la compilazione del codice e la creazione del contratto intelligente sulla nostra blockchain privata. Per fare questo è necessario selezionare la voce run-> environment->web3 provider e specificare l’endpoint http://localhost:8545.

L’accesso alla rete privata tramite remix sarà possibile soltanto se il nodo miner è stato lanciato con questo parametro –rpccorsdomain “*” .

Una volta connessi con remix è possibile visualizzare subito la connessione alla nostra networkId 1999 ed il nostro account con il valore eth assegnato.

A questo punto potete fare copia incolla dal codice qui sotto.

pragma solidity ^0.4.18;


contract MyOwn {
 
 uint256 number = 10; //initial number assigned

function add() public { //increases number by 10
 number= number+10;
 }
 
 function subtract() public { //decreases number by 10
 number=number-10;
 }

function getCounter() public constant returns (uint256) {
 return number;
 } 
 
}

E’ possibile attivare l’autocompile sotto la scheda compile e, se non ci sono problemi, è possibile attivare il contratto appena creato.

per creare il contratto è necessario sbloccare l’account sulla geth console (guarda l’articolo precedente) e premere su create (pulsante in rosso). Sul campo at address inseriamo il nostro account che abbiamo appena sbloccato.

web3.personal.unlockAccount(eth.coinbase)

Il risultato è come in figura

Come si può vedere, remix ci presenta le funzioni pubbliche costruite nel contratto: add, subtract, getCounter. A questo punto possiamo premere le singole funzioni e visualizzare il risultato.

Si noti che il numero iniziale è 10 come impostato staticamente nel codice, se premiamo add il numero aumenta di 10, se premiamo subctract il numero diminuisce di 10.

Creazione blockchain privata con Ethereum (parte 1 – setup)

Con l’articolo precedente abbiamo capito come funziona la blockchain e come potrebbe cambiare in futuro internet.

Con questo articolo spieghiamo come può essere sfruttata la blockchain nell’ottica di creare applicazioni decentralizzate. Ovvero che non necessitano di un server centrale per il funzionamento.

Un progetto molto interessante è Ethereum e permette appunto la creazione di applicazioni decentralizzate di qualsiasi tipo.

Per capire fino in fondo Ethereum iniziamo a studiarlo installandone un’istanza privata.

Per installare Ethereum seguiamo queste istruzioni che ci consentiranno di installare sul nostro ambiente linux geth.

Per prima cosa generiamo un account di minatore, ovvero, colui che elaborerà l’algoritmo per creare gli ethereum coins. La creazione dell’account produrrà una coppia di chiavi (pubblica e privata). Questa coppia di chiavi viene inserita all’interno della cartella data_dir/keystore. Qualsiasi cosa di persistente verrà scritta nella cartella data_dir.

Una volta creato l’account viene mostrato a video anche l’indirizzo del nodo address_number.

#creiamo la cartella principale e la cartella 'data' nella quale viene conservata il keystore
>mkdir myown
>mkdir myown/data
#creiamo il nuovo account nella cartella creata
>geth account new --datadir /home/studio/blockchain/myown/data/
Address: {cb0f0fc732ad30b021c52e317e59122e693bb585}

blocco genesis

Ora che abbiamo l’account possiamo creare il primo blocco ethereum. Chiamato genesis. Ogni blockchain di ethereum ha il suo primo blocco genesi. Per far sì che la nostra blockchain non vada in conflitto con altre blockchain dobbiamo modificare i valori networkId di default.

#genesis.json
  {
 "config": {
 "chainId": 1999, #networkId
 "homesteadBlock": 0,
 "eip155Block": 0,
 "eip158Block": 0
 },
 "difficulty": "200000000", #valore di difficoltà applicata per la scoperta di questo blocco
 "gasLimit": "2100000", #limite di gas (ethereum) per eseguire tutte le le transazioni nel blocco
 "alloc": { #preallocazione ethereum sul primo account
 "cb0f0fc732ad30b021c52e317e59122e693bb585": { "balance": "400000" }
 }
}

inizializzazione genesis e start mining

L’operazione di mining consente la generazione di ethereum in base a calcoli matematici. Di seguito un esempio…

>geth --datadir /home/studio/blockchain/myown/data init genesis.json
INFO [03-10|10:47:41] Maximum peer count ETH=25 LES=0 total=25
INFO [03-10|10:47:41] Allocated cache and file handles database=/home/studio/blockchain/myown/geth/chaindata cache=16 handles=16
INFO [03-10|10:47:41] Writing custom genesis block 
INFO [03-10|10:47:41] Persisted trie from memory database nodes=1 size=195.00B time=75.389µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [03-10|10:47:41] Successfully wrote genesis state database=chaindata hash=aa6b0d…0d8207
INFO [03-10|10:47:41] Allocated cache and file handles database=/home/studio/blockchain/myown/geth/lightchaindata cache=16 handles=16
INFO [03-10|10:47:41] Writing custom genesis block 
INFO [03-10|10:47:41] Persisted trie from memory database nodes=1 size=195.00B time=58.634µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [03-10|10:47:41] Successfully wrote genesis state database=lightchaindata hash=aa6b0d…0d8207

avvio blockchain con nodo da minatore. Il mining è possibile farlo anche dalla console.

geth --mine --rpc --rpcaddr 0.0.0.0 --rpccorsdomain "*" --networkid 1999 --datadir /home/studio/blockchain/myown/data/

Initialised chain configuration config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Byzantium: 4370000 Engine: ethash}"
INFO [03-10|10:54:03] Disk storage enabled for ethash caches dir=/home/studio/blockchain/myown/data/geth/ethash count=3
INFO [03-10|10:54:03] Disk storage enabled for ethash DAGs dir=/home/studio/.ethash count=2
INFO [03-10|10:54:03] Initialising Ethereum protocol versions="[63 62]" network=1999

colleghiamo la geth console

per collegare la geth console con il nodo di mining appena creato basta applicare il seguente script su un altro terminale

>geth --datadir /home/studio/blockchain/myown/data/ attach ipc:/home/studio/blockchain/myown/data/geth.ipc

instance: Geth/v1.8.1-stable-1e67410e/linux-amd64/go1.9.4
coinbase: 0xcb0f0fc732ad30b021c52e317e59122e693bb585
at block: 0 (Thu, 01 Jan 1970 01:00:00 CET)
 datadir: /home/studio/blockchain/myown/data
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
Welcome to the Geth JavaScript console!

in questo caso la console si connette al nodo attraverso pipe ipc (interprocesse) che funziona sul computer locale.

Dalla consolle possiamo eseguire le prime istruzioni

> eth.accounts
["0xcb0f0fc732ad30b021c52e317e59122e693bb585"]
> eth.coinbase
["0xcb0f0fc732ad30b021c52e317e59122e693bb585"]
> eth.getBalance(eth.coinbase)
2.3229485729235784806170624e+25

 

Blockchain, la rete internet del futuro

Letteralmente blockchain significa catena di blocchi. Per quale motivo una catena di blocchi sarà la rete del futuro?

Per rispondere a questa domanda dobbiamo prima di tutto conoscere come funziona la tecnologia blockchain.

Fino ad oggi quando pensiamo ad internet generalmente pensiamo ad una rete centralizzata. Ovvero, il mio PC (client) si connette al server in modo da richiede informazioni o fare altri tipi di operazioni come: creare bonifici, acquistare, scrivere articoli…

Quando sentiamo parlare di blockchain si intende un tipologia di rete in cui viene meno la centralizzazione delle informazioni. Infatti, la basedati è distribuita e decentralizzata per tutti i nodi della rete.

In realtà, in qualche occasione abbiamo già sentito parlare di rete distribuita: la rete peer to peer. Questa rete è usata sopratutto per la condivisione dei file in cui ogni nodo della rete può ricevere ed inviare informazioni ad altri nodi della rete senza che ci sia alcun nodo che faccia da intermediario.

Nel caso della blockchain ogni nodo possiede lo stesso database presente su tutti gli altri nodi e, grazie a particolari tecniche di crittografia, ogni informazione (chiamata transazione) viene inserita in blocchi e viene distribuita su tutti i nodi della rete. Una delle peculiarità della blockchain è che l’informazione non è duplicabile.

Com’è possibile non duplicare le informazioni su internet? ad esempio un e-book o una canzone?

Per rispondere a queste domande bisognerebbe avere alcune nozioni base di crittografia. In particolare:

La funzione hash sha256.

Questa funzione ha due caratteristiche principali:

  1. trasforma qualsiasi tipo di informazione digitale in una sequenza numerica di 256 bits. Potete fare delle prove con esempi testuali su questo link. Il risultato della funzione hash è ciò che verrà inserito in una transazione di un blocco della blockchain. Quindi, posso convertire un file di 10GB in un file testuale da 256bits
  2. Se utilizzo questa funzione su un’immagine otterrò una sequenza alfanumerica; se all’immagine cambio il metadato di pubblicazione allora otterrò un’altra sequenza alfanumerica completamente diversa. Se qualcuno copia la mia immagine allora il file copiato avrà un hash completamente diverso dall’originale.

Crittografia asimmetrica con chiave pubblica-privata

Ogni membro della blockchain ha una chiave pubblica e privata. Se volessi trasferire un’immagine di mia proprietà ad un destinatario allora posso agire in questo modo:

Con la chiave privata posso crittografare, ad esempio, l’hash della mia immagine in modo da firmarla digitalmente. Durante la transazione invio al mio destinatario, oltre all’hash firmato, anche la chiave pubblica (la chiave pubblica è generata attraverso una funzione complessa logaritmica dalla chiave privata. Dalla chiave pubblica è ad oggi impossibile risalire alla chiave privata). Il mio destinatario può, a questo punto, decriptografare l’hash con la mia chiave pubblica (in questo modo riconosce che l’immagine è di mia proprietà) e confrontare l’hash ottenuto con l’hash dell’immagine stessa in modo da verificare l’autenticità del file.

Come si applica la crittografia in una blockchain?

Ogni transazione avrà sempre un elemento in input ed uno in output. Se io volessi inviare un file da A a B, firmo digitalmente il file con la chiave privata di A e poi cripto la transazione con la chiave pubblica di B in modo tale che solo B può ricevere il file. A questo punto B decripta il file con la chiave pubblica di A.

linked block

Ogni blocco della rete è rappresentato univocamente da un’hash. Ad esempio supponiamo che A è collegato a B. A è rappresentato da 0001, B possiede (nel campo relativo all’hash precedente) 0001. A e B risultano collegati tra loro e questo tipo di relazione fa sì che si rispetti l’integrità. Ciò vuol dire che ogni modifica al blocco A modificherà il suo codice hash e romperà la catena con il blocco B.

In generale, ogni blocco della catena contiene un puntatore hash come collegamento al blocco precedente, un timestamp e i dati della transazione.

Come si creano i blocchi?

i blocchi non sono altro che una collezione di transazioni create dagli utenti della blockchain. Per essere utente della blockchain basta possedere un portafoglio (o wallet, ce ne sono diversi in giro). Una volta creato il proprio wallet viene fornita la chiave pubblica e la chiave privata (che non deve essere assolutamente condivisa con nessuno).

Tutte le transazioni create da chiunque abbia un portafoglio (wallet) vengono raccolte in un blocco (al quale verrà assegnato un hash). Questo codice verrà poi inserito nel blocco successivo. Ogni transazione subirà, prima di accedere al blocco, una serie di controlli da parte dei nodi completi della rete in modo da verificarne la validità (i nodi completi sono nodi che hanno tutta la blockchain nel proprio storage). Una volta generato il blocco e convalidato le checksum di tutte le transazioni l’algoritmo proof-of-work garantisce che il nodo sia accettato da tutti i nodi della rete.

Chi sono i miners?

I miners sono nodi della rete che assicurano la validità ed il corretto funzionamento della blockchain. Tecnicamente pubblicano di continuo blocchi nuovi della blockchain con le transazioni che hanno appena verificato (1MB X 2000 transazioni). una volta che il miner pubblica un nodo riceve una ricompensa (bitcoin o altre criptovalute). I miners sono tra loro in competizione: chi produce blocchi per prima riceve ricompense maggiori. La velocità di calcolo e la banda di rete sono determinanti nella generazione dei blocchi.

La tecnologia appena descritta si sta evolvendo verso una nuova generazione di applicazioni web3.0. Ethereum è un piattaforma basata su blockchain che promette (oltre alla generazione di criptovalute) anche di poter creare applicazioni distribuite (senza un server centrale) DAPPS.

Quindi, se associamo le potenzialità della blockchain con le applicazioni distribuite potremmo aprire le porte ad una vasta gamma di applicazioni future che non avranno più bisogno di una centralizzazione delle informazioni o di una verifica di un ente terzo.

Se la spiegazione vi ha entusiasmato...allora riconosci il lavoro con una piccola donazione

ETH: 0x11b2549022F5E8d9153254E9966bBa93A48dDf59