¿El valor 'Verdadero' en el medio de la pila es una transacción válida?

Si en medio de la ejecución de scriptSig + scriptPubKey obtenemos el valor 'True', mientras quedan valores u operadores en la pila, ¿es válida la transacción? ¿O la pila debería estar vacía + el resultado superior es 'Verdadero'? Creo que no se debe a que alguien pueda enviar un script de desbloqueo con 'OP_TRUE' y hacer que se desbloquee cualquier UTXO.

Respuestas (2)

Al contrario del libro Mastering Bitcoin, no hay un valor booleano de "Verdadero" en Bitcoin Script. Un script de transacción ejecutado es válido cuando el elemento superior que queda en la pila al final de la ejecución es distinto de cero. Para combatir la maleabilidad de la transacción, BIP62 (transacción versión 3) también introduce el requisito de validez adicional de que la pila no debe contener elementos de datos adicionales, solo el valor único distinto de cero.

Sospecho que puede tener una idea errónea sobre cómo se ejecuta el script y qué contiene la pila durante la ejecución.

En primer lugar, recuerde que la secuencia de comandos completa se crea sumando las dos secuencias de comandos parciales en este orden: scriptSig + scriptPubKey.

Cada elemento del script completo es un valor que se inserta en la pila o una operación que examina y/o manipula la pila.

Un script válido se ejecuta de izquierda a derecha hasta que se alcanza el final o una operación indica un error. Si el script se completa sin ninguna operación que indique una falla temprana, entonces la parte superior de la pila (solo) indica la falla o el éxito. Como ya ha dicho el usuario Bitcoin , cualquier valor distinto de cero se considera un éxito, y cualquier elemento debajo de la parte superior de la pila se ignora (actualmente).

Si alguien intentara crear un tx cuyo scriptSig fuera simplemente OP_TRUE, el script completo normalmente se vería así:

OP_TRUE OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG

El primer paso del guión se inserta 1en la pila, luego se duplica y luego se aplica el hash al duplicado superior. Después de ejecutar estas tres primeras instrucciones del script, tendrías:

Stack:
HASH160(1)  <-- stack top
1

Remaining (unexecuted) script: <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG

Next <PubkeyHash>se coloca en la pila y luego se comparan los dos elementos superiores ( <PubkeyHash>y HASH160(1)), lo que hace que el script falle.

En resumen, debido a que scriptPubKey se agrega después de scriptSig, scriptSig no tiene forma de "anular" lo que scriptPubKey le dice al intérprete de scripts que finalmente ejecute. (No existe una instrucción como "salir inmediatamente con éxito" que scriptSig podría incluir).

Finalmente, el usuario Bitcoin también mencionó que BIP62 cambia la regla "al final, ignora todo menos la parte superior de la pila". Esto probablemente será cierto algún día (y de todos modos no haría ninguna diferencia en este ejemplo), sin embargo, a partir de hoy, las reglas en BIP62 aún no se han implementado (excepto la que también se menciona en BIP66).