Glossario / Transazioni e commissioni
SIGHASH_NONE
- Che cos'è SIGHASH_NONE?
- SIGHASH_NONE è il flag che firma gli input di una transazione senza impegnarsi su nessuno dei suoi output, il che lascia la destinazione del denaro aperta a chiunque la gestisca.
Trattalo come un assegno in bianco. Un input SIGHASH_NONE autorizza la spesa e non dice nulla su chi viene pagato, quindi un miner o qualsiasi nodo che la rilancia può riscrivere ogni output prima che la transazione si confermi. Il suo valore è 2, nessun wallet per il pubblico offre questa opzione e, se dovessi vederla in una tua transazione, qualcosa è andato storto.
Come funziona
Costruire questo digest significa eliminare del tutto la lista degli output prima di calcolare l'hash.
Ciò che resta è comunque sostanziale: la versione della transazione, l'outpoint dell'input che viene firmato, il numero di sequenza di quell'input stesso, lo script che sta spendendo e il locktime. I numeri di sequenza di tutti gli altri input vengono azzerati, una seconda libertà, perché consente ai cofirmatari di regolare i propri timelock relativi quando questa firma esiste già.
Ciò che non resta è proprio il punto. Senza nessun output coperto, la firma dice solo che questa moneta può essere spesa in una transazione di questa versione a partire da questo momento. Chi detiene la transazione a metà costruzione sceglie dove va il valore, e questo include chiunque la veda sulla rete, dato che una transazione non confermata è pubblica dal momento in cui viene diffusa.
Aggiungi il modificatore ANYONECANPAY e il byte diventa 0x82, la firma più debole che bitcoin possa produrre: copre un input e nient'altro.
Il flag esiste dalla prima versione, del gennaio 2009, e non è mai stato rimosso, perché rimuoverlo lascerebbe bloccati bitcoin vincolati prima che qualcuno pensasse alle conseguenze. BIP143 e BIP341 lo hanno entrambi reimplementato fedelmente per segwit e Taproot invece di eliminarlo in silenzio.
Dove lo vedi
SIGHASH_NONE non compare quasi da nessuna parte, ed è esattamente ciò che dovresti aspettarti.
L'uso teorico è un protocollo in cui una parte apporta fondi e una controparte sceglie la destinazione, con quella controparte vincolata da qualcosa al di fuori della firma. Nessuna applicazione bitcoin largamente usata funziona così. Le costruzioni che richiedono input flessibili ricorrono invece ad ANYONECANPAY, e le costruzioni che richiedono output flessibili usano alternative pre-firmate in cui le possibili destinazioni sono fissate in anticipo.
Quindi una firma SIGHASH_NONE in circolazione è un bug o un furto in corso. Le mempool sono sorvegliate di continuo da bot che cercano anomalie spendibili, e una transazione che ne porta una non resterà a lungo lì senza che nessuno la noti. Chi scrive codice di firma dovrebbe trattare il flag come un intero che non viene mai passato, e chi controlla un sistema di custodia dovrebbe confermare che il flag sia una costante e non un parametro fornito da chi chiama.
Per chi compra e conserva bitcoin la conclusione è breve: non ti imbatterai in questo, il tuo wallet non te lo offrirà, e un software che ti chiede di firmare con questo flag è un software da cui allontanarsi.
SIGHASH_NONE vs SIGHASH_SINGLE
SIGHASH_NONE si impegna su zero output; SIGHASH_SINGLE si impegna su esattamente uno, l'output che si trova allo stesso indice dell'input firmato. Quell'unico output coperto cambia del tutto il carattere della firma. Con SIGHASH_SINGLE chi firma può garantire il proprio pagamento lasciando aperto il resto della transazione, il che è un elemento utile per costruire swap e marketplace. SIGHASH_NONE non garantisce nulla a chi firma, ed è per questo che uno ha applicazioni reali e l'altro compare soprattutto nei rapporti sugli incidenti.