Glosario / Referencia para desarrolladores
Script de Bitcoin
También se conoce como Script.
- ¿Qué es Script de Bitcoin?
- Script de Bitcoin es el pequeño lenguaje basado en pila que lleva cada salida de bitcoin y que establece las condiciones que alguien debe satisfacer antes de que esas monedas puedan volver a gastarse.
Las monedas no se envían a personas. Quedan bloqueadas en un programa corto, y gastarlas consiste en aportar datos que hagan que el programa termine con un valor verdadero en la cima de la pila. El lenguaje no tiene bucles ni recursión, y un script heredado (legacy) se detiene en 10.000 bytes y 201 operaciones, así que un validador siempre sabe que el trabajo terminará. Por eso bitcoin nunca ha tenido un contrato desbocado.
Cómo funciona
Script de Bitcoin es una máquina de pila que lee de izquierda a derecha y no hace nada más.
Las inserciones de datos van a una pila; las operaciones desapilan de ella sus argumentos y vuelven a apilar los resultados. No hay variables, ni saltos hacia atrás, ni forma alguna de leer nada fuera de la transacción que se está validando. Un script tiene éxito cuando la ejecución termina sin error y deja un valor verdadero en la cima.
Dos piezas se encuentran en el momento del gasto. La salida que se gasta lleva el bloqueo, llamado script de bloqueo. La entrada que la gasta lleva la prueba, llamada script de desbloqueo en las salidas más antiguas o testigo en las salidas SegWit. Se ejecutan en secuencia, con la pila pasando de una a otra, y nunca se concatenan en un único programa, una separación que se introdujo muy pronto, cuando quedó claro que alguien que gastara y pudiera inyectar operadores en el lado del bloqueo podría reescribir las condiciones.
Vale la pena leer entero el script más común de la historia de bitcoin. Una salida pay-to-public-key-hash contiene OP_DUP, OP_HASH160, un hash de 20 bytes, OP_EQUALVERIFY y OP_CHECKSIG. Quien gasta aporta una firma y una clave pública. La ejecución apila ambas, duplica la clave pública, calcula el hash de la copia hasta dejarla en 20 bytes, apila el hash esperado, compara los dos y aborta si difieren, y luego verifica la firma frente a una serialización de la propia transacción. Seis pasos, y toda la seguridad de una dirección heredada descansa en ellos.
Los límites son deliberados y precisos. Un script heredado o P2SH no puede superar los 10.000 bytes ni las 201 operaciones distintas de las inserciones de datos. Ningún elemento de la pila puede superar los 520 bytes. La pila no puede contener más de 1.000 elementos. Un solo OP_CHECKMULTISIG no puede nombrar más de 20 claves públicas. Cada tope existe para que el costo de validar un bloque siga acotado, sin importar lo que escriba cualquiera.
El lenguaje ha crecido dos veces, al dar un significado real a opcodes (códigos de operación) reservados como operaciones nulas. El BIP65 definió el opcode OP_CHECKLOCKTIMEVERIFY en diciembre de 2015, lo que permite que una salida se niegue a moverse antes de un momento o una altura indicados. El BIP112 hizo lo mismo con OP_CHECKSEQUENCEVERIFY, activo desde el bloque 419.328 en julio de 2016, y añadió bloqueos temporales relativos (relative timelocks), medidos desde que la moneda se confirmó. Esos dos opcodes son la razón de que puedan llegar a existir los canales Lightning, el escrow (depósito en garantía) con plazo y los esquemas de herencia con bloqueo temporal.
Por qué importa cuando compra bitcoin
La dirección a la que usted retira es un tipo de script, y la elección se nota en su próxima comisión.
Gastar una entrada pay-to-public-key-hash heredada cuesta aproximadamente 148 bytes virtuales. Gastar una entrada SegWit nativa cuesta aproximadamente 68, porque el descuento del testigo que introdujo el BIP141 cobra los datos de testigo a un cuarto de precio, y un gasto por ruta de clave de Taproot es aún menor. Con una comisión por vB de 20 sat/vB, esa diferencia es la mayor parte del costo de un retiro pequeño, y se repite cada vez que usted mueve monedas. Cuando un exchange le permite elegir el formato de la dirección a la que retira, elegir el moderno es un descuento permanente.
Script es también lo que en realidad es una bóveda multisig. Una configuración 2 de 3 es un script que nombra tres claves públicas y exige dos firmas, y si un dispositivo concreto puede mostrar y firmar uno con honestidad es una cuestión que nuestras reseñas de billeteras de hardware abordan directamente. Lo mismo vale para cualquier plan de herencia basado en un bloqueo temporal: las monedas solo se pueden recuperar si alguien conserva todavía el script, y por eso los descriptores de salida, la receta en texto plano para reconstruirlo, deben ir en su respaldo junto a la frase semilla.
Una advertencia práctica. Cuando una plataforma se niega a enviar a una dirección que usted pegó, la causa casi siempre es que el código de retiro de la plataforma no puede construir ese tipo de script, no que su dirección esté mal. Pruebe cualquier formato de dirección que no conozca con un monto pequeño antes de mover un saldo que le importe.
El error de los 184 mil millones de bitcoin y los opcodes que Satoshi desactivó
El 15 de agosto de 2010, el bloque 74.638 contenía una transacción que creó 184.467.440.737,09551616 bitcoin, repartidos en dos salidas de aproximadamente 92,2 mil millones cada una.
La comprobación de que las salidas de una transacción no superaban sus entradas usaba aritmética con signo de ancho fijo, y unas salidas lo bastante grandes como para desbordar esa aritmética sumaban un número negativo, así que la transacción pasaba la comprobación. Un cliente parcheado apareció en alrededor de cinco horas, y la cadena honesta adelantó a la defectuosa en la altura 74.691. Esas monedas nunca existieron en la cadena que usa todo el mundo.
Ese episodio, junto con una familia de errores relacionados en las operaciones de cadenas de caracteres y aritméticas, es la razón de que quince opcodes estén desactivados de forma permanente: OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_2MUL, OP_2DIV, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT y OP_RSHIFT. Una transacción cuyo script simplemente contenga uno de ellos es inválida, se ejecute o no. La desactivación fue un instrumento tosco aplicado bajo presión de tiempo, y deshacer parte de ella es trabajo en curso: el BIP347 propone reactivar OP_CAT dentro de tapscript, donde los límites más recientes hacen mucho más difícil abusar de él.
Script de Bitcoin frente a tapscript
Tapscript es Script de Bitcoin con el reglamento reescrito, y solo se aplica dentro de un gasto por ruta de script de Taproot. El BIP342 eliminó tanto el tope de tamaño de script de 10.000 bytes como el tope de 201 operaciones, desactivó OP_CHECKMULTISIG y OP_CHECKMULTISIGVERIFY, y añadió OP_CHECKSIGADD en su lugar para que las políticas multisig puedan verificarse por lotes. Las verificaciones de firma se miden en lugar de contarse: cada entrada recibe un presupuesto de 50 más el tamaño serializado de su testigo, y cada verificación de firma ejecutada gasta 50 de él. La misma máquina de pila, otra contabilidad.
Script de Bitcoin frente a un script de bloqueo
Script de Bitcoin es el lenguaje; un script de bloqueo es un programa escrito en él. Una salida contiene un script de bloqueo, que es el bloqueo. La entrada que la gasta contiene un script de desbloqueo o un testigo, que es la clave. Ambos son Script de Bitcoin, y llamar a cualquiera de los dos simplemente "el script" es la fuente de confusión más común al leer una transacción en bruto, porque las dos mitades se evalúan por separado y, cuando se recibieron las monedas, la salida solo fijaba una de ellas.