A blockchain is a distributed database that maintains a continuously growing list of ordered records, called blocks. These blocks are linked using cryptography.
2. LF
Blockchain
✦ Struttura dati distribuita ed immutabile
✦ Registro digitale suddiviso in blocchi concatenati in ordine cronologico
✦ Integrità garantita tramite crittografia
2
Blockchain
4. LF
TPSIT - V
✦ L’aggiunta di un nuovo blocco è regolamentata da un meccanismo di consenso
basato su un protocollo condiviso detto validazione o mining
✦ I nodi possono validare più blocchi in contemporanea creando delle biforcazioni
(fork) finché una delle due è risolta: i blocchi non risolti sono abbandonati
(orfani)
✦ Il contenuto validato non è più né modificabile né eliminabile a meno di
invalidare tutti i blocchi successivi, tramite il consenso della maggioranza della
rete
✦ Una volta autorizzata l'aggiunta del nuovo blocco, ogni nodo aggiorna la
propria copia privata
4
Immutabilità
7. LF
TPSIT - V 7
Validazione
✦ Raccolta di nuove transazioni, non ancora validate, con priorità in base a quanto sono
disposti a pagare i proprietari (fee o gas)
✦ Creazione di un blocco formato da:
✦ Index: numero che rappresenta la posizione del blocco nella blockchain
✦ Timestamp: orario di partenza
✦ Transazioni: elenco delle transazioni raccolte
✦ Previous Hash: riferimento al blocco precedente
✦ Merkle Root: contiene l’hash di tutte le transazioni validate nel blocco
✦ Bits o Difficulty Target: livello di difficoltà nel calcolo dell’hash
✦ Nonce: campo libero da utilizzare per individuare l’hash richiesto
8. LF
TPSIT - V 8
Calcolo dell’hash
✦ Validare il blocco si riduce al calcolo dell’hash tramite SHA-256 che rappresenterà in modo
univoco il blocco stesso, ma che deve soddisfare il difficulty target
✦ La difficulty è data dal numero di zeri iniziali richiesti per ottenere un hash valido ed è stabilita
in modo decentralizzato
✦ È definita da un algoritmo che verifica quanta potenza computazionale (o quanti computer) stia
provando a risolvere il puzzle crittografico in un dato momento, verificando il tempo impiegato
per risolvere i puzzle precedenti
✦ Questa tecnica di validazione si chiama Proof of Work (PoW): si richiede la dimostrazione di
aver effettuato un lavoro che ci è costato in termini di tempo e di sforzo (calcolo dell’hash
richiesto con una certa difficulty)
✦ Un’altra tecnica di validazione è la Proof of Stake (PoS): si richiede di dimostrare il possesso di
un certo ammontare di criptovaluta, mediato da varie possibili selezioni: casuale, anzianità,
velocità o voto
✦ Simulazione di ricerca dell’hash
9. LF
Blockchain 9
Smart Contract
✦ Codice memorizzato ed eseguito nella blockchain (Vitalik con Ethereum, 2015)
✦ Come un contratto vero e proprio con valenza giuridica vincola due o più parti tra
loro in un accordo da rispettare, uno scambio di valore, e di questo detta tempi,
regole e modalità
✦ Esegue le clausole che sono state stabilite al momento della “stipula del contratto”,
reagendo a specifiche condizioni operative che possono verificarsi “in corsa”: ogni
volta che una di queste si realizza, il codice si attiva in automatico (IFTTT)
✦ In realtà i contratti intelligenti non sono delle semplici istruzioni IFTTT ma dei veri e
propri pezzi di codice Turing completi: gli Smart Contract potrebbero essere usati
per risolvere qualsiasi problema di calcolo
✦ Essendo caricato su blockchain, il codice è verificabile da chiunque: chiunque può
leggere il codice, vedere come funziona e nessuno, nemmeno chi l’ha scritto, può
modificarne il contenuto (verificabile, immutabile ed incorruttibile)
13. LF
Blockchain 13
Programmare Smart Contract
✦ Linguaggio di programmazione orientato agli oggetti per scrivere contratti
intelligenti su varie piattaforme blockchain, in particolare Ethereum
✦ Ogni programma è eseguito sull’Ethereum Virtual Machine (EVM)
14. LF
Blockchain
pragma solidity >= 0.7.0 <0.8.0;
contract Coin {
address public minter;
mapping (address => uint) public balances;
// Events allow clients to react to specific contract changes you declare
event Sent (address from, address to, uint amount);
// Constructor code is only run when the contract is created
constructor() public {
minter = msg.sender;
}
// Sends an amount of newly created coins to an address
// Can only be called by the contract creator
function mint(address receiver, uint amount) public {
require(msg.sender == minter);
require(amount < 1e60);
balances[receiver] += amount;
}
// Sends an amount of existing coins
// from any caller to an address
function send(address receiver, uint amount) public {
require(amount <= balances[msg.sender], "Insufficient balance.");
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Sent (msg.sender, receiver, amount);
}
}
14
Solidity