Glosario / Referencia para desarrolladores
Script de desbloqueo
También se conoce como scriptSig o Script de entrada.
- ¿Qué es un script de desbloqueo?
- Un script de desbloqueo es el conjunto de datos de desbloqueo que lleva una entrada para satisfacer el script de bloqueo de la salida que gasta, y en las entradas SegWit modernas está vacío.
Cada entrada de una transacción apunta a una salida anterior y tiene que demostrar que está autorizada a gastarla. Bitcoin Core llama scriptSig a este campo; en una entrada pay-to-public-key-hash heredada (legacy), contiene una firma de 71 o 72 bytes y una clave pública de 33 bytes, aproximadamente 107 bytes. Desde SegWit, esa prueba suele estar en otro lugar, y en eso está la mayor parte del motivo por el que un retiro a una dirección bech32 le cuesta menos.
Cómo funciona
El script de desbloqueo se ejecuta primero y deja sus resultados en la pila para que los consuma el script de la salida. Los dos no se ejecutan como un único programa concatenado: se ejecutan uno tras otro y la pila pasa del primero al segundo, una separación introducida en 2010 después de que el diseño original resultara explotable.
La política de retransmisión exige que este campo no contenga más que inserciones de datos. Ningún condicional, nada de aritmética, ningún opcode (código de operación) que haga algún trabajo. La restricción existe porque quien gasta controla estos bytes por completo, y dejar que un atacante ejecute lógica al entrar reabre problemas que la red cerró hace mucho. Pay-to-script-hash convierte la regla en un requisito de consenso y no en una preferencia, ya que el script de canje debe llegar como la última inserción de datos simple.
Su tamaño depende por completo de lo que desbloquea. Una entrada heredada de una sola clave lleva una firma y una clave. Una entrada SegWit anidada lleva exactamente 23 bytes, una sola inserción de datos con el programa de testigo de 22 bytes, y traslada todo lo demás al testigo. Una entrada bech32 o bech32m nativa no lleva nada en absoluto: el campo serializado es un único byte de longitud cero.
Hay una entrada cuyo script de desbloqueo no es prueba de nada. La única entrada de una transacción coinbase no tiene ninguna salida anterior que desbloquear, así que el campo se reutiliza como espacio libre de entre 2 y 100 bytes, y desde BIP-34 debe empezar por la altura del bloque. Los mineros han firmado ahí mensajes, votos y bromas desde 2009.
Dónde aparece
Decodifique cualquier transacción y cada entrada mostrará un objeto scriptSig con una representación en ensamblador (ASM) y otra hexadecimal. En una entrada SegWit nativa o Taproot, ambas son cadenas de caracteres vacías mientras un campo de testigo aparte contiene los datos, y esa asimetría visual es la forma más rápida de saber de un vistazo qué formato de dirección usó una transacción antigua.
También explica un episodio histórico que a menudo se malinterpreta. Como el scriptSig entraba en el cálculo del ID de transacción, un tercero podía volver a codificar una firma sin invalidarla y cambiar el ID de una transacción ya difundida. Mt. Gox detuvo los retiros en febrero de 2014 y culpó exactamente a este comportamiento, aunque un análisis académico posterior de la cadena encontró que el volumen de transacciones alteradas por maleabilidad era, con mucho, demasiado pequeño para explicar las monedas desaparecidas. SegWit zanjó la discusión en agosto de 2017 al sacar por completo los datos de desbloqueo del cálculo del ID.
Script de desbloqueo frente a datos de testigo
Un script de desbloqueo y los datos de testigo llevan el mismo tipo de prueba, y SegWit trasladó esa función del script a los datos de testigo sin cambiar lo que significa una firma. Las diferencias que le importan a usted son el precio y la permanencia. Los bytes del testigo se cobran a una unidad de peso cada uno, mientras que los bytes del script de desbloqueo cuestan cuatro, así que el mismo gasto de una sola clave ocupa aproximadamente 148 bytes virtuales cuando la prueba viaja en el scriptSig y aproximadamente 68 cuando viaja en el testigo. Los datos de testigo además quedan fuera del ID de transacción, así que a un gasto no se le puede alterar el identificador en tránsito. Una entrada heredada sigue usando el campo antiguo, y por eso las monedas guardadas en una dirección que empieza por 1 resultan, en silencio, más caras de mover cada vez que usted las mueve.