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
OP_IF
consume un número de la parte superior de la pila. evaluará si
el número es , y si el número es .OP_IF
true
not 0
false
0
H/T por esta respuesta de David Schwartz , y a Pieter Wuille por llevarme por el camino correcto.
pieter wuille
OP_0
's al principio: uno para ser consumido porOP_IF
, y otro que es sacado porOP_CHECKMULTISIG
. Convertiré esto en una respuesta completa una vez que haya identificado el problema.arik
PUSH TRANSACTION ERROR: 16: MANDATORY-SCRIPT-VERIFY-FLAG-FAILED (SIGNATURE MUST BE ZERO FOR FAILED CHECK(MULTI)SIG OPERATION)
pebwindkraft
muro
pebwindkraft
muro