Vai al contenuto
buybitcoinsmart

Glossario / Riferimento per sviluppatori

OP_HASH160

Che cos'è OP_HASH160?
OP_HASH160 applica SHA-256 all'elemento in cima allo stack e poi RIPEMD-160 a quel risultato, lasciando un digest di 20 byte, la stessa impronta contenuta in ogni indirizzo che inizia con 1 o 3.

Un byte, 0xa9, che sta al posto di due delle funzioni hash più studiate della crittografia. L'abbinamento riduce un output di 32 byte a 20 e protegge da una debolezza in uno dei due algoritmi, al costo di circa 80 bit di resistenza alle collisioni invece di 128. È il motivo per cui un indirizzo bitcoin è abbastanza corto da leggere ad alta voce al telefono.

Come funziona

OP_HASH160 preleva un elemento di qualsiasi lunghezza e ne inserisce esattamente 20 byte, e lo stesso input produce sempre lo stesso digest.

Le due funzioni provengono da linee di progettazione senza legami. RIPEMD-160 è stata pubblicata nel 1996 da un gruppo accademico europeo che lavorava apertamente; SHA-256 è nata in seno alla NSA ed è stata standardizzata dal NIST nel 2001. Concatenarle è stata una scelta prudente. Una rottura strutturale di una delle due lascerebbe comunque l'altra tra un attaccante e una falsificazione utile, e in tre decenni nessuna delle due è stata infranta in un modo che minacci questa costruzione.

La riduzione di dimensione non è estetica. Risparmiare dodici byte su ogni output contava quando l'obiettivo era mantenere piccolo un registro globale permanente, ed è il motivo per cui il classico script di blocco misura 25 byte invece di 37.

Venti byte hanno però un tetto. Trovare due input che condividono un digest di 160 bit richiede dell'ordine di 2 alla 80ª operazioni invece di 2 alla 128ª, il che è accettabile quando sei solo tu a scegliere la chiave di cui si calcola l'hash e molto meno rassicurante quando una controparte contribuisce a scegliere lo script su cui ci si impegna. Questo ragionamento è esattamente il motivo per cui il segregated witness ha spostato gli impegni sugli script a un unico SHA-256 di 32 byte in P2WSH, mantenendo la forma più corta per gli output a chiave singola.

Dove lo vedi

OP_HASH160 vive in due modelli di script, e il suo output vive dentro quasi ogni indirizzo che tu abbia mai copiato.

Gli output legacy lo eseguono su una chiave pubblica. Gli output pay-to-script-hash lo eseguono su un redeem script. In entrambi i casi l'indirizzo che vedi è quel digest di 20 byte preceduto da un byte di versione, 0x00 per gli indirizzi che iniziano con 1 e 0x05 per quelli che iniziano con 3, avvolto in un checksum Base58Check. Gli output segwit nativi a chiave singola portano gli stessi 20 byte senza alcun opcode presente, perché le regole per quel tipo di output sono incorporate nel validatore invece di essere scritte come script.

Taproot ha rotto l'abitudine. Un output bc1p si impegna su una chiave pubblica di 32 byte senza alcun passaggio di hashing intermedio, quindi un indirizzo Taproot non contiene alcun hash160 da nessuna parte.

Questa è anche la ragione pratica per cui controllare un indirizzo sullo schermo di un wallet hardware funziona. Due indirizzi che differiscono in qualsiasi punto producono due digest senza alcun legame, quindi un indirizzo sostituito non può sembrare quasi giusto; confrontare la prima e l'ultima manciata di caratteri sul dispositivo con ciò che mostra il tuo computer basta per individuare il malware degli appunti.

OP_HASH160 vs SHA-256

SHA-256 è una funzione hash; OP_HASH160 è un'istruzione che si limita a richiamarla una volta. La funzione compare ovunque in bitcoin senza alcuno script coinvolto: la proof of work calcola con essa due volte l'hash di un'intestazione di blocco, gli identificatori delle transazioni sono una doppia applicazione della stessa e gli alberi di Merkle sono costruiti con essa. L'opcode esiste solo dentro Bitcoin Script, viene eseguito solo mentre un output viene speso e restituisce sempre 20 byte invece di 32. La composizione che esegue, RIPEMD-160 di SHA-256, è abbastanza comune da avere un nome proprio nel codice dei wallet, hash160, che vale la pena riconoscere quando scorri l'elenco delle funzioni di una biblioteca software.

Da non confondere con

Domande frequenti

Perché bitcoin calcola l'hash due volte con due algoritmi diversi?

Due motivi. Il secondo hash riduce il digest da 32 byte a 20, il che accorcia ogni indirizzo e ogni script di output, e usare due progetti senza legami significa che una rottura di un solo algoritmo non basterebbe a falsificare una corrispondenza.

Un hash di 20 byte è ancora sicuro?

Per un normale indirizzo a chiave singola, sì. Il caso più debole è uno script in cui qualcun altro sceglie parte del contenuto di cui si calcola l'hash, ed è per questo che il segregated witness si impegna sugli script con un SHA-256 completo di 32 byte.

Leggi anche

Termini correlati

Altro in Riferimento per sviluppatori

Leggi questa pagina in inglese