MSTR Cat

Blockchain/Nivel IV · El protocolo a fondo/4.1 Script/Lección 1

Script: un lenguaje de pila

La pila que mantiene acotada la ejecución y los opcodes deshabilitados por Satoshi

MaterialesUna hoja de papel y un bolígrafoAcceso a un explorador de bloques de BitcoinLa página ‘Script’ de la Wikipedia de Bitcoin

Curiosidad

  1. ¿Por qué un lenguaje sin bucles protege cada nodo de la computación infinita?
  2. ¿Qué error específico en 2010 permitió que cualquiera gastara las monedas de otros antes de que se corrigiera?
  3. ¿Cómo se puede marcar una salida como comprobablemente no gastable mientras sigue conteniendo datos?

Explorar

  1. Bitcoin Script es un lenguaje pequeño, basado en pilas y de estilo Forth. Carece de bucles y recursión, lo que hace que sea deliberadamente no Turing completo. Este diseño garantiza que el costo de ejecución de cada script sea acotado y predecible. Ningún script puede ejecutarse infinitamente ni consumir recursos ilimitados, protegiendo la red de los ataques de denegación de servicio inherentes al código de propósito general. Su simplicidad permite que cualquier nodo valide transacciones de manera determinista sin arriesgarse a agotar sus recursos.
  2. Cada salida lleva un script de bloqueo (scriptPubKey) que define las condiciones para su gasto. El que gasta proporciona los datos de desbloqueo a través de scriptSig o, desde SegWit, datos de testigo. La ejecución coloca los datos en una pila y aplica los opcodes de izquierda a derecha. El gasto es válido si la ejecución finaliza sin errores y deja un valor verdadero en la parte superior de la pila. Este resultado binario protege los bitcoins sin revelar nunca las claves privadas, basándose en la verificación criptográfica en lugar de en controles de identidad.
  3. En 2010, Satoshi Nakamoto deshabilitó varios opcodes, incluidos OP_CAT y OP_MUL, como medida preventiva tras la detección de errores; uno de ellos (en OP_LSHIFT) podía hacer que los nodos se colapsaran. Un defecto aún más grave estaba relacionado con la forma en que scriptSig y scriptPubKey se combinaban y ejecutaban como un único script: un scriptSig que terminaba en OP_RETURN podía finalizar su ejecución con 'true' antes de que el script de bloqueo se ejecutara, lo que permitía a cualquiera gastar las monedas de cualquier otra persona. La primera corrección hizo que OP_RETURN fallara por completo; una versión posterior fue aún más allá y ejecutó scriptSig y scriptPubKey como scripts separados. Este cambio fortaleció el modelo de seguridad y eliminó operaciones peligrosas que podrían haber sido explotadas o causado un comportamiento impredecible.
  4. OP_RETURN marca una salida como comprobablemente imposible de gastar. Se utiliza para incrustar pequeñas cantidades de datos en la cadena sin crear un camino de gasto válido. Dado que ninguna firma puede satisfacer OP_RETURN, las monedas quedan bloqueadas de forma permanente, pero los datos asociados siguen formando parte del historial de la blockchain. Como tales salidas nunca pueden ser gastadas, los nodos las excluyen del conjunto de monedas gastables.
  5. Para comprender la mecánica, siga paso a paso '2 3 OP_ADD 5 OP_EQUAL' sobre papel. Comience con una pila vacía. Inserte 2 y luego 3. Aplique OP_ADD para extraer ambos y insertar su suma (5). Inserte nuevamente 5. Aplique OP_EQUAL para comparar los dos elementos superiores; como coinciden, se inserta true (1). La pila termina con un único valor true, cumpliendo así el requisito de validez. Esta sencilla operación aritmética demuestra cómo los opcodes manipulan la pila para evaluar condiciones.
  6. Abra un explorador de bloques y localice cualquier transacción estándar. Identifique la scriptPubKey en la sección de resultados; esta comienza con OP_DUP para salidas P2PKH heredadas, OP_0 para SegWit nativo o OP_1 para Taproot. Luego, abra una transacción que gaste dicha salida y encuentre la firma y la clave, en scriptSig para las salidas heredadas o en witness para SegWit y Taproot, que la satisfagan, dejando un valor verdadero en la pila de ejecución para todos los nodos validadores.

Datos clave

  • Bitcoin Script no es Turing completo; no tiene bucles ni recursión.
  • En 2010, Satoshi deshabilitó OP_CAT, OP_MUL y otros opcodes como medida de precaución tras la detección de errores.
  • Desde 2010, scriptSig y scriptPubKey se ejecutan por separado en lugar de concatenarse.
  • OP_RETURN marca una salida como comprobablemente imposible de gastar para el incrustamiento de datos.
  • Un gasto válido deja un valor verdadero en la parte superior de la pila de ejecución.
  • El costo de cada script está limitado debido a la falta de cálculos arbitrarios.

Ejercicio nueve, seis, tres, uno

9ReunirEnumera 9 opcodes del Script de Bitcoin. Indica cuáles están deshabilitados, cuáles modifican directamente la pila y cuáles realizan verificaciones criptográficas.
6AgruparAgrupa los 9 en 6 según su función: aritmética, comparación, manipulación de la pila, verificación criptográfica, incrustación de datos u obsoletos/eliminados.
3DestilarReduce las 6 a 3 razones por las que el Script se mantuvo deliberadamente limitado.
1CristalizarEscribe 1 oración sobre cómo la ejecución acotada protege la red de los scripts maliciosos.

Verificación de hechos

Fechas, cifras y afirmaciones verificadas con las fuentes publicadas que se enumeran a continuación.

Abrir en la academia interactiva →

EN PT ZH JA KO RU DE FR MS