Glossario / Transazioni e commissioni
Firma digitale
Noto anche come Firma, Firma ECDSA, Digital signature, Signature.
- Che cos'è una firma digitale?
- Una firma digitale è la prova, prodotta con una chiave privata, che chi ha autorizzato una transazione bitcoin disponeva della chiave a cui erano vincolati i suoi bitcoin, e che i dettagli non sono stati alterati.
Bitcoin non usa più solo ECDSA. I bitcoin agli indirizzi che iniziano con 1, 3 o bc1q si sbloccano con firme ECDSA di 71 o 72 byte; i bitcoin agli indirizzi bc1p usano firme Schnorr di 64 byte, in uso da novembre 2021. In entrambi i casi la firma prova il controllo di una chiave e non prova mai chi sia la persona.
Come funziona
Per produrre una firma servono tre ingredienti: una chiave privata, un numero casuale monouso chiamato nonce e un digest della transazione come ritagliata dal flag scelto per quell'input.
Il risultato è una coppia di numeri calcolati su secp256k1, la curva ellittica che bitcoin usa dalla sua prima versione. La verifica esegue la stessa aritmetica al contrario con la chiave pubblica, e un nodo la esegue dentro l'opcode di script OP_CHECKSIG. In nessuna fase si cifra qualcosa, e la firma non rivela nulla sulla chiave privata che c'è dietro.
I due schemi in uso impacchettano quella coppia in modo diverso. Una firma ECDSA è avvolta in DER, ed è per questo che occupa 71 o 72 byte invece di una lunghezza fissa, e l'ultimo byte non fa affatto parte della firma: è il flag che indica quali parti della transazione sono coperte. Una firma Schnorr secondo BIP340 è di 64 byte esatti senza involucro, e il byte del flag viene del tutto omesso quando si applica il valore predefinito, così 65 byte compaiono solo quando chi firma vuole qualcosa di insolito.
Il nonce è la parte che va storta. Usa lo stesso due volte con la stessa chiave e la chiave privata salta fuori con l'algebra elementare, e non è un timore teorico: l'11 agosto 2013 bitcoin.org ha pubblicato un avviso su un difetto di Android che faceva generare valori ripetuti alle app wallet sugli smartphone colpiti, e di conseguenza sono stati rubati dei bitcoin. Oggi i wallet derivano il nonce in modo deterministico dalla chiave e dal messaggio, seguendo il RFC 6979 per ECDSA e una regola equivalente dentro BIP340.
Dove la vedi
Ogni spesa che fai ne contiene almeno una. Su un block explorer è la lunga stringa esadecimale nel witness di un input segwit o nello script di sblocco di un input legacy, e il 01 finale in quelle ECDSA è il flag, non parte della matematica.
Le firme funzionano anche fuori dalle transazioni. Firmare un semplice messaggio con la chiave dietro un indirizzo prova che disponi di quell'indirizzo senza spostare un satoshi: è così che gli exchange verificano una destinazione di prelievo, come si compongono le attestazioni di prova delle riserve e come un venditore su un marketplace peer-to-peer dimostra che un indirizzo è davvero suo. Il formato originale funzionava solo per gli indirizzi che iniziano con 1; il BIP322 estende la firma dei messaggi a ogni tipo di indirizzo in uso oggi.
Questa distinzione conta ogni volta che qualcuno ti chiede di firmare qualcosa. Un messaggio firmato non può spostare bitcoin. Una firma su una transazione può spostarli tutti, e l'unico modo affidabile per capire quale delle due ti viene chiesta è leggere lo schermo del tuo wallet hardware invece del sito web.
Firma digitale vs signature hash
Il signature hash è l'input; la firma è l'output. Il tuo wallet prima costruisce un digest che copre uno specifico sottoinsieme della transazione, poi firma quel digest, quindi la firma non dice assolutamente nulla sulle parti che il digest ha lasciato fuori. Non è un tecnicismo. È l'intera ragione per cui esistono i flag sighash, e spiega come due firme sulla stessa transazione possano proteggere cose completamente diverse.