Glosario / Referencia para desarrolladores
OP_EQUALVERIFY
- ¿Qué es OP_EQUALVERIFY?
- OP_EQUALVERIFY compara los dos elementos de la cima de la pila y aborta el script al instante si difieren, y así es como un gasto heredado (legacy) demuestra que presentó la clave pública correcta.
El byte 0x88 es el punto de control en medio de la plantilla de script más antigua de bitcoin. No deja nada cuando la comparación tiene éxito y detiene la ejecución en seco cuando falla, así que una entrada que aporta la clave equivocada no produce un pago fallido, sino una transacción inválida que ningún nodo retransmitirá. Aquí suele decidirse si su billetera firmó siquiera con la clave correcta.
Cómo funciona
OP_EQUALVERIFY desapila dos elementos, los compara byte a byte y, o bien continúa en silencio, o bien termina el script.
Para cuando se ejecuta en un gasto heredado, la pila contiene dos cadenas de 20 bytes. Una es la huella digital que la salida fijó cuando llegaron las monedas, quizá años antes. La otra es la huella de la clave pública que acaba de aportar quien gasta. Un solo bit distinto en esos 20 bytes termina la evaluación, y no hay recuperación posible: el Script de Bitcoin no tiene manejo de excepciones ni segundo intento.
El éxito no vuelve a apilar nada. Esa es toda la razón de que exista la forma fusionada, y por eso el script pay-to-public-key-hash de 25 bytes puede terminar con una verificación de firma en lugar de con un booleano sobrante que nadie quiere. El intérprete de Bitcoin Core implementa la fusión literalmente: ejecuta el caso de la comparación y luego pasa directamente al caso general de la aserción, así que los dos son una sola ruta de código y no dos parecidas.
El patrón se repite en todo el lenguaje. Cada opcode (código de operación) VERIFY fusionado ocupa exactamente el byte siguiente al de su equivalente simple: 0x87 y 0x88 para la igualdad, 0xac y 0xad para la verificación de firmas, 0xae y 0xaf para el antiguo opcode multisig. Cuando una condición tiene que cumplirse antes de que pueda ocurrir cualquier otra cosa, los autores de scripts recurren al byte más alto.
Dónde aparece
El lugar más claro para encontrarse con OP_EQUALVERIFY es un mensaje de rechazo, más que un explorador de bloques.
Si se difunde una transacción firmada con una clave que no corresponde a la dirección, Bitcoin Core responde con el error mandatory-script-verify-flag-failed y nombra la operación OP_EQUALVERIFY fallida en el paréntesis que sigue. En la práctica, ese error casi siempre significa una cosa: el dispositivo de firma derivó su clave de una ruta distinta o de una semilla distinta de la que controla las monedas. Restaurar una billetera con la ruta de derivación equivocada y luego intentar gastar produce exactamente esto.
Los scripts decodificados también lo muestran con claridad. Cualquier salida que pague a una dirección que empieza por 1 se representa como un script de cinco palabras con este opcode en cuarto lugar, y el comando bitcoin-cli decodescript imprime la misma representación en ensamblador (ASM) para un script de canje que usted pegue.
OP_EQUALVERIFY frente a OP_VERIFY
OP_EQUALVERIFY es una comprobación específica con una aserción soldada, y el opcode OP_VERIFY es la aserción sola. La forma general, el byte 0x69, no sabe nada de lo que produjo el valor que examina; desapila un solo elemento y exige que ese elemento sea verdadero. OP_EQUALVERIFY realiza la comparación y la exigencia juntas en un solo byte, y por eso rara vez se escriben por separado. Recurra a la forma general cuando la condición provenga de la aritmética, de una comprobación de bloqueo temporal (timelock) o de una comprobación de preimagen que no sea una simple igualdad. Recurra a la forma fusionada siempre que la pregunta sea realmente si dos cadenas de bytes coinciden, cosa que en un gasto de una sola clave siempre ocurre.