Vai al contenuto
buybitcoinsmart

Glossario / Protocollo e aggiornamenti

SIGHASH_ANYPREVOUT

Noto anche come APO.

Che cos'è SIGHASH_ANYPREVOUT?
SIGHASH_ANYPREVOUT è una modalità di firma proposta per gli script Taproot che consente a una sola firma di spendere qualsiasi bitcoin bloccato su uno script corrispondente, invece dell'unico bitcoin per cui è stata creata.

Specificato nel BIP-118.

Il BIP-118 definisce un nuovo tipo di chiave pubblica per tapscript, di 33 byte che iniziano con 0x01, invece di un flag aggiunto alle chiavi ordinarie. Assegnato a febbraio 2017, non è mai stato attivato e funziona solo nelle spese tramite script path, mai nelle spese tramite key path. Niente nel tuo wallet può firmare in questo modo, quindi qualsiasi prodotto che prometta canali eltoo sulla mainnet sta descrivendo un futuro.

Come funziona

Stato: il BIP-118 è un Draft, assegnato il 2017-02-28, che richiede il BIP-340, il BIP-341 e il BIP-342, e la sua sezione Deployment riporta TODO. Non è stato sostituito nulla, perché nulla è entrato in vigore.

Una firma Taproot si impegna sull'outpoint del bitcoin speso, 36 byte di txid e indice nel digest ANYONECANPAY che il BIP-118 modifica, saldandolo per sempre a un solo bitcoin. Se togli l'outpoint dal messaggio firmato, la firma smette di indicare un bitcoin e inizia a indicare una forma, così qualsiasi UTXO di quella forma può esservi associato in seguito. Il BIP la chiama dynamic rebinding.

Sono definite due varianti, e la differenza tra loro è ciò su cui la firma si impegna ancora.

  • SIGHASH_ANYPREVOUT, valore del bit 0x40, elimina l'outpoint ma conserva l'importo dell'input (8 byte), il suo scriptPubKey (qui sempre di 35 byte) e l'hash del tapleaf. La firma si adatta quindi a qualsiasi bitcoin che abbia lo stesso valore sotto lo stesso script.
  • SIGHASH_ANYPREVOUTANYSCRIPT, valore del bit 0xc0, elimina anche l'importo, lo scriptPubKey e l'hash del tapleaf. Si adatta a qualsiasi bitcoin il cui script quella chiave può soddisfare.

Si aderisce a questa opzione alla creazione dell'indirizzo, non al momento della firma. Queste chiavi funzionano solo tramite una foglia di tapscript, quindi l'indirizzo deve contenere una tale foglia nel suo albero di Merkle, e finché non viene speso è indistinguibile da qualsiasi altro indirizzo Taproot. Una sola costante separa le due cose: key_version è 0x01 per una chiave BIP-118 contro 0x00 per una chiave tapscript ordinaria, così una stessa chiave privata non può produrre una firma valida con entrambe le regole. Sei nuovi byte hash_type diventano validi: 0x41, 0x42, 0x43, 0xc1, 0xc2 e 0xc3.

Dove lo vedi

SIGHASH_ANYPREVOUT non compare in nessuna transazione della mainnet, e il BIP-118 prevede che "only be rarely used in practice" (sarà usato solo raramente nella pratica) anche una volta che esisterà, dato che le spese tramite script path sono più pesanti e più facilmente identificabili.

Il progetto per cui è stato scritto è eltoo, uno schema di aggiornamento off-chain. I protocolli off-chain devono rispondere a qualsiasi stato vecchio che una controparte pubblichi, e poiché una firma ordinaria si impegna sulla transazione esatta a cui risponde, serve una nuova firma per ogni stato che possa comparire. Eltoo invece usa lo script e nLockTime per rendere asimmetriche le firme, così una transazione con una firma successiva può spendere una con una firma precedente ma mai il contrario, e una sola firma di aggiornamento può essere applicata sopra qualsiasi aggiornamento precedente pubblicato dalla tua controparte.

Il nome registra una correzione. Joseph Poon ha proposto l'idea come SIGHASH_NOINPUT a febbraio 2016, dopo che l'articolo originale su Lightning l'aveva sollevata, e il cambio di nome indica che l'input non è davvero ignorato: nSequence è sempre firmato, e con SIGHASH_ANYPREVOUT lo sono anche lo script e l'importo.

La sezione sulla sicurezza del BIP ne indica il prezzo: il replay. Una firma ANYPREVOUT può essere riutilizzata contro qualsiasi altro UTXO con lo stesso script e lo stesso valore, e una firma ANYPREVOUTANYSCRIPT contro qualsiasi UTXO che riutilizzi quella chiave in uno dei suoi script, quindi il riutilizzo delle chiavi passa da fastidio per la privacy a un modo per perdere denaro. Queste transazioni sono anche malleabili da estranei: chiunque sia in grado di fornire un input corrispondente può cambiare il txid senza una chiave privata.

SIGHASH_ANYPREVOUT vs SIGHASH_ANYONECANPAY

SIGHASH_ANYONECANPAY esiste oggi sulla rete e rimuove tutti gli input tranne quello firmato; SIGHASH_ANYPREVOUT rimuove anche una parte di quello che sopravvive. Il BIP-118 descrive il suo digest come il digest ANYONECANPAY senza l'outpoint, una differenza di una riga con una grande conseguenza. Una firma ANYONECANPAY non può essere oggetto di replay, perché l'outpoint che indica può essere speso una sola volta. Se si rinuncia a quell'impegno, la protezione dal replay deve venire dal protocollo costruito sopra, non dalla firma.

Da non confondere con

Domande frequenti

Posso usare SIGHASH_ANYPREVOUT oggi?

No. Il BIP-118 è ancora un Draft, la sua sezione Deployment riporta TODO e nessun nodo della mainnet applica le regole, quindi nulla firmato in questo modo può essere speso sulla mainnet.

SIGHASH_ANYPREVOUT è la stessa cosa di SIGHASH_NOINPUT?

Sì, è la versione rinominata e rielaborata della stessa idea. Joseph Poon ha proposto SIGHASH_NOINPUT a febbraio 2016; la bozza ANYPREVOUT riguarda solo le spese tramite script path di Taproot e si impegna comunque su nSequence e, facoltativamente, sullo script e sull'importo, che è ciò che riflette il nuovo nome.

Perché il BIP-118 definisce un nuovo tipo di chiave pubblica invece di un semplice nuovo flag?

Perché la capacità va scelta al momento della creazione di un indirizzo. Queste firme funzionano solo con una chiave pubblica BIP-118 all'interno di una foglia tapscript, quindi un indirizzo privo di tale foglia non può mai essere speso in questo modo, e resta indistinguibile da qualsiasi altro indirizzo Taproot finché non viene speso.

Leggi anche

Termini correlati

Altro in Protocollo e aggiornamenti

Leggi questa pagina in inglese