Vai al contenuto
buybitcoinsmart

Glossario / Transazioni e commissioni

SIGHASH_SINGLE

Che cos'è SIGHASH_SINGLE?
SIGHASH_SINGLE è il flag che lega una firma a una sola uscita, quella che occupa nella lista la stessa posizione dell'input che viene firmato.

L'input zero è abbinato all'uscita zero, l'input uno all'uscita uno, e tutto il resto della transazione resta non firmato. Il meccanismo consente a più parti di garantire ciascuna il proprio pagamento all'interno di un'unica transazione condivisa. Porta anche il bug di firma più famigerato di bitcoin, che gli input legacy contengono ancora.

Come funziona

Il digest conserva l'input che viene firmato, la versione della transazione, il locktime ed esattamente un'uscita: quella il cui indice corrisponde all'indice dell'input.

Le uscite successive a quell'indice vengono rimosse dalla copia prima dell'hashing. Le uscite precedenti vengono mantenute come segnaposto ma svuotate, con un valore di meno uno e uno script vuoto, così nemmeno il loro contenuto reale è coperto. I numeri di sequenza di tutti gli altri input vengono azzerati, come avviene con il flag senza uscite.

Poi arriva il bug. Nell'algoritmo originale, se l'indice dell'input che viene firmato è maggiore o uguale al numero di uscite, non c'è nessuna uscita corrispondente da sottoporre a hash. Invece di fallire, il codice restituisce un digest fisso: il valore uno di 32 byte. Ogni firmatario che finisce in quella posizione produce una firma sullo stesso identico digest, quindi la firma non è legata ad alcuna transazione particolare e può essere prelevata e riprodotta da chiunque sia in grado di collocare un input allo stesso indice. Il ramo sopravvive in Bitcoin Core ancora oggi, perché eliminarlo cambierebbe la validità dei bitcoin già presenti sulla catena.

Entrambe le riscritture dell'algoritmo di hash della firma lo hanno chiuso. Il BIP143 specifica che per un input segwit versione 0 senza uscita corrispondente, la parte delle uscite del digest è di 32 byte zero, mentre il resto del digest continua a impegnarsi su quell'input specifico, così nulla è riproducibile. Il BIP341 va oltre: su un input Taproot, una firma di questo tipo con un indice oltre il numero delle uscite semplicemente non supera la validazione.

Dove lo vedi

Il flag compare come un 03 finale su una firma, e lo troverai quasi esclusivamente dentro offerte pre-firmate e non nei pagamenti ordinari.

Lo schema è mezza transazione pubblicata come invito. Un venditore firma la dichiarazione «questo mio input entra, e l'uscita all'indice corrispondente mi paga il prezzo che chiedo», poi lascia il resto della transazione in bianco perché un acquirente lo riempia. Poiché la firma del venditore ignora ogni altro input e ogni altra uscita, l'acquirente può aggiungere fondi propri, il proprio resto e una commissione al tasso che la mempool richiede, e la garanzia del venditore resta valida. I marketplace di Ordinals e Runes si fondano esattamente su questo, distribuito come PSBT, ed è uno dei pochi scambi davvero trustless che bitcoin consente senza terze parti in mezzo.

È quasi sempre abbinato ad ANYONECANPAY, perché da solo il flag continua a impegnarsi sull'intera lista degli input, il che vanifica lo scopo di lasciare la transazione aperta perché qualcun altro la completi.

SIGHASH_SINGLE vs SIGHASH_ANYONECANPAY

SIGHASH_SINGLE è una modalità di base e SIGHASH_ANYONECANPAY è un modificatore, quindi rispondono a domande diverse. La modalità di base decide quanta parte del lato uscite copre una firma: tutta, nessuna, o un'uscita corrispondente. Il modificatore decide quanta parte del lato input copre: ogni input, o solo quello che viene firmato. Scegli una modalità di base, poi decidi separatamente se aggiungere il modificatore, ed è per questo che il byte del flag su una firma reale è di solito la somma dei due anziché uno solo dei due.

Da non confondere con

Domande frequenti

Che cos'è il bug di SIGHASH_SINGLE?

Nell'algoritmo di firma originale, un indice di input senza uscita corrispondente produce un digest fisso con il valore uno invece di un errore. Una firma su quel digest non è legata ad alcuna transazione e può essere riutilizzata da qualcun altro, quindi i wallet non devono mai firmare in quella posizione.

Il bug è ancora sfruttabile?

Solo sugli input legacy, che eseguono ancora l'algoritmo originale. Gli input segwit seguono il BIP143 e calcolano invece l'hash di byte zero, e gli input Taproot rifiutano il caso del tutto ai sensi del BIP341, quindi i bitcoin detenuti su indirizzi bc1 non sono interessati.

Termini correlati

Altro in Transazioni e commissioni

Leggi questa pagina in inglese