¿Cuál es la diferencia entre OP_CHECKMULTISIG y OP_CHECKMULTISIGVERIFY?

Me gustaría aprender la diferencia, explicada lo más simple posible, entre OP_CHECKMULTISIG/OP_CHECKMULTISIGVERIFY y OP_CHECKSIG/OP_CHECKSIGVERIFY. La única explicación que encontré es: Igual que OP_CHECKMULTISIG (o igual que OP_CHECKSIG) excepto que OP_VERIFY se ejecuta después.

Para OP_VERIFY: marque una transacción como no válida si el valor de la pila superior no es verdadero.

¿Se puede explicar mejor esto? ¿Cómo difieren OP_CHECKMULTISIGVERIFY y OP_CHECKMULTISIG en la práctica y en la lógica de creación de scripts? ¿Cuáles son los efectos (pros y contras) de que OP_VERIFY se ejecute después o antes? Los ejemplos serían muy apreciados.

Respuestas (1)

OP_CHECKMULTISIG, OP_CHECKSIG, OP_EQUAL todos ponen verdadero o falso en la pila. Esto significa que puede usarlos con un OP_IF o similar, no tiene que finalizar inmediatamente la ejecución si es falso. OP_VERIFY, como citaste, marcará la transacción como inválida del elemento de la pila superior no es cierto, pero es posible que no desees, es posible que desees realizar alguna lógica adicional antes de eso.

Esto significa que cada script que tiene lógicas avanzadas y múltiples OP_IF y OP_ENDIF tiene que terminar con OP_VERIFY en caso de que entre if y endifs solo tengamos OP_CHECKSIG y OP_CHECKMULTISIG.
Esto significa que el siguiente script no es válido: IF 2 <clave de Alice> <clave de Bob> 2 CHECKMULTISIGVERIFY ELSE <clave de Bob> CHECKSIGVERIFY SHA256 <hash_of_secret> EQUALVERIFY ENDIF
Usaste VERIFICAR en ese guión, ¿tenías la intención de hacerlo? No necesita terminar con OP_VERIFY, el script seguirá siendo válido al final si hay un valor distinto de cero (verdadero) en la pila. Las versiones VERIFY se usan principalmente para marcarlo como no válido desde el principio en lugar de evaluar todo el script, como si usara "return false"; en Java o C++
Gracias. En mi ejemplo, la segunda condición después de else (proporcionar el secreto) ni siquiera se verificará en caso de que no se cumpla la primera condición, porque checkmultisigverify finalizará el script de inmediato. ¿Entendido?
Sí, correcto :)
Muchas gracias. Fue confuso porque en bip65 en github hay este ejemplo: IF <service pubkey> CHECKSIGVERIFY ELSE <expiry time> CHECKLOCKTIMEVERIFY DROP ENDIF <user pubkey> CHECKSIG pero tal vez haya un error aquí en la documentación.