Articolo originale: https://www.freecodecamp.org/news/how-does-blockchain-really-work-i-built-an-app-to-show-you-6b70cd4caf7d/

di Sean Han

Secondo Wikipedia, una blockchain è:

Un database distribuito utilizzato per mantenere un elenco di record in continua crescita, chiamati blocchi .

Sembra carino, ma come funziona?

Per illustrare una blockchain, utilizzeremo un'interfaccia a riga di comando open source chiamata Blockchain CLI .

Ho anche creato una versione basata su browser di questo qui .

zSZrnGuYhLmiKeazyIjY-TyzCTcZBjBZoQ1x

Installazione della versione dell'interfaccia della riga di comando

Se non lo hai già fatto, installa Node.js .

Quindi esegui quanto segue nel tuo terminale:

# Clona questo repository
$ git clone https://github.com/seanseany/blockchain-cli

# Vai nel repository
$ cd blockchain-cli

# Installa le dipendenze
$ npm install

# Avvia l'app
$ npm start

Dovresti vedere ? Welcome to Blockchain CLI! e il prompt  blockchain → pronto a ricevere comandi.

Che aspetto ha un blocco?

Per vedere la tua blockchain attuale, inserisci blockchain o bc nel prompt dei comandi. Dovresti vedere un blocco come l'immagine qui sotto.

EJwQgibxDMqIpDvroRN-k5R4CWR5ZZj6-vIw
Un blocco sulla blockchain
  • Indice (blocco n.): quale blocco è? (Il blocco Genesis ha indice 0)
  • Hash: il blocco è valido?
  • Hash precedente: il blocco precedente è valido?
  • Timestamp: quando è stato aggiunto il blocco?
  • Dati: quali informazioni sono memorizzate nel blocco?
  • Nonce: quante iterazioni abbiamo passato prima di trovare un blocco valido?

Blocco Genesis

Ogni blockchain inizierà con ? Genesis Block. Come vedrai più avanti, ogni blocco sulla blockchain dipende dal blocco precedente. Quindi, il blocco Genesis è necessario per estrarre il nostro primo blocco.

Cosa succede quando viene estratto un nuovo blocco?

p0XcmG5w3eBvkxEejjPVd99nNBCzUqrhdxbQ

Estraiamo il nostro primo blocco.  Digita mine freeCodeCamp♥︎ nel prompt.

La blockchain esamina l'ultimo blocco sulla blockchain per l'indice e l'hash precedente. In questo caso il blocco Genesis è l'ultimo blocco.

  • Indice: o+1 = 1
  • Hash precedente: 0000018035a828da0…
  • Timestamp: quando viene aggiunto il blocco
  • Dati: freeCodeCamp❤
  • Hash: ??
  • Nonce: ??

Come viene calcolato l'hash?

Un valore hash è un valore numerico di lunghezza fissa che identifica i dati in modo univoco.

L'hash viene calcolato prendendo l'indice, l'hash del blocco precedente, il timestamp, i dati del blocco e nonce come input.

CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)

L'algoritmo SHA256 calcolerà un hash univoco, dati questi input. Gli stessi input restituiranno sempre lo stesso hash.

Hai notato i quattro 0 iniziali nell'hash del blocco?

I quattro 0 iniziali sono un requisito minimo per un hash valido. Il numero di 0 iniziali richiesti è chiamato difficoltà .

function isValidHashDifficulty(hash, difficulty) {
  for (var i = 0, b = hash.length; i < b; i ++) {
      if (hash[i] !== '0') {
          break;
      }
  }
  return i >= difficulty;
}

Questo è anche noto come il sistema Proof-of-Work .

Cos'è un nonce?

Un nonce è un numero utilizzato per trovare un hash valido.

let nonce = 0;
let hash;
let input;

while(!isValidHashDifficulty(hash)) {     
  nonce = nonce + 1;
  input = index + previousHash + timestamp + data + nonce;
  hash = CryptoJS.SHA256(input)
}

Il nonce itera finché l'hash non è valido. Nel nostro caso, un hash valido ha almeno quattro 0 iniziali. Il processo per trovare un nonce che corrisponda a un hash valido è il mining .

All'aumentare della difficoltà, il numero di possibili hash validi diminuisce. Con meno hash validi possibili, ci vuole più potenza di elaborazione per trovare un hash valido.

Perché è importante?

È importante perché mantiene immutabile la blockchain.

Se abbiamo la seguente blockchain A → B → C, e qualcuno vuole cambiare i dati sul Blocco A. Ecco cosa succede:

  1. Modifiche ai dati sul blocco A.
  2. L'hash del blocco A cambia perché i dati vengono utilizzati per calcolare l'hash.
  3. Il blocco A diventa non valido perché il suo hash non ha più quattro 0 iniziali.
  4. L'hash del blocco B cambia perché l'hash del blocco A è stato utilizzato per calcolare l'hash del blocco B.
  5. Il blocco B diventa non valido perché il suo hash non ha più quattro 0 iniziali.
  6. L'hash del blocco C cambia perché l'hash del blocco B è stato utilizzato per calcolare l'hash del blocco C.
  7. Il blocco C diventa non valido perché il suo hash non ha più quattro 0 iniziali.

L'unico modo per mutare un blocco sarebbe minare di nuovo il blocco e tutti i blocchi successivi. Poiché vengono sempre aggiunti nuovi blocchi, è quasi impossibile mutare la blockchain.

Spero che questo tutorial ti sia stato utile!

Se desideri provare una versione web della demo, vai su http://blockchaindemo.io