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.