Vai al contenuto
buybitcoinsmart

Glossario / Transazioni e commissioni

Signature hash

Noto anche come Sighash.

Che cos'è il signature hash?
Il signature hash è il digest che un wallet firma davvero: una copia ricostruita della transazione, ridotta secondo il flag scelto per quell'input, poi sottoposta due volte a SHA-256.

Specificato nel BIP-143.

Nessuna firma copre la transazione come appare sulla rete. Ogni input riceve il proprio digest, costruito con una procedura riscritta due volte: quella originale del 2009, il BIP143 per gli input segwit e il BIP341 per Taproot. Ciò che il digest lascia fuori è ciò che un attaccante è libero di modificare.

Come funziona

Costruire un signature hash significa creare una copia modificata della transazione e calcolare l'hash di quella copia, non l'hash della transazione che stai per trasmettere.

La procedura originale funziona così. Prendi la transazione, svuota lo script di sblocco di ogni input, inserisci lo script speso nell'unico input che stai firmando, poi conserva, azzera o scarta gli output secondo il flag. Aggiungi in coda il flag come numero di quattro byte, applica SHA-256 due volte all'intero insieme e firma i 32 byte che ne risultano.

Quel progetto aveva un costo che nessuno notò finché le transazioni non crebbero. Poiché ogni input ricostruisce e ricalcola l'hash dell'intera transazione, il lavoro cresce con il quadrato del numero di input. Il BIP143 lo quantifica: verificare un normale blocco da 1 MB richiede qualcosa come 2 secondi, mentre una sola transazione da 1 MB costruita ad arte con 5.569 operazioni di firma può richiedere 25 secondi. Una transazione che blocca ogni nodo della rete per tutto quel tempo è un denial of service in attesa di essere industrializzato.

Il BIP143 ha riscritto la procedura per gli input segwit versione 0 e ha risolto due problemi in una volta. Tre sotto-hash che coprono gli outpoint, i numeri di sequenza e gli output vengono calcolati una volta e riutilizzati per ogni input, il che rende il costo lineare. Ancora più importante per chi detiene bitcoin, il digest ora vincola il valore dell'input che viene firmato. Prima di allora a un dispositivo di firma si doveva comunicare quanto valeva un input senza alcun modo di verificarlo, così un programma malevolo poteva sottostimare gli input e indurre un wallet hardware ad approvare una commissione enorme.

Il BIP341 lo ha riscritto una terza volta per Taproot. Il digest di Taproot è un tagged hash, preceduto da una stringa di dominio perché non possa mai essere scambiato per il digest di un altro protocollo, e vincola gli importi e gli script di blocco di ogni input speso, non solo di quello firmato. Introduce anche un valore predefinito del flag pari a zero, che copre tutto ciò che copre la regola standard ma non viene mai scritto nella firma.

Dove lo vedi

Incontri il signature hash indirettamente, come motivo del comportamento del tuo wallet hardware.

Firmare un input legacy richiede che al dispositivo venga consegnata l'intera transazione precedente, perché è l'unico modo in cui può stabilire da sé il valore dell'input. Sparrow e Electrum trasmettono quelle transazioni a un Trezor o a un Ledger prima di firmare, e su un wallet pieno di bitcoin vecchi è per questo passaggio che una spesa richiede molto più tempo del previsto. Un input segwit necessita solo dell'importo, che il PSBT contiene già.

Si vede direttamente come ultimo byte di una firma legacy o segwit su un block explorer. Una firma che termina con 01 è stata creata con la regola che copre tutto. Qualsiasi altro valore merita di essere capito prima di affidarti alla transazione.

Signature hash vs SIGHASH_ALL

Il signature hash è il digest; SIGHASH_ALL è una delle regole per costruirlo. Ogni firma ha un signature hash, comprese le firme Taproot che non portano alcun byte di flag. Ciò che varia è quali parti della transazione sono entrate nel digest, e il flag è solo l'etichetta di quella scelta. Dire che una transazione "usa SIGHASH_ALL" descrive una regola; dire che ha un signature hash descrive qualcosa che ha avuto ogni firma bitcoin della storia.

Da non confondere con

Domande frequenti

Perché firmare una transazione vecchia richiede così tanto tempo sul mio wallet hardware?

Poiché il signature hash legacy non impegna il valore dell'input, al dispositivo va inviata per intero ogni transazione precedente perché calcoli da sé gli importi. Gli input segwit evitano questo passaggio, ed è per questo che i bitcoin recenti si firmano in pochi secondi.

Il signature hash è la stessa cosa dell'ID della transazione?

No. L'ID della transazione è il digest della transazione così come sarà trasmessa. Un signature hash copre una copia modificata, diversa per ogni input e ogni flag, e non appare mai in nessun punto della catena.

Termini correlati

Altro in Transazioni e commissioni

Leggi questa pagina in inglese