Che cos’è SHA-256 ?

Che cos’è SHA-256 ?

Prima di andare avanti dobbiamo prendere un momento per conoscere le funzioni di hash poiché vengono utilizzate per tutto il protocollo . Per dirla semplicemente, una è solo un algoritmo matematico che prende un input e lo trasforma in un’uscita. Ad esempio, supponiamo di avere un algoritmo che aggiunge tutte le cifre della stringa di input insieme. Se il nostro input è 1234, otterremo un’uscita di 10.

1234 ==> 10

Abbastanza semplice. Tuttavia, ci sono alcune proprietà di funzioni di hash veramente buone che li rendono adatti da utilizzare in crittografia. Tenga presente queste proprietà in quanto essenziali per il funzionamento del protocollo Bitcoin.

  1. Dovrebbe essere molto facile calcolare un’uscita per ogni dato input, tuttavia dovrebbe essere impossibile (data la conoscenza attuale della matematica e dello stato dei computer) per calcolare l’input di una determinata uscita pur conoscendo l’algoritmo matematico. Considerate, nell’esempio precedente possiamo facilmente calcolare un’uscita di 10 dato l’ingresso di 1234, tuttavia andare in retromarcia non è così facile. In questo caso ci sono molti ingressi possibili che potrebbero aggiungere fino a 10 (55, 136, 7111, ecc.). Tuttavia, data la semplicità della nostra funzione si potrebbe ancora capire l’ingresso relativamente facilmente. Alcune funzioni hash crittografiche, d’altra parte, sono detto di essere infrangibile anche dai computer quantistici.
  2. A differenza del nostro esempio, ogni uscita potenziale deve mappare solo un input. Se due ingressi differenti possono produrre la stessa uscita, si chiama collisione di hash. Buon algoritmi di hash crittografici sono resistenti a tali collisioni.
  3. Una funzione hash dovrebbe essere in grado di prendere ingressi di dimensione variabile e trasformarli in output di dimensione fissa. Per esempio:
    hello ==> 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 goodbye ==> 82e35a63ceba37e9646434c5dd412ea577147f1e4a41ccde1614253187e3dbf9

    L’uscita deve essere la stessa lunghezza, indipendentemente dal fatto che l’input abbia 10 caratteri o 10 mila caratteri.

  4. Una piccola modifica dell’ingresso dovrebbe produrre un’output completamente diversa che in nessun modo riguarda l’input originale. Esempio:
    hello world ==> 98c615784ccb5fe5936fbc0cbe9dfdb408d92f0f Hello World ==> a830d7beb04eb7549ce990fb7dc962e499a27230 Hello World! ==> 8476ee4631b9b30ac2754b0ee0c47e161d3f724c Hello, World ==> 6782893f9a818abc3da35d745a803d72a660c9f5

Bitcoin utilizza pesantemente la funzione di hash crittografica SHA256 , che rappresenta il 256 bit di Algoritmo Secure Hash. Incidentalmente, gli algoritmi SHA sono stati originariamente sviluppati dalla NSA. Si potrebbe chiedere come possiamo fidarci di qualcosa che proveniva dalla NSA. Questa è certamente la causa di essere sospettosi, tuttavia, gli algoritmi sono parte del dominio pubblico e sono stati verificati e analizzati dai crittografi che sanno cosa stanno facendo. Il consenso è che sono sicuri.

Alberi di Merkle

Ora che abbiamo i preliminari fuori dal modo in cui possiamo iniziare a concentrarci sul protocollo. Se leggi la Parte 1, ricorderete che tutte le transazioni Bitcoin vengono trasmesse a ciascuno dei coetanei della rete. I minatori raccolgono queste transazioni, eseguono una serie di controlli per assicurarsi che siano validi, quindi aggiungerli al loro pool di memoria. È a questo punto che iniziano il processo di creazione di un blocco.

Il primo passo nel processo è di hash ogni nel pool di memoria utilizzando SHA256. I dati della transazione crude possono sembrare qualcosa di simile:

01000000017a06ea98cd40ba2e3288262b28638cec5337c1456aaf5eedc8e9e5a20f062bdf000000008a473044022030e2d23be71a907a3ad7de846b3bbe8886c4a839e1aa2cf0d314b1d327f12d2a022039718fc3886a171e4ec2b138e6547b03dd326ef7f12295d06e351e7c02010068014104e0ba531dc5d2ad13e2178196ade1a23989088cfbeddc7886528412087f4bff2ebc19ce739f25a63056b6026a269987fcf5383131440501b583bab70a7254b09effffffff01b02e052a010000001976a9142dbde30815faee5bf221d6688ebad7e12f7b2b1a88ac00000000

Una volta sparirà apparirà così:

2d94683fa2f8aaae4a6f377d93b875f680adf96b9c3e9577554b742f412fa9ad

Questi hash sono poi organizzati in qualcosa chiamato albero Merkle o albero hash. Se sei a conoscenza di come appartiene una staffa di tornei NCAA, capirete questo concetto. Gli hash delle transazioni sono organizzati in coppie di due, concatenati insieme, poi ripetuti. Lo stesso vale per ogni serie di uscite fino a formare qualcosa come un albero (o una staffa NCAA).

Nell’esempio precedente sono presenti solo quattro transazioni (tx rappresenta la transazione). Un blocco reale contiene centinaia di operazioni in modo che la staffa (albero) sarà molto più grande. L’hash nella parte alta dell’albero è chiamato la radice di Merkle.

A proposito, non ti preoccupare se ancora non capisci perché le transazioni siano organizzate in un albero di Merkle, le mettiamo insieme abbastanza presto e poi tutto “clicca”.

La radice Merkle di questo albero di hash viene inserita nell’intestazione del blocco insieme all’hash del blocco precedente (da spiegare più avanti) e un numero casuale chiamato nonce (anche da spiegare più avanti). L’intestazione di blocco apparirà qualcosa di simile:

L’intestazione del blocco viene quindi strofinata con SHA256 che produce un’uscita che servirà come identificatore del blocco. Ora, dopo aver fatto tutto questo, possiamo andare avanti e trasmettere il blocco al resto della rete? Se ricordi l’ultimo post, la risposta è no. Dobbiamo ancora produrre una valida prova di lavoro.

Prova del lavoro

Il protocollo Bitcoin imposta un valore di destinazione per un hash di intestazione di un blocco. L’output deve essere inferiore al numero specificato. Un altro modo per dire questo è che il hash dell’intestazione di blocco deve iniziare con un certo numero di zeri. Ad esempio, un hash valido può essere simile a questo:

  000000000000002e9067f1cf7252333f7aeb619c89d220985a70ac0e015248e0

Ogni blocco il cui header non produce un hash inferiore al valore di destinazione verrà rifiutato dalla rete. Il valore di destinazione viene regolato dal protocollo ogni due settimane per cercare di mantenere un tempo di blocco medio di 10 minuti.

Quindi, dopo aver eliminato ogni transazione, ha estratto le uscite in un albero di hash, trovato la radice di Merkle, aggiunto all’intestazione di blocco con l’hash del blocco precedente e un nonce, ha strappato l’intestazione e ha prodotto un’output che non si avvia Con il giusto numero di zeri, allora cosa?

Questo è dove entra il nonce. Il nonce è semplicemente un numero casuale che viene aggiunto all’intestazione di blocco per nessun altro motivo che darci qualcosa da incrementare nel tentativo di produrre un hash valido. Se il primo tentativo di hashing l’intestazione produce un hash non valido, è sufficiente aggiungere uno al nonce e rehash l’intestazione e quindi verificare se tale hash è valido.

Ad esempio, supponiamo che volessimo avere hash “Hello world!” In modo che l’output iniziato con almeno tre zeri. Potresti concatenerlo con un nonce, averlo fatto e controllato l’output per vedere se è valido. Se non lo è, aggiungerai uno alla nonce e riprova.

  "Ciao, mondo! 0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
 "Ciao, mondo! 1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
 "Ciao, mondo! 2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7
 ...
 "Ciao, mondo! 4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965
 "Ciao, mondo! 4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6
 "Ciao, mondo! 4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

In questo esempio ci sono voluti 4.251 tentativi di trovare un nonce tale che quando concatenato con “Ciao, mondo!” Ha prodotto un’uscita che inizia con almeno tre zeri.

Questo è Bitcoin estrazione mineraria in poche parole. Si noti che l’intero blocco delle transazioni non è riassorbito con ogni tentativo, solo l’intestazione. Questo è essenzialmente quello che la Bitcoin è, solo rehashing l’intestazione di blocco, oltre e oltre, e oltre, fino a quando un minatore nella rete in fine produce un hash valido. Quando lo fa, rilascia il blocco al resto della rete. Tutti gli altri minatori controllano il suo lavoro e assicurano che sia valido. Se è così, aggiungeranno il blocco alla loro copia locale della catena di blocchi e continueranno a trovare il blocco successivo.

Nei vecchi giorni i minatori hanno appena eseguito i calcoli SHA256 sulla CPU del computer portatile. Tuttavia, più hash che è possibile eseguire al secondo, maggiore è la probabilità che taglierai un blocco e guadagnerai la ricompensa del blocco. L’estrazione della CPU ha lasciato rapidamente il via alla miniera di GPU (unità di elaborazione grafica) che si è dimostrata molto più efficiente nel calcolo delle funzioni di hash. Nel mondo attuale, i minatori stanno utilizzando ASIC (circuiti integrati specifici per applicazioni) per il mio Bitcoin. Fondamentalmente, questi sono chip progettati per scopi progettati per eseguire calcoli SHA256 e non fare altro. Non è raro vedere i minatori che calcolano oltre un trilione di hashi al secondo (un terrahash). Al momento, la potenza totale di hashing nella rete è di circa 700 terrahash al secondo e si chiude su un petahash al secondo.

Vorrei anche notare a questo punto che la prima transazione in ogni blocco è denominata transazione “coinbase”. Questa è una transazione in cui il minatore invia 25 bitcoins appena creati “fuori dall’aria sottile”. Poiché ogni minatore invia questi 25 bitcoins al proprio indirizzo, la prima transazione in ogni blocco differirà da minatore a minatore. Ora ricordate le proprietà di una funzione hash crittografica? Se un ingresso cambia anche nel minimo, l’intera uscita cambia. Poiché l’hash della transazione moneta alla base dell’albero di hash è diverso per ogni minatore, l’intero albero di hash includendo la radice di Merkle sarà diverso per ogni minatore. Ciò significa che il nonce che è necessario per produrre un blocco valido sarà anche diverso per ogni minatore.

Questo è il motivo per cui l’albero di Merkle è impiegato dopo tutto. Le transazioni sono rappresentate nell’intestazione da parte della Merkle Root in modo che l’intero blocco di transazioni non debba essere ripreso con ogni tentativo (che renderebbe necessario il tempo necessario per estrarre un blocco a seconda del numero di transazioni). Qualsiasi modifica di una singola transazione provocherà una valanga verso l’alto dell’albero di hash che causerà in ultima analisi la modifica del hash del blocco. Ora vediamo come questo protegge la rete dall’attacco.

Chaining Hash

Il hash di ogni blocco è incluso nell’intestazione del blocco successivo come tale:

Se un aggressore vuole modificare o rimuovere una transazione già presente nella catena di blocchi, l’alterazione provocherà la modifica della hash della transazione e scintilla le modifiche fino a raggiungere l’albero di hash nella Merkle Root. Dato le probabilità, è improbabile che un’intestazione con la nuova Merkle Root produrrà un hash valido (la prova del lavoro). Dunque, l’attaccante dovrà recuperare l’intera intestazione del blocco e trascorrere una tonnellata di tempo per trovare il nonce corretto. Ma supponiamo che faccia questo, può solo trasmettere il suo blocco fraudolento alla rete e spero che i minatori sostituiranno il vecchio blocco con il suo nuovo o, più realisticamente, che i nuovi utenti scaricheranno il suo blocco fraudolento? No. Il motivo è perché il hash di ogni blocco è incluso nell’intestazione del blocco successivo. Se l’attaccante rehashes blocco numero 100, questo causerà l’intestazione del blocco 101 a cambiare, richiedendo che anche il blocco di essere rehashed pure. Una modifica al hash del blocco 101 determinerà l’intestazione del blocco 102 e così via tutta la catena di blocchi. Qualsiasi tentativo di modificare una transazione già presente nella catena di blocchi richiede non solo il rehash del blocco contenente la transazione, ma anche tutti gli altri blocchi successivi. A seconda della profondità della catena che la transazione è, potrebbe richiedere un singolo attaccante settimane, mesi o anni, per recuperare il resto della catena di blocchi. E come ho accennato nella Parte 1, finché l’attaccante non controlla la maggioranza della potenza di elaborazione nella rete, il resto della rete aggiungerà nuovi blocchi alla catena principale più velocemente di quanto l’attaccante possa aggiungere blocchi alla sua rete Catena fraudolenta, garantendo che la legittima catena rimanga la più lunga e la catena dell’attaccante viene ignorata.

Sei conferme

L’unica eccezione alla regola di cui sopra è se l’attaccante diventa semplicemente fortunato. Come abbiamo notato, l’intero network dura in media 10 minuti per trovare un blocco valido. Dovrebbe prendere un solo attaccante con, per esempio, il 10% della potenza di elaborazione nella rete per 100 minuti per trovare un blocco valido (200 minuti al 5% ecc.), Ma sono solo le medie. È teoricamente possibile che un attaccante possa avere fortuna e un blocco in un minuto quando dovrebbe averlo in media di 100 minuti. Se quel blocco contenesse una doppia spesa, è possibile che la transazione fraudolenta dell’attaccante venga inclusa nella catena di blocchi e la sua transazione legittima sia rifiutata (il resto della rete potrebbe pensare che la transazione legittima sia la duplice spesa). Quanto più una transazione è nella catena di blocchi, tuttavia più volte in fila l’attaccante avrebbe bisogno di avere fortuna e un blocco prima che il resto della rete estenda la catena più lunga della catena principale. Da un punto di vista probabile, le probabilità di un tale attacco diminuiscono in modo esponenziale con ogni blocco successivo. È un po ‘come vincere la lotteria più volte in una fila. Nel libro bianco originale Satoshi Nakamoto ha calcolato le probabilità che un attaccante possa avere fortuna e tirare fuori una spesa doppia. Nella seguente tabella q è la percentuale della rete controllata dall’attaccante, P è la probabilità che un aggressore possa avere fortuna e ignorare il numero di blocchi z.

q=0.1 z=0 P=1.0000000 z=1 P=0.2045873 z=2 P=0.0509779 z=3 P=0.0131722 z=4 P=0.0034552 z=5 P=0.0009137 z=6 P=0.0002428 z=7 P=0.0000647 z=8 P=0.0000173 z=9 P=0.0000046 z=10 P=0.0000012 q=0.3 z=0 P=1.0000000 z=5 P=0.1773523 z=10 P=0.0416605 z=15 P=0.0101008 z=20 P=0.0024804 z=25 P=0.0006132 z=30 P=0.0001522 z=35 P=0.0000379 z=40 P=0.0000095 z=45 P=0.0000024 z=50 P=0.0000006 Solving for P less than 0.1%... P < 0.001 q=0.10 z=5 q=0.15 z=8 q=0.20 z=11 q=0.25 z=15 q=0.30 z=24 q=0.35 z=41 q=0.40 z=89 q=0.45 z=340

Tenuto conto delle probabilità di cui sopra possiamo vedere che un attaccante con il 10% della potenza di elaborazione della rete avrebbe una probabilità di 0,024% di fortuna e di sei blocchi superiori. Quale è il motivo per cui si raccomanda di vendere qualcosa di costoso, attendere che la transazione sia di sei blocchi profondi (sei conferme in Bitcoin lingo) prima di consegnare la merce.