Struttura di Ethereum

Lo Stack

Il client ethereum è in connessione continua con la rete distribuita di nodi ethereum e mantiene in sincronia una copia locale del blockchain.

Il client espone un'interfaccia RPC (Remote Procedure Call) accessibile da client web tramite la libreria web3.js (JavaScript).

Ethstack

Struttura del Blocco

Ethblock

Un blocco è composto di:

  • testata
  • lista transazioni
  • lista delle testate degli Uncle

Struttura della Testata

  • Parent hash - del blocco precedente
  • Ommers hash - della lista delle testate di Uncles
  • State root - hash della radice del Trie di stato
  • Transaction root - hash della radice del Trie delle transazioni
  • Receipts root - hash della radice del Trie delle ricevute
  • Logs bloom - filtro che punta all'indirizzo del logger ed entries di log
  • Difficulty - livello corrente di difficoltà
  • Number - numero sequenziale del blocco corrente; il Blocco Genesis è lo zero
  • Gas limit - limite di consumo di gas dell'intero blocco
  • Gas used - consumo di gas di tutte le transazioni
  • Timestamp - data ed ora di generazione del blocco
  • Extra data - altri dati relativi al blocco
  • Mixhash - coinvolto nel calcolo dello hash di difficoltà
  • Nonce - da aggiustare per il calcolo della difficoltà

Macchina a Stati

Statem

Ethereum è una macchina a stati basata su transazioni.

Una transazione porta da uno stato iniziale ad uno stato finale

Transazioni

Una transazione è un messaggio firmato incluso in un blocco, e può essere di due tipi:

  • Message Call - semplice interscambio di informazioni
  • Contract Creation - per un nuovo contratto, anche transazione puramente monetaria

Una transazione ha i campi:

  • Nonce - identificativo incrementato ad ogni transazione
  • Gas Price - costo della transazione in Wei.
  • Gas Limit - massimo numero di Wei che il mittente è disposto a pagare
  • To - destinatario
  • Value - valore trasferito
  • Signature - firma crittografica della transazione

Tutte le transazioni sono raccolte in un Patricia Trie, e lo hash della sua radice è un campo della testata del blocco corrente.

Validazione delle Transazioni

Una transazione è valida se:

  • ben formata
  • la firma della transazione è valida
  • il nonce della transazione è uguale a quello dell'emittente
  • non ha ecceduto i limiti di gas
  • il mittente ha fondi per coprire la commissione

Vi è un Sottostato di Transazione, creato durante la transazione e processato al suo termine. E' composto da:

  • Suicide Set - lista degli account da eliminare al termine della transazione
  • Log Series - lista di eventi da comunicare ad applicativi esterni
  • Refund Balance - saldo del gas che deve essere reso

Validazione del Blocco

La validazione di un blocco è composta da:

  • Validazione del Blocco Precedente
  • Validazione degli Uncles - devono essere blocchi validi a loro volta
    • a profondità non superiore a 6 dal blocco corrente
    • non più di 2
  • Validazione delle Transazioni
  • Validazione dello Stato
  • Validazione del Timestamp - successivo a quello del blocco precedente
    • Viene tollerato fino a 15 minuti nel futuro
  • Validazione del Nonce - compatibile con la difficoltà

Accounts

Ethaccount

Un account è un'unità intenzionale che causa il cambiamento di stato tramite transazioni.

Ci sono due tipi di account:

  • Externally Owned Accounts (EOA) - non può inviare codice associato alle transazioni
  • Contract Accounts - invia il codice del contratto assieme alla transazione

Mining

Processo con cui si genera nuova valuta.

Il miner esegue le funzioni:

  • Riceve le nuove transazioni trasmesse in rete e determina quale processare
  • Determina i blocchi Uncle da includere nel blocco corrente
  • Calcola lo hash necessario per un nuovo blocco
  • Aggiorna il saldo contabile con la ricompensa per la produzione del blocco corrente
  • Calcola lo stato finale risultante da tutte le transazioni
  • Sottomette il blocco alla rete e spera di vincere

Il mining si compie solo con un cliente pieno:

  • Chiunque lo può fare
  • Connettersi alla rete e compiere una sincronizzazione
    • Può impiegare del tempo

Consenso

Il Meccanismo di consenso è basato su GHOST (Greedy Heaviest Observed SubTree), un algoritmo di Zohar e Sompolinski, progettato per minimizzare il numero di Stale Blocks.

E' comunque un metodo nella categoria Proof of Work.

Gli Stale Blocks, in Ethereum chiamati Uncle o Ommer vengono inclusi nel Blockchain. Il ramo con più blocchi vince, anche se qualcuno è un uncle, perchè evidentemente ha generato più sforzo, anche se non di successo.

In Bitcoin il ramo più lungo vince:

Bitcons

In Ethereum il ramo più pesante vince:

Ethcons

Obiezioni:

  • appesantimento del Blockchain
  • tentazione di trovare uncles e non blocchi validi

Difficoltà

Sono considerati blocchi validi quelli che superano un certo livello di difficoltà. Questa è data da un numero intero e calcolata con l'algoritmo Ethash. (https://github.com/ethereum/wiki/wiki/Ethash)

L'algoritmo è complesso e l'unica soluzione è data da un approccio di forza bruta. Ethash è concepito per favorire grandi quantità di RAM, anzichè potenza di CPU. Questo consente l'uso di GPU anzichè di ASIC.

Le piattaforme di riferimento per i miners sono:

  • Ubuntu Linux ultima versione
  • EthOS - un linux modificato per il mining di Ethereum (http://ethosdistro.com/)

La difficoltà varia ad ogni blocco nuovo, nel tentativo di mantenere costante il rateo di generazione blocchi a circa 15 secondi. La difficoltà è calcolata dall'espressione:

block_diff = parent_diff + parent_diff / 2048 *  
max(1 - (block_timestamp - parent_timestamp) / 10, -99) +  
int(2**((block.number / 100000) - 2))

La difficoltà aumenta se il rateo è inferiore a 10 secondi, diminuisce se superiore a 20 secondi.

La difficoltà inoltre aumenta esponenzialmente ogni 100.000 blocchi.

Time Bomb

Anche detta Ice Age. L'incremento esponenziale di difficoltà è voluto, per costringere i miners col tempo a passare dal consenso Proof of Work al consenso Proof of Stake, implementato del protocollo Casper e finalizzato nella release Serenity.

Gas

E' un microcosto per l'esecuzione di contratti.

  • Ogni istruzione ha un prezzo in gas.
  • La transazione indica il costo massimo accettabile.

Il fatto che esiste un limite impedisce loop infiniti per errore o per attacchi di Diniego di Servizio.

In caso di gas insufficiente il contratto non viene eseguito e lo stato non viene cambiato. Il mittente si vede però comunque detratto del gas, come commissione.

Il contratto è eseguito da ogni nodo miner. Solo il vincente pone sul Blockchain il nuovo stato dopo la transazione. Il miner vincente riscuote il gas di commissione. Il gas rimanente dopo l'esecuzione e la commissione è ritornato al mittente.

Il contratto viene attivato (triggered) o da un'altra transazione, oppure da un messaggio.

Ricompensa del Miner

Ogni miner riceve la ricompensa corrente per la generazione di un nuovo blocco, al momento di 5 Eth.

Inoltre riceve il gas di commissione per le transazioni incluse nel blocco.

I miners dei blocchi Uncle ricevono i 7/8 della ricompensa.

Anche i miners dei blocchi Stale ricevono una ricompensa, di 1/32 del valore di quella del blocco accettato.