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.