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).
Struttura del Blocco
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
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
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:
In Ethereum il ramo più pesante vince:
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.