¿Cómo soluciono mi secuencia de comandos de salida check-multisig if-else?

Estoy tratando de crear un script personalizado con if/else y una operación multisig en una rama. Actualmente, mi script se ve así:

OP_IF
    <pub1>
    OP_CHECKSIG
OP_ELSE
    OP_2
    <pub2>
    <pub3>
    <pub4>
    OP_3
    OP_CHECKMULTISIG
OP_ENDIF

Calculé una dirección de testnet ( 2NF3yXy2MambEnJuY7eStLNcX92WSxytLvC) a partir de este script de ejemplo y envié testcoin allí. Luego, traté de gastar el dinero con el siguiente script sig:

OP_0 <sig2> <sig3> <redeemScript>

Sin embargo, cuando intento transmitir la transacción, aparece un error:

ERROR DE TRANSACCIÓN PUSH: 16: ESCRITO OBLIGATORIO-VERIFICAR-BANDERA-FALLIDO (LA FIRMA DEBE SER CERO PARA LA OPERACIÓN DE COMPROBACIÓN FALLIDA (MULTI)SIG)

Como referencia, aquí está mi transacción sin procesar:

0100000001a492c575e44450a9be9ec4520ea365c53ea6f2018130d682ebf97bdf1b1a15ca01000000fd230100483045022100f502ecfd2b7bbb3e7092b320c568abe0d68dd7e613ab3efcb9e479b2641a73a502202b416bb86bce3d242084f8e24cbed76e5a2c5a0795a5bbd7f3366bf6d086ae4f0147304402201022c7548b55f3fbe3ddf427ad2ae5c6a776e2a63ee25376dca123d53d0f940f022041aa7967208ee8aee1811f02d6c7db0ad2872304133d46dbdd117e9bc09d8c97014c8f632102bc050e51811c2c454bf3487129b19d60b87f7a51fb434e6073def19dc55cf4b3ac67522102a906b96ea2df77aff1f84cc9949550f8d6b8f3db5acd625d12d70b6da4b94b1e2102046e854e69a49dd210dbf554f1e420893935b47123667a1834def9fe5d44358a210325db22e2aef6f143026500522431d4f348f911562316350852e6382da6a048a753ae68ffffffff01403fcb000000000017a91429b5c822f40f80cce593460927095ea6d8d720bc8700000000

Su script sig es este:

00483045022100f502ecfd2b7bbb3e7092b320c568abe0d68dd7e613ab3efcb9e479b2641a73a502202b416bb86bce3d242084f8e24cbed76e5a2c5a0795a5bbd7f3366bf6d086ae4f0147304402201022c7548b55f3fbe3ddf427ad2ae5c6a776e2a63ee25376dca123d53d0f940f022041aa7967208ee8aee1811f02d6c7db0ad2872304133d46dbdd117e9bc09d8c97014c8f632102bc050e51811c2c454bf3487129b19d60b87f7a51fb434e6073def19dc55cf4b3ac67522102a906b96ea2df77aff1f84cc9949550f8d6b8f3db5acd625d12d70b6da4b94b1e2102046e854e69a49dd210dbf554f1e420893935b47123667a1834def9fe5d44358a210325db22e2aef6f143026500522431d4f348f911562316350852e6382da6a048a753ae68

Que decodifica a

0 3045022100f502ecfd2b7bbb3e7092b320c568abe0d68dd7e613ab3efcb9e479b2641a73a502202b416bb86bce3d242084f8e24cbed76e5a2c5a0795a5bbd7f3366bf6d086ae4f[ALL] 304402201022c7548b55f3fbe3ddf427ad2ae5c6a776e2a63ee25376dca123d53d0f940f022041aa7967208ee8aee1811f02d6c7db0ad2872304133d46dbdd117e9bc09d8c97[ALL] 632102bc050e51811c2c454bf3487129b19d60b87f7a51fb434e6073def19dc55cf4b3ac67522102a906b96ea2df77aff1f84cc9949550f8d6b8f3db5acd625d12d70b6da4b94b1e2102046e854e69a49dd210dbf554f1e420893935b47123667a1834def9fe5d44358a210325db22e2aef6f143026500522431d4f348f911562316350852e6382da6a048a753ae68

La última línea es claramente visible como el script de canje, que a su vez decodifica esto:

OP_IF 02bc050e51811c2c454bf3487129b19d60b87f7a51fb434e6073def19dc55cf4b3 OP_CHECKSIG OP_ELSE 2 02a906b96ea2df77aff1f84cc9949550f8d6b8f3db5acd625d12d70b6da4b94b1e 02046e854e69a49dd210dbf554f1e420893935b47123667a1834def9fe5d44358a 0325db22e2aef6f143026500522431d4f348f911562316350852e6382da6a048a7 3 OP_CHECKMULTISIG OP_ENDIF

¿Mi script de firma es incorrecto? ¿El script de salida no es válido? ¿Cómo puedo arreglar esto y hacer que funcione?

¡Muchas gracias por adelantado!

EDITAR: después de tener en cuenta el comentario de Pieter pero colocando el OP_0 adicional justo después de las dos firmas en el script de firma, funcionó. Aquí está el nuevo script sig decodificado:

0 3045022100f502ecfd2b7bbb3e7092b320c568abe0d68dd7e613ab3efcb9e479b2641a73a502202b416bb86bce3d242084f8e24cbed76e5a2c5a0795a5bbd7f3366bf6d086ae4f[ALL] 304402201022c7548b55f3fbe3ddf427ad2ae5c6a776e2a63ee25376dca123d53d0f940f022041aa7967208ee8aee1811f02d6c7db0ad2872304133d46dbdd117e9bc09d8c97[ALL] 0 632102bc050e51811c2c454bf3487129b19d60b87f7a51fb434e6073def19dc55cf4b3ac67522102a906b96ea2df77aff1f84cc9949550f8d6b8f3db5acd625d12d70b6da4b94b1e2102046e854e69a49dd210dbf554f1e420893935b47123667a1834def9fe5d44358a210325db22e2aef6f143026500522431d4f348f911562316350852e6382da6a048a753ae68

Y aquí está el enlace a la transacción: https://testnet.smartbit.com.au/tx/1894cb91fde60432e59d60f30de503e8b6fbe5d1756bbf0ef7302b57bf31d195

Creo que puede necesitar dos OP_0's al principio: uno para ser consumido por OP_IF, y otro que es sacado por OP_CHECKMULTISIG. Convertiré esto en una respuesta completa una vez que haya identificado el problema.
¡Gracias por su respuesta! Lo acabo de probar y me sigue dando el mismo error:PUSH TRANSACTION ERROR: 16: MANDATORY-SCRIPT-VERIFY-FLAG-FAILED (SIGNATURE MUST BE ZERO FOR FAILED CHECK(MULTI)SIG OPERATION)
~30min en el video Andreas explica el manejo del guión "IF". Debe haber un valor antes de la instrucción IF. 1 para la rama If o 0 para la rama else. m.youtube.com/watch?v=yU3Sr07Qnxg
@pebwindkraft: esa debería ser una respuesta. ;)
@murch: ya no persigo los créditos :-) Pieter y usted han proporcionado las respuestas, y esta es solo una "pequeña" explicación adicional, que podría ayudar a los usuarios a comprender mejor los comentarios anteriores.
@pebwindkraft: Bastante justo. Sin embargo, no se trata solo de la reputación, sino también de que los comentarios no deben usarse para responder preguntas. ;)

Respuestas (1)

OP_IFconsume un número de la parte superior de la pila. evaluará si
el número es , y si el número es .OP_IFtruenot 0false0

H/T por esta respuesta de David Schwartz , y a Pieter Wuille por llevarme por el camino correcto.