ScriptPubKey
El código de bloqueo de una salida
El ScriptPubKey es el código de bloqueo de una salida.
Está hecho de Script, un mini lenguaje de programación que te permite colocar diferentes tipos de trabas en tus salidas. La mayoría de los ScriptPubKeys usan un conjunto estándar de trabas, más comúnmente bloqueando la salida a una clave pública (por ejemplo, P2PKH o P2WPKH).
Los ScriptPubKeys normalmente se codifican en direcciones para facilitar su compartición.
Ejemplos
¿Cómo es un ScriptPubKey?
Aquí tienes un resumen de los tipos de ScriptPubKey que encuentras en las salidas (cada uno tiene una página dedicada con detalles):
P2PK (Legado)
Bloquea la salida a una única clave pública. Contiene la clave pública y el opcode OP_CHECKSIG. Es uno de los scripts más simples, encontrado principalmente en coinbases antiguas.
P2PKH (Legado)
También bloquea a una única clave pública, pero en lugar de colocar la clave pública cruda en el script, coloca el hash de la clave pública (el HASH160 de la clave). Fue el script más común hasta 2016. Para desbloquearlo, proporcionas una firma y la clave pública original.
HASH160
Clave Pública
P2MS (Legado)
Permite bloquear la salida a varias claves públicas (multisig). Para desbloquearla, proporcionas el número requerido de firmas (por ejemplo, 2 de 3).
P2SH (Legado)
Introducido en 2012 (BIP 16). Permite bloquear la salida usando un script de bloqueo personalizado. En lugar de un hash de clave pública, contiene un hash de script (el HASH160 de un script). El script real (redeem script) solo se revela al momento de gastar.
OP_RETURN (Datos)
Marca la salida como comprobadamente no gastable y permite embutir datos arbitrarios (hasta 80 bytes) en la salida. Como nadie podrá jamás gastarla, es una forma de almacenar datos en la blockchain sin inflar el conjunto de UTXOs. Se usa para commitments (como el de wTXID de la coinbase), timestamps y protocolos de datos.
P2WPKH y P2WSH (SegWit)
Versiones de "segregated witness" de P2PKH y P2SH. El código de desbloqueo vive en la testigo en lugar del ScriptSig.
P2TR (Taproot)
El tipo de salida más nuevo (Taproot), que permite gastar por una clave o por un script, revelando solo una condición de gasto.
Custom
El ScriptPubKey no está restringido a bloquear para claves públicas; puede usarse para crear muchos tipos diferentes de trabas. Por ejemplo, un script de bloqueo personalizado puede usar opcodes para crear un simple problema de matemáticas (OP_2DUP OP_ADD OP_8 OP_EQUALVERIFY OP_SUB OP_2 OP_EQUAL), que pide dos números que sumen 8, siendo el segundo 2 menos que el primero — desbloqueado proporcionando OP_5 y OP_3.
Estos scripts personalizados se consideran no estándar: aunque pueden minarse en la blockchain, no son retransmitidos por los nodos. Por eso, rara vez aparecen directamente en el ScriptPubKey — normalmente se envuelven en un P2SH o P2WSH.
Terminología
¿Por qué se llama ScriptPubKey?
Se llama ScriptPubKey porque contiene Script y normalmente bloquea una salida a la clave pública (public key) de alguien.
Pero "ScriptPubKey" es un nombre algo impropio, porque no estás limitado a bloquear una salida solo a una clave pública. Aun así, bloquear a la clave pública de otra persona es la forma más común de bloquear bitcoins, y fue el nombre que Satoshi eligió para este campo en el código original — así que es el término que aún usamos hoy. Es más fácil pensar en el ScriptPubKey simplemente como el "código de bloqueo" de una salida.
"ScriptPubKey", "scriptPubKey" y "scriptpubkey" son solo formas distintas de escribir lo mismo; no hay una forma oficial, aunque la variante en camel case con la primera letra minúscula ("scriptPubKey") es como lo escribía Satoshi y parece ser la más común.