Anexo:Script (Bitcoin)

Script es el lenguaje usado para describir los scripts de Bitcoin, usados para bloquear/desbloquear de las transacciones. Cualquier combinación de un script de desbloqueo y uno de bloqueo que finalice con un valor de VERDADERO en la pila indica que la condición de la UTXO se cumple y por tanto es válido, en cualquier otro caso es inválido. Por ejemplo si tenemos el script de bloqueo 3 OP_ADD 4 OP_EQUAL este se puede satisfacer con el script de desbloqueo 1.[1]

Características editar

El lenguaje tiene las siguientes características:[1][2]

  • Simple
  • Limitado. El lenguaje no es Turing completo debido a que no tienen ciclos ni controles de flujo complejos lo cual asegura que siempre termine. Por esta razón no es posible tener bombas lógicas que ocasionen un ataque de denegación de servicio en la red Bitcoin.
  • Requiere un procesamiento mínimo
  • Puede ser implementado en una amplia gama de dispositivos.
  • No hay un estado anterior o posterior a la ejecución del script. Toda la información necesaria para ejecutar el script debe estar contenida en él.
  • Es un lenguaje que accede a la memoria basándose en una pila. Por tanto no hay variables. Para hacer más intuitvo el uso de la pila han decidido usar notación polaca inversa . Los valores se van metiendo en la pila y los operadores meten o sacan uno o más parámetros de la pila, modifican los parámetros y finalmente pueden meter un resultado en la pila. Por ejemplo la instrucción OP_ADD saca dos elementos de la pila, los suma y mete el resultado en la pila. Al final del script, la cima de la pila es el valor de retorno. Script puede usar dos pilas: La principal y la alternativa. La alternativa se usa para almacenar datos de cálculos de pasos intermedios de forma similar a la tecla memoria de las calculadoras.
  • Su funcionamiento es similar al del lenguaje ensamblador ejecutado sobre una CPU little-endian con un solo registro de memoria de 16 bits. Bitcoin implementa su procesador virtual para interpretar el código máquina Script.

Códigos editar

El lenguaje tiene una serie de códigos definidos. Cada código tiene asociado un identificador del tipo OP_<nombre> y un valor numérico al que se le llama Opcode. Podemos agrupar los códigos según el tipo de utilidad que tienen:[3]

Constantes
Identificador Valor hexadeciml Entrada Salida Descripción
OP_0, OP_FALSE 0x00 Nada Nada Se ponen a 0's en la cima de la pila.
N/A 0x01-0x4b (especial) datos Los próximos bytes de opcode es un dato que hay que a poner en la cima de la pila
OP_PUSHDATA1 0x4c (especial) datos El próximo byte contiene el número de bytes para ser puestos en la cima de la pila.
OP_PUSHDATA2 0x4d (especial) datos Los próximos dos bytes contiene el número de bytes que hay que poner en la cima de la pila.
OP_PUSHDATA4 0x4e (especial) datos Los próximos 4 bytes contienen el número de bytes que hay que poner en la cima de la pila.
OP_1NEGATE 0x4f Nada -1 El número -1 es puesto en la cima de la pila
OP_1-OP_16 0x51-0x60 Nada. 1-16 El número del identificador del código (1-16) es puesto en la cima de la pila.
Control de flujo
Identificador Valor hexadeciml Entrada Salida Descripción
OP_NOP 0x61 Nada Nada No hace nada.
OP_IF 0x63 <expresión> if [sentencia] [else [sentencia]]* endif Si la cima de la pila no es falso, ejecuta las sentencias. La cima de pila es borrada.
OP_NOTIF 0x64 <expresión> notif [sentencia] [else [sentencia]]* endif Si la cima de la pila es falsa, ejecuta sentencias. La cima de la pila es borrada.
OP_ELSE 0x67 <expresión> if [sentencia] [else [sentencia]]* endif Si la precedente OP_IF o OP_NOTIF o OP_ELSE no fue ejecutada entonces las sentencias estas sentencias son ejecutadas. Si la precedente OP_IF, OP_NOTIF o OP_ELSE fue ejecutanda entonces no ejecuta estas sentencias.
OP_ENDIF 0x68 <expresión> if [sentencia] [else [sentencia]]* endif Fin de bloque if/else. Todos los bloques tienen que acabar, o la transacción es inválida. Un OP_ENDIF sin un OP_IF anterior es inválido.
OP_VERIFY 0x69 True / false Nada / fallo Marca la transacción como inválida' si la cima de la pila no es true.
OP_RETURN 0x6a Nada fallo Marca la transacción como inválida.
Pila
Identificador Valor hexadeciml Entrada Salida Descripción
OP_TOALTSTACK 0x6b x1 (alt)x1 Pone la entrada encima de la pila alternativa. Borra la entrada de la pila principal.
OP_FROMALTSTACK 0x6c (alt)x1 x1 Pone la entrada, de la pila alternativa, y la pone en la cima de la pila principal. Borra la entrada de la pila alternativa.
OP_IFDUP 0x73 x x / x x Si la cima de la pila no es cero, la duplica.
OP_DEPTH 0x74 Nada <Stack size> Pone el número de artíuclos de la pila en la pila
OP_DROP 0x75 x Nada Quita la cima de la pila.
OP_DUP 0x76 x x x Duplica la cima de la pila.
OP_NIP 0x77 x1 x2 x2 Borra el segundo elemento de la pila.
OP_OVER 0x78 x1 x2 x1 x2 x1 Copia el segundo elemento de la pila a la cima de la pila.
OP_PICK 0x79 xn ... x2 x1 x0 <n> xn ... x2 x1 x0 xn El n-elemento de la pila lo copia a la cima.
OP_ROLL 0x7a xn ... x2 x1 x0 <n> ... x2 x1 x0 xn El n-elemento de la pila es movido a la cima.
OP_ROT 0x7b x1 x2 x3 x2 x3 x1 Los últimos tres elementos de la pila son rotados a la izquierda.
OP_SWAP 0x7c x1 x2 x2 x1 Los dos últimos elementos de la pila son intercambiados.
OP_TUCK 0x7d x1 x2 x2 x1 x2 El elemento de la cima de la pila es copiado e insertado antes del segundo elemento.
OP_2DROP 0x6d x1 x2 Nada Borra los dos últimos elementos de la pila.
OP_2DUP 0x6e x1 x2 x1 x2 x1 x2 Duplica los dos últimos elementos de la pila. En las dos celdas anteriores se indica el cambio
OP_3DUP 0x6f x1 x2 x3 x1 x2 x3 x1 x2 x3 Duplica los tres últimos elementos de la pila. En las dos celdas anteriores se indica el cambio
OP_2OVER 0x70 x1 x2 x3 x4 x1 x2 x3 x4 x1 x2 Cambia elementos de la pila según las dos celdas anteriores
OP_2ROT 0x71 x1 x2 x3 x4 x5 x6 x3 x4 x5 x6 x1 x2 Intercambia posición de elementos de la pila según las dos celdas anteriores
OP_2SWAP 0x72 x1 x2 x3 x4 x3 x4 x1 x2 Intercambia posición de elementos de la pila según las dos celdas anteriores
Empalmar
Identificador Valor hexadeciml Entrada Salida Descripción
OP_CAT 0x7e x1 x2 out deshabilitado[nota 1]
OP_SUBSTR 0x7f in begin size out deshabilitado[nota 1]
OP_LEFT 0x80 in size out deshabilitado[nota 1]
OP_RIGHT 0x81 in size out deshabilitado[nota 1]
OP_SIZE 0x82 in in size Pone la longitud del script en la cima de la pila.
Lógica de bits
Identificador Valor hexadeciml Entrada Salida Descripción
OP_INVERT 0x83 in out deshabilitado[nota 1]
OP_AND 0x84 x1 x2 out deshabilitado[nota 1]
OP_OR 0x85 x1 x2 out deshabilitado[nota 1]
OP_XOR 0x86 x1 x2 out deshabilitado[nota 1]
OP_EQUAL 0x87 x1 x2 True / false Devuelve 1 si las entradas son iguales y 0 en otro caso.
OP_EQUALVERIFY 0x88 x1 x2 Nada / fallo Es lo mismo que OP_EQUAL, pero ejecuta OP_VERIFY después.
Aritméticas
Nota: Las entradas están limitadas a enteros de 32 bits con signo, pero puede haber desbordamiento de salida. Si un valor de entrada para alguno de los comando es más grande que 4 bytes, el script abortará y fallará.
Identificador Valor hexadeciml Entrada Salida Descripción
OP_1ADD 0x8b in out Se incrementa en uno la entrada.
OP_1SUB 0x8c in out Se resta 1 a la entrada.
OP_2MUL 0x8d in out deshabilitado[nota 1]
OP_2DIV 0x8e in out deshabilitado[nota 1]
OP_NEGATE 0x8f in out Se cambia el signo de la entrada
OP_ABS 0x90 in out El signo de la entrada se pone a positivo
OP_NOT 0x91 in out Devuelve 1 si la entrada es 0, en otro caso devuelve 0
OP_0NOTEQUAL 0x92 in out Devuelve 0 si la entrada es 0, en otro caso devuelve 1
OP_ADD 0x93 a b out Se suma a y b
OP_SUB 0x94 a b out A a se le resta b.
OP_MUL 0x95 a b out deshabilitado[nota 1]
OP_DIV 0x96 a b out deshabilitado[nota 1]
OP_MOD 0x97 a b out deshabilitado[nota 1]
OP_LSHIFT 0x98 a b out deshabilitado[nota 1]
OP_RSHIFT 0x99 a b out deshabilitado[nota 1]
OP_BOOLAND 0x9a a b out Si a y b no son 0, la salida es 1. En otro caso será 0.
OP_BOOLOR 0x9b a b out Si a o b no son 0, la salida es 1. En otro caso será 0.
OP_NUMEQUAL 0x9c a b out Devuelve 1 si los números son iguales, devuelve 0 en otro caso.
OP_NUMEQUALVERIFY 0x9d a b Nada / fallo Es lo mismo que OP_NUMEQUAL, pero ejecutando OP_VERIFY después.
OP_NUMNOTEQUAL 0x9e a b out Devuelve 1 si los números no son iguales, 0 en otro caso.
OP_LESSTHAN 0x9f a b out Devuelve 1 si a es menor que b, 0 en otro caso.
OP_GREATERTHAN 0xa0 a b out Devuelve 1 si a es más grande que b, 0 en otro caso.
OP_LESSTHANOREQUAL 0xa1 a b out Devuelve 1 si a es menor o igual que b, 0 en otro caso.
OP_GREATERTHANOREQUAL 0xa2 a b out Devuelve 1 si a es más grande o igual que b, 0 en otro caso.
OP_MIN 0xa3 a b out Devuelve el menor valor entre a y b.
OP_MAX 0xa4 a b out Devuelve el mayor valor entre a y b.
OP_WITHIN 0xa5 x min max out Devuleve 1 si x está en el rango especificado (el valor de la izquierda está incluido) y 0 en otro caso.
Criptográficas
Identificador Valor hexadeciml Entrada Salida Descripción
OP_RIPEMD160 0xa6 in hash A la entrada se le aplica la función hash RIPEMD-160.
OP_SHA1 0xa7 in hash A la entrada se le aplica la función hash SHA-1.
OP_SHA256 0xa8 in hash A la entrada se le aplica la función hash SHA-256.
OP_HASH160 0xa9 in hash A la entrada se le aplica dos funciones hash. Primero SHA-256 y después RIPEMD-160.
OP_HASH256 0xaa in hash A la entrada se le aplica dos veces la función hash SHA-256.
OP_CODESEPARATOR 0xab Nada Nada Marca el comienzo de los datos firmados. Todas las operaciones de chequeo de firma serán de los datos que hay después de la última vez que se marcó con OP_CODESEPARATOR.
OP_CHECKSIG 0xac sig pubkey True / false Los distintos elementos de la transacción (salidas, entradas y script desde el más reciente OP_CODESEPARATOR hasta el final) se les aplica una función hash. La firma usada por OP_CHECKSIG tiene que se una firma válida con este hash y la clave pública. Si no es devuelve 1, en otro caso devuleve 0.
OP_CHECKSIGVERIFY 0xad sig pubkey Nada / fallo Es lo mismo que OP_CHECKSIG, pero OP_VERIFY es ejecutado después.
OP_CHECKMULTISIG 0xae x sig1 sig2 ... <number of signatures> pub1 pub2 <number of public keys> True / False Compara cada firma contra cada una de las claves públicas hasta encontrar una que se ajuste. El proceso de búsqueda se repite hasta que todas las firmas hayan sido checkeadas o no hay suficientes claves públicas para producir un resultado exitoso. Todas las firmas necesitan ajustarse con una clave pública. Las claves públicas solo son comprobadas una vez si falla alguna comparación de firma. Por tanto la firma tendrá que estar localizada en el scriptSig en el mismo orden que su correspondiente clave pública fue localizada en el scriptPubKey o redeemScript. Si todas las firmas son válidas devolverá 1, 0 en otro caso. Debido a un error es borrado de la pila un valor adicional no usado.
OP_CHECKMULTISIGVERIFY 0xaf x sig1 sig2 ... <number of signatures> pub1 pub2 ... <number of public keys> Nada / fallo Es lo mismo que OP_CHECKMULTISIG, pero ejecutando después OP_VERIFY.
Bloqueo de tiempo
Identificador Valor hexadeciml Entrada Salida Descripción
OP_CHECKLOCKTIMEVERIFY (previamente OP_NOP2) 0xb1 x x / fallo Marca la transacción como inválida si el elemento cabeza de la pila es más grande que el campo nLockTime de la transacción, en otro caso el script de evaluación continúa como si se hubiera ejecutado una operación OP_NOP. La transacción es también inválida si: 1 La pila está vacía, o 2 la cabeza de la pila es un elemento negativo o 3 si el elemento de la cabeza de la pila es mayor o igual a 500000000 mientras el nLockTime es menor de 500000000 o viceversa o 4 si el campo nSequence de la entrada es igual a 0xffffffff.
OP_CHECKSEQUENCEVERIFY (previamente OP_NOP3) 0xb2 x x / fallo Marca la transacción como inválida si el tiempo de bloqueo relativo de la entrada no es igual o es más grande que el valor del elemento de la cima de la pila.


Pseudocódigos
Son usadas internamente para asistir con el ajuste de transacciones. Son inválidas si son usadas en los actuales scripts.
Identificador Valor hexadeciml Descripción
OP_PUBKEYHASH 0xfd Representa una clave pública usando la función hash OP_HASH160.
OP_PUBKEY 0xfe Representa una clave pública compatible con OP_CHECKSIG.
OP_INVALIDOPCODE 0xff Se ajusta con cualquier opcode que no esté todavía asignado.
Códigos reservados
Cualquier opcode no asignado está también reservado. Usar un opcode no asignado hace la transacción inválida
Identificador Valor hexadeciml Cuando se usa...
OP_RESERVED 0x50 La transacción es inválida a menos que ocurra en una rama de OP_IF no ejecutada
OP_VER 0x62 La transacción es inválida a menos que ocurra en una rama de OP_IF no ejecutada
OP_VERIF 0x65 La transacción es inválida incluso cuando ocurra en una rama no ejecutada de OP_IF
OP_VERNOTIF 0x66 La transacción es inválida incluso cuando ocurra en una rama no ejecutada de OP_IF
OP_RESERVED1 0x89 La transacción es inválida a menos que ocurra en una rama de OP_IF no ejecutada
OP_RESERVED2 0x8a La transacción es inválida a menos que ocurra en una rama de OP_IF no ejecutada
OP_NOP1, OP_NOP4-OP_NOP10 0xb0, 0xb3-0xb9 Es ignorada, no se marca la transacción como inválida.

Scripts editar

Después de descubrirse varias vulnerabilidades importantes en las primeras versiones de Bitcoin se incluyó una verificación la cual solo acepta transacciones de la red si las operaciones de firma y verificación de firma cumplen con un conjunto de plantillas las cuales se consideran seguras y si el resto de las operaciones no se salen de un conjunto de reglas que garantizan un comportamiento adecuado de la red. Esta verificación está codificada en la función IsStandard() y todas las transacciones que la cumplan se dice que son transacciones estándar. Estas limitaciones podrían cambiar o elminarse en cualquier momento. Hasta entonces hay 5 tipos de transacciones estándar (Pay-To-Public-Key-Hash, pay-to-pubkey, pay-to-multisig, pay-to-script-hash y data output) que son las únicas aceptadas por el cliente de referencia y la mayoría de los mineros que usan el cliente de referencia. Aunque es posible crear transacciones no estándar que contienen scripts que no son estándar, tienes que encontrar un minero que no siga estas limitaciones para que mine la transacción en un bloque.[1][4]


Pay-To-Public-Key-Hash editar

Este tipo de transacción también se identifica por sus siglas P2PKH. La mayoría de las transacciones de Bitcoin son de este tipo. Contienen un script de bloqueo que asigna la salida a una dirección generada a partir de una clave pública. Las direcciones generadas a partir de una clave pública una vez codificadas con base58check comienzan con 1. Las salidas bloquedas por un script P2PKH pueden ser desbloqueadas al presentar la clave pública y una firma digital creada por la correspondiente clave privada.[1]

Script de bloqueo (scriptPubKey)
OP_DUP OP_HASH160 <dirección> OP_EQUALVERIFY OP_CHECKSIG
Script de desbloqueo (scriptSig)
<firma_k> <K_pub>

Ejemplo editar

Veamos un ejemplo de operación.[3]​ Sea el script de bloqueo:

 
 76        A9             14             89 AB CD EF AB BA AB BA AB BA AB BA AB BA AB BA AB BA AB BA        88               AC
OP_DUP  OP_HASH160    Bytes para pila                Datos para pila                                    OP_EQUALVERIFY    OP_CHECKSIG

El procesamiento sería:

Situación final de la pila Situación de evaluación del script. Descripción de la operación de la pila
Vacía. <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Se combinan el script de bloqueo y el de desbloqueo
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Las constantes son añadidas a la pila
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG El elemento cima de la pila es duplicado
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG A la cima de la pila se le aplica la función hash.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Se añade constante
<sig> <pubKey> OP_CHECKSIG Se verifica la igualdad entre los dos primeros elementos de la pila.
true Vacío. Se verifica la firma formada por los dos elementos de la pila.

Pay-to-pubkey editar

Es una forma simplificada del script P2PKH. En ella se especifica la clave pública. Era empleada anteriormente, sigue siendo válida pero se recomienda emplear P2PKH para transacciones nuevas.[1]

Script de bloqueo (scriptPubKey)
<K_pub> OP_CHECKSIG
Script de desbloqueo (scriptSig)
<firma_k>

pay-to-multisig editar

Siglas P2M. Los scripts de multifirma establecen una condición donde N claves públicas se listan en el script de bloqueo y se deben de proporcionar por lo menos M firmas en el script de desbloqueo. Se tiene el límite de 16 claves públicas, lo cual significa que se puede elegir valores N y M que cumplan 1<=N<=M<=16. Los valores de M y N se especifican mediante códigos de operación de la forma OP_1, OP_2,...OP_16. Debido a un error por uno el script de desbloqueo debe iniciar con OP_0. Las firmas deben proporcionarse en el mismo orden que las correspondientes claves públicas.[1]

Script de bloqueo (scriptPubKey)
<M> <KA_pub> [KB_pub] [KC_pub] ..... <N> OP_CHECKMULTISIG
Script de desbloqueo (scriptSig)
OP_0 <firmaA_k> <firmaB_k> ...

pay-to-script-hash editar

Siglas P2SH. Añadida en 2012. Permite simplificar el uso de scripts en transacciones complejas. Por ejemplo, aunque el uso de la multifirma es muy conveniente, se tienen que proporcionar mucha información a quien realiza el pago: el valor N, el de M, cada una de las claves públicas y el orden de las mismas. Todo esto hace que el script de bloqueo se vuelva muy largo y que sea fácil comenter errores. Además no todas las carteras aceptan el uso de multifirma. Por otro lado, las comisiones se basan en el tamaño de la transacción, porque se deberá pagar una mayor comisión.[1]

Con P2SH las transacciones complejas se simplifican al sustituir un script por su valor hash. A partir de valor hash se genera una dirección la cual ya codificada en base58check empieza con 3. En el momento que se queira emplear una UTXO que emplea P2SH se debe presentar el script de bloqueo que enera el valor hash así como el correspondiente script de desbloqueo.[1]

Script de bloqueo (scriptPubKey)
OP_HASH160 <RIPEMD-160(SHA 256(script de bloqueo))> <OP_EQUAL>
Script de desbloqueo (scriptSig)
<script de desbloqueo> <script de bloqueo>

data output editar

Las propiedades de inmutabilidad y transparencia de la cadena de bloques de Bitcoin ha inspirado el desarrollo de técnicas que permitan el transporte de datos en sus transacciones con el fin de implementar nuevas aplicaciones más allá de simplemente realizar pagos.[5]​ Por ejemplo se podía demostrar que un documento se había creado antes de cierta fecha obteniendo el valor hash e indicando su posición en la cadena de bloques. Cómo inicialmente no había ningún mecanismo estándar que soportara esa funcionalidad, se empezó a usar la dirección en una salida para introducir esos datos. De esta forma después de que la transacción era minada esta información estaba siempre en la cadena de bloques. Esto producía que se perdieran satoshis ya que no era posible generar un script de desbloqueo. Además al ser UTXOs están siendo monitoreadas por los nodos de la red lo cual consume recusros. Aparte de hacer que el tamaño de la cadena de bloques se incremente con información que no es del sistema. Para proporcionar una alternativa menos destructiva con la cual se pudiera indicar a los nodos que no requieren procesar la información de esa salida, en la versión 0.9 de Bitcoin se convirtió en transacción estándar la instrucción OP_RETURN, la cual ya existía. A partir de ese momento todos los nodos empezaron a transmitir transaccion OP_RETURN no confirmadas. OP_RETURN solo fue admitido para evitar alternativas peores aunque su uso no es recomendado.[1]

El número de salidas que contienen un script de bloqueo OP_RETURN está limitado a una por transacción. Es necesario pagar comisión para que la transacción sea incluida.[1]​ El límite para almacenar datos con el código OP_RETURN fue originalmente de 80 bytes. En la versión 0.9.0 por primera vez se aceptó la transacción como estándar siempre que tuviera como máximo 40 bytes de datos. Esto tuvo gran polémica. En la versión 0.10.0 los nodos podían elegir si aceptaban o no transacciones OP_RETURN y seleccionaban un máximo para el tamaño de los datos. En la versión 0.11.0 se extendió el límite de datos a 80 bytes, y en la versión 0.12.0 se extendió a un máximo de 83 bytes. Debido a estos límites de espacio cuando se requieren mucho espacio de datos se requiere partir en muchas transacciones lo que obliga a pagar más comisiones[5]

Ejemplos de aplicaciones de introducir datos en la cadena de bloques de Bitcoin:[5]

  • Permitir rastrear la propiedad de un activo digital. En la cadena de bloques se representa activos para permite certificar la propiedad y las transferencias de activos. En una transacción se puede especificar el valor, la cantidad de activo transferida, el nuevo propietario etc. Ejemplos de aplicaciones/protocolos que realizan este tipo de servicio: Colu, Coinspark, OpenAssets, Omni, Counterparty.
  • Notaría de documentos. Protocolos para certificar la propiedad y sellado de tiempo de un documento. Un usuario puede publicar el hash de un documento en una transacción y de esta forma puede probar su existencia e integridad. De forma similar las firmas digitales pueden ser usadas para certificar la propiedad. Ejemplos de aplicaciones/protocolos que realizan este tipo de servicio: Factom, Stampary, Proof of Existence, Blocksign, CrytoCopyright, Stampd, Bitproof, ProveBit, Remembr, OriginalMy, LaPreuve, Nicosia, Chainpoint y Diploma.
  • Protocolos para declarar derechos de acceso y derechos de copia sobre archivos de arte digitales como fotos o música. En este tipo de aplicaciones, a diferencia de los servicios de notaría, normalmente se necesita tener la colección de los archivos y se requieren interacciones con los usuarios. Por ejemplo es frecuente que la aplicación haga de intermediario entre el productor y el consumidor. Ejemplos de aplicaciones/protocolos que realizan este tipo de servicio Monegraph, Blockai, Ascribe.
  • Otros usos como por ejemplo almacenar mensaje de texto corto en la cadena de bloques (como hace por ejemplo Eternity Wall) o proporcionar un almacenamiento clave-valor como servicio para implementar protocolos más complejos (como hace por ejemplo Blockstore)

Es habitual que un protocolo/aplicación marque los primeros bytes de los datos con cierto valor para indicar que se refieren a dicho protocolo.[5]

Script de bloqueo (scriptPubKey)
OP_RETURN <datos>

OP_RETURN inmediatamente marca el script como inválido, garantizando que no hay scriptSig que pudiera gastar l salida. De esta forma puede ser inmediatamente borrado del conjunto de UTXO aunque no esté gastado[3]

Transacción puzle editar

Es una transacción no estándar en la que se necesita tener ciertos datos de tal forma que al aplicar una función hash de cierto valor hash

Script de bloqueo (scriptPubKey)
OP_HASH256 <valor hash dado> OP_EQUAL
Script de bloqueo (scriptPubKey)
<datos>
Situación final de la pila Situación de evaluación del script. Descripción de la operación de la pila
Vacía. <datos> OP_HASH256 <valor hash dado> OP_EQUAL
<datos> OP_HASH256 <valor hash dado> OP_EQUAL scriptSig añadido a la pila
<valor hash calculado> <valor hash dado> OP_EQUAL The data is hashed.
<valor hash calculado> <valor hash dado> OP_EQUAL El valor hash dado se pone en la pila
true Vacío. Los valores se comparan y si todo es correcto se pone un

Notas editar

  1. a b c d e f g h i j k l m n ñ Si cualquier código marcado como deshabilitado está presente en un script entonces este será abortado y fallará

Referencias editar

  1. a b c d e f g h i j Aspectos de seguridad de Bitcoin y su aplicación en una alternativa de infraestructura de llave pública. Tesis de Abraham Jesús Basurto Becerra. Centro de Investigación y de Estudios Avanzados del Instituto Politécnico Nacional. Mexico D.F. Diciembre de 2015
  2. The Bitcoin Script language (pt. 1). Davide De Rosa. 25 de mayo de 2015
  3. a b c Script. bitcoinwiki. 8 de junio de 2017
  4. Mastering Bitcoin: Unlocking Digital Cryptocurrencies. Andreas M. Antonopoulos. O'Reilly 2015
  5. a b c d An analysis of Bitcoin OP RETURN metadata. Massimo Bartoletti y Livio Pompianu. Università degli Studi di Cagliari, Cagliari, Italia.