Vai al contenuto
buybitcoinsmart

Glossario / Riferimento per sviluppatori

OP_EQUALVERIFY

Che cos'è OP_EQUALVERIFY?
OP_EQUALVERIFY confronta i due elementi in cima alla pila e interrompe subito lo script se differiscono: è così che una spesa legacy dimostra di aver presentato la chiave pubblica corretta.

Il byte 0x88 è il punto di controllo nel mezzo del modello di script più antico di bitcoin. Non lascia nulla dietro di sé quando riesce e ferma l'esecuzione di netto quando fallisce, così un input che fornisce la chiave sbagliata non produce un pagamento fallito, ma una transazione non valida che nessun nodo trasmetterà. Se il tuo wallet ha firmato con la chiave giusta si decide di solito qui.

Come funziona

OP_EQUALVERIFY preleva due elementi dalla pila, li confronta byte per byte e poi continua in silenzio oppure termina lo script.

Quando viene eseguito in una spesa legacy, la pila contiene due stringhe di 20 byte. Una è l'impronta a cui l'output si è vincolato quando i bitcoin sono arrivati, magari anni prima. L'altra è l'impronta della chiave pubblica appena fornita da chi spende. Un solo bit diverso in quei 20 byte termina la valutazione e non c'è modo di recuperare: Bitcoin Script non ha gestione delle eccezioni né un secondo tentativo.

Il successo non rimette nulla sulla pila. È proprio questa la ragione per cui esiste la forma fusa, ed è per questo che lo script pay-to-public-key-hash di 25 byte può concludersi con un controllo di firma invece che con un booleano residuo che nessuno vuole. L'interprete di Bitcoin Core attua la fusione alla lettera: esegue il caso del confronto e poi prosegue nel caso generale dell'asserzione, così i due sono un unico percorso di codice e non due percorsi simili.

Lo schema si ripete in tutto il linguaggio. Ogni opcode di verifica fuso sta esattamente un byte sopra il suo equivalente semplice: 0x87 e 0x88 per l'uguaglianza, 0xac e 0xad per il controllo delle firme, 0xae e 0xaf per il vecchio opcode multisig. Quando una condizione deve valere prima che possa accadere qualsiasi altra cosa, chi scrive script ricorre al byte più alto.

Dove lo vedi

Il posto più chiaro per incontrare OP_EQUALVERIFY è un messaggio di rifiuto, più che un block explorer.

Se trasmetti una transazione firmata con una chiave che non corrisponde all'indirizzo, Bitcoin Core risponde con mandatory-script-verify-flag-failed, indicando tra parentesi l'operazione OP_EQUALVERIFY fallita. In pratica quell'errore significa quasi sempre una cosa: il dispositivo di firma ha derivato la sua chiave da un percorso diverso o da un seed diverso da quello che possiede i bitcoin. Ripristinare un wallet con il percorso di derivazione sbagliato e poi provare a spendere produce esattamente questo.

Anche gli script decodificati lo mostrano chiaramente. Qualsiasi output che paga un indirizzo che inizia con 1 appare come uno script di cinque token con questo opcode in quarta posizione, e bitcoin-cli decodescript stampa lo stesso assembly per un redeem script che incolli.

OP_EQUALVERIFY vs OP_VERIFY

OP_EQUALVERIFY è un controllo specifico con un'asserzione saldata, e OP_VERIFY è l'asserzione da sola. La forma generale, il byte 0x69, non sa nulla di ciò che ha prodotto il valore che esamina: preleva un solo elemento e pretende che quell'elemento sia vero. OP_EQUALVERIFY esegue insieme il confronto e la pretesa in un solo byte, ed è per questo che raramente si scrivono separatamente. Ricorri alla forma generale quando la condizione deriva dall'aritmetica, da un controllo di timelock o da un controllo di preimage che non è una semplice uguaglianza. Ricorri alla forma fusa ogni volta che la domanda è davvero se due stringhe di byte coincidono, cosa che in una spesa con una sola chiave accade sempre.

Da non confondere con

Domande frequenti

Che cosa significa l'errore OP_EQUALVERIFY quando trasmetti una transazione?

Significa che l'hash della chiave pubblica fornita dal tuo wallet non corrisponde al valore a cui l'output si è vincolato, quindi la firma non è stata nemmeno controllata. Quasi sempre il wallet che firma si trova sul percorso di derivazione sbagliato o è stato ripristinato dal seed sbagliato.

Perché non scrivere semplicemente OP_EQUAL seguito da OP_VERIFY?

Si comporta allo stesso modo e costa un byte in più. L'opcode fuso esiste perché quella coppia di confronto e interruzione compare in ogni output legacy a chiave singola, e un byte per input si somma lungo tutta la catena.

Termini correlati

Altro in Riferimento per sviluppatori

Leggi questa pagina in inglese