Sighash flag

Difficoltà: avanzato

Argomento: tecnologia


DEFINIZIONE

Chi usa Bitcoin di solito dà per scontato che quando si vuole spendere i propri bitcoin, sia sufficiente firmare una transazione con la propria chiave privata.

Questo è vero, ma è una eccessiva semplificazione. Le transazioni Bitcoin possono essere firmate in diversi modi, e questi modi vengono definiti SIGHASH. Il Sighash viene codificato nella parte della firma della transazione.

Una signature, firma un hash di dati, e quindi una firma attribuisce certezza ad un pezzo di dati, ovvero ne effettua il commitment. Se i dati vengono modificati dopo la creazione della firma, la firma viene invalidata. Pertanto, una firma è un commitment verso un determinato insieme di dati. Una firma può quindi effettuare il commitment solo ad un sottoinsieme dei dati in una transazione, e questo rende le firme utili per una serie di scenari.

La presenza di più tipi di firma ci permette di creare transazioni innovative che non si limitano a spendere Bitcoin.

Il Sighash flag, flag dell'hash (sighash) della signature o della firma, è una piccola parte di ogni input di una transazione che determina quali parti della transazione diventano immutabili una volta che una firma è stata aggiunta alla transazione.

Bisogna inoltre ricordare che una transazione può avere diversi input, e ogni input può contenere una diversa firma nel suo script di sblocco ScriptSig. Di conseguenza, una transazione che contiene più input può avere firme con flag SIGHASH diversi che effettuano il commit a parti diverse della transazione in ciascuno degli input. Si noti anche che le transazioni bitcoin possono contenere input di diversi "proprietari", che possono firmare solo un input in una transazione parzialmente costruita (e non valida), collaborando con altri per raccogliere tutte le firme necessarie a creare una transazione valida. Molti dei tipi di flag SIGHASH hanno senso solo se si pensa a più partecipanti che collaborano al di fuori della rete bitcoin e aggiornano una transazione parzialmente firmata.

Notare che i flag SIGHASH raramente vengono presentati come opzione nei wallet portafoglio. I wallet che costruiscono gli script P2PKH generalmente li firmano con i flag SIGHASH_ALL. Per utilizzare un flag SIGHASH diverso, può essere necessario scrivere un software per costruire e firmare le transazioni.

Il flag sighash determina su quale insieme di dati all'interno della transazione è stato fatto il commitment, ed esistono tre flag SIGHASH: ALL, NONE e SINGLE.

SIGHASH flag Valore Descrizione
ALL 0x01 La firma si applica a tutti gli input e gli output
NONE 0x02 La firma si applica a tutti gli input, ma a nessun output.
SINGLE 0x03 La firma si applica a tutti gli input, ma solo all'output con lo stesso numero di indice dell'ingresso firmato

Inoltre, esiste un flag di modifica SIGHASH_ANYONECANPAY, che può essere combinato con ciascuno dei flag precedenti. Quando ANYONECANPAY è impostato, solo un input viene firmato, lasciando gli altri (e i loro numeri di sequenza) aperti alla modifica. ANYONECANPAY ha il valore 0x80 e viene applicato mediante OR bitwise, ottenendo i flag combinati come mostrato in Tipi di SIGHASH con modificatori e relativi significati.

I valori possibili di Sighash flag sono:

  • SIGHASH_ALL = 1
  • SIGHASH_NONE = 2
  • SIGHASH_SINGLE = 3
  • SIGHASH_ANYONECANPAY = 0x80

SIGHASH_ALL

Quasi tutte le transazioni utilizzano il flag sighash SIGHASH_ALL, il che significa che la firma di ogni ingresso è valida solo se tutti gli altri input e output rimangono invariati.

Altri flag sighash consentono di mantenere valida la firma di un ingresso anche se altri ingressi o uscite vengono modificati.

SIGHASH_SINGLE

All'interno di una transazione, ogni ingresso richiede la propria firma e quindi il proprio flag sighash. Ciò significa che gli input possono essere costruiti in modo flessibile. Quando più parti contribuiscono con gli input a una determinata transazione, possono preoccuparsi solo dei propri output specifici. Ad esempio, se Alice contribuisce con 1 BTC a una transazione e si aspetta 1,2 BTC in cambio, probabilmente le interessa solo che il suo output di 1,2 BTC sia garantito alla firma. In questo caso, Alice potrebbe utilizzare il flag SIGHASH_SINGLE. Questo flag impegna tutti gli input, ma solo un singolo output. Ciò consentirebbe alle altre parti della transazione di aggiungere e modificare i propri output a piacimento, purché non alterino l'output di 1,2 BTC di Alice.

SIGHASH_NONE

In alternativa, nel raro caso in cui una parte della transazione non si preoccupi di quali siano gli output, può utilizzare il flag Sighash SIGHASH_NONE, che impegna tutti gli input ma non gli output.

SIGHASH_ANYONECANPAY

Infine, il flag SIGHASH_ANYONECANPAY assicura che solo l'input in questione sia firmato, mentre gli altri tre flag sighash da soli assicurano che tutti gli input siano firmati. Questo flag sighash può essere combinato con qualsiasi altro flag sighash per controllare quali uscite e quali ingressi sono firmati.

Uso pratico di combinazioni dei Sighash flag

Ecco come alcune combinazioni dei valori di Sighash flag possono essere utilizzate nella pratica:

ALL | ANYONECANPAY

Può essere utile per realizzare una transazione in stile "crowdfunding". Chi cerca di raccogliere fondi può costruire una transazione con un singolo output. Il singolo output paga l'importo "obiettivo" al raccoglitore di fondi. Una transazione di questo tipo non è ovviamente valida, poiché non ha input. Tuttavia, altri possono modificarla aggiungendo un proprio input, come donazione. Essi firmano il loro input con ALL|ANYONECANPAY. Se non viene raccolto un numero sufficiente di input per raggiungere il valore dell'output, la transazione non è valida. Ogni donazione è una "promessa", che non può essere riscossa da chi raccoglie i fondi finché non viene raggiunto l'intero obiettivo.

NONE

Può essere usato per creare un "assegno al portatore" o un "assegno con destinatario in bianco" di un importo specifico. Questa transazione non verrebbe trasmessa alla rete da chi la crea, ma consegnata a qualcuno senza impostare l'indirizzo di destinazione, e chi la riceve può scrivere il proprio indirizzo bitcoin e riscattare l'importo. Tramite una transazione di questo tipo si può fare il commit sull'input, lasciando la possibilità di modificare il locking script dell'output.

NONE | ANYONECANPAY

Può essere usato per costruire un "dust collector", raccoglitore di dust o polvere. Gli utenti che hanno piccoli UTXO nei loro wallet non possono spenderli perché il costo delle fee ne supera il valore. Con questo tipo di firma, le UTXO dust possono essere donati perché chiunque possa aggregarli e spenderli quando vuole.

Evoluzioni future di sighash

In futuro, al protocollo Bitcoin potrebbero essere aggiunti altri flag sighash, per consentire casi d'uso più flessibili, ma per ora solo i quattro sopra citati sono considerati validi.

Esistono già alcune proposte per modificare o espandere il sistema SIGHASH. Una di queste proposte è Bitmask Sighash Modes di Glenn Willen di Blockstream, nell'ambito del progetto Elements. L'obiettivo è quello di creare un sostituto flessibile per i tipi di SIGHASH che consenta "bitmask arbitrarie, riscrivibili dal miner, di ingressi e uscite" in grado di esprimere "schemi contrattuali di preimpegno più complessi, come le offerte firmate con modifica in uno scambio di beni distribuito".

SIGHASH_ANYPREVOUT è la proposta di un nuovo tipo di flag sighash, che firma la maggior parte della transazione, ma non gli input. Ciò significa che gli input possono essere scambiati, purché i nuovi input siano ancora compatibili con la firma.


aggiornato il 2022-09-30