Introducción al Script de Bitcoin

Bitcoin Cripto.Media
Bitcoin Cripto.Media

Introducción

Bitcoin se conoce a veces como dinero programable. Debido a su naturaleza digital, permite a los usuarios un gran grado de flexibilidad a la hora de establecer condiciones para cómo se pueden gastar los fondos.

Hablamos de carteras y monedas cuando hablamos de Bitcoin. Pero también podríamos pensar en carteras como llaves, monedas como cheques, y la cadena de bloques como fila tras fila de cajas fuertes bloqueadas. Cada caja fuerte tiene una ranura delgada en ella, de tal manera que cualquier persona puede depositar cheques o mirar para ver cuánto valor tiene la caja fuerte. Sin embargo, sólo el titular de la llave podrá acceder al interior.

Cuando un titular de la llave quiere dar dinero a otra persona, desbloquea su caja. Hacen un nuevo cheque que hace referencia al más antiguo (que luego se destruye) y lo encierran en una caja que el destinatario puede abrir. Para gastar eso, el nuevo destinatario repite el proceso.

En este artículo, echaremos un vistazo más de cerca a Script, el lenguaje de programación interpretado por los nodos de la red Bitcoin. El script es lo que rige el mecanismo de bloqueo/desbloqueo mencionado para las cajas fuertes.

¿Cómo funciona Bitcoin?

Funcionando con nuestra analogía desde arriba, se podría decir que hay dos partes para cada transacción – un Clave (para desbloquear su caja) y una Cerradura. Utilice la clave para abrir la caja que contiene el cheque que desea enviar y, a continuación, agregue uno nuevo a una nueva caja con un bloqueo diferente. Para pasar desde la nueva caja, necesita otra llave.

Bastante simple. También puede obtener un poco de variación en los tipos de bloqueos en el sistema. Tal vez algunas cajas fuertes requieren que proporciones varias claves, y tal vez otras te necesiten para demostrar que conoces un secreto. Hay un montón de condiciones que la gente puede establecer.

Nuestra clave es lo que llamamos un scriptSig. La cerradura es nuestra scriptPubKey. Si miramos esos componentes con un poco más de detalle, encontraremos que en realidad están formados por bits de datos y bloques de código. Cuando se combinan, crean un programa diminuto.

Cuando realiza una transacción, está transmitiendo esa combinación a la red. Cada nodo que lo recibe comprobará el programa, que le indica si la transacción es válida. Si no, sólo será descartado, y usted no será capaz de gastar los fondos bloqueados.

Los cheques (monedas) que tiene se denominan salidas de transacción no insofensados (UXO). Los fondos pueden ser utilizados por cualquier persona que pueda proporcionar la llave que se ajusta a la cerradura. Específicamente, la clave es scriptSig y el bloqueo es scriptPubKey.

Si los UTXO están en su billetera, probablemente tendrán una condición que dice sólo la persona que puede probar la propiedad de esta clave pública puede desbloquear estos fondos. Para desbloquearlo, proporcione un scriptSig que incluya una firma digital, utilizando la clave privada que se asigna a la clave pública especificada en scriptPubKey. Todo esto se aclarará en breve.

Comprender la pila de Bitcoin

El guión es lo que se conoce como basado en pilas Idioma. Todo esto significa que, cuando leemos un conjunto de instrucciones, las colocamos en lo que se puede considerar como una columna vertical. La lista A, B, C, por ejemplo, daría como resultado una pila con A en la parte inferior y C en la parte superior. Cuando las instrucciones nos dicen que hagamos algo, operamos en uno o más elementos que comienzan en la parte superior de la pila.

Elementos A, B y C que se agregan y

Elementos A, B y C que se agregan y «reventan» de la pila.

Podemos distinguir entre los datos (cosas como firmas, hashes y claves públicas) y las instrucciones (o Opcodes). Las instrucciones eliminan los datos y hacen algo con él. Este es un ejemplo muy simple de cómo podría ser un script:

En rojo, tenemos datos, y en azul, tenemos los códigos de operación. Leemos de izquierda a derecha, así que primero pusimos la cuerda en la pila. El siguiente es el siguiente Opcode. Este no existe en Bitcoin, pero digamos que elimina el elemento superior de la pila () y lo aplica hash utilizando el algoritmo MD5. Entonces, la salida se agrega de nuevo a la pila. La salida aquí resulta ser d16fb36f0911f878998c136191af705e.

¡Qué coincidencia! Nuestro siguiente elemento a añadir es , por lo que ahora nuestra pila tiene dos elementos idénticos. Finalmente hace estallar dos elementos de la parte superior y comprueba si son iguales. Si lo son, añade <1> a la pila. Si no es así, añade <0>.

Tenemos que terminar nuestra lista de instrucciones. Nuestro script podría haber fallado de dos maneras: si el elemento restante era un cero, o si uno de los operadores hizo que fallara cuando no se cumplían algunas condiciones. No teníamos ningún operador de este tipo en este ejemplo, y terminamos con un elemento distinto de cero (<1>), por lo que nuestro script era válido. Estas reglas también son ciertas para las transacciones reales de Bitcoin.

Eso fue sólo un programa inventado. Echemos un vistazo a algunos de verdad ahora.

Pay-to-Pubkey (P2PK)

Pay-to-Pubkey (P2PK) es increíblemente sencillo. Implica el bloqueo de fondos a una clave pública en particular. Si desea recibir fondos de esta manera, proporcionaría al remitente su clave pública, en lugar de una dirección Bitcoin.

La primera transacción entre Satoshi Nakamoto y Hal Finney en 2009 fue una transacción P2PK. La estructura fue muy utilizada en los primeros días de Bitcoin, pero hoy en día, Pay-to-Pubkey-Hash (P2PKH) la ha reemplazado en gran medida.

El script de bloqueo de una transacción P2PK sigue el formato de OP_CHECKSIG. Bastante simple. Usted podría haber adivinado que OP_CHECKSIG para una firma con respecto a la clave pública proporcionada. Como tal, nuestro scriptSig va a ser un simple . Recuerde, el scriptSig es la clave del bloqueo.

a la pila. De lo contrario, añade un <0>»/>

No es mucho más simple que esto. Una firma se agrega a la pila, seguida de una clave pública. OP_CHECKSIG los hace estallar y verifica la firma con la clave pública. Si coinciden, añade un <1> a la pila. De lo contrario, añade un <0>.

Por razones que explicaremos en la siguiente sección, P2PK ya no se usa realmente.

Pay-to-Pubkey-Hash (P2PKH)

Pay-to-Pubkey-Hash (P2PKH) es ahora el tipo de transacción más común. A menos que estés haciendo todo lo posible para descargar software arcaico, es probable que tu billetera esté haciendo esto por defecto.

El scriptPubKey en P2PKH es el siguiente:

OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG

Antes de introducir el scriptSig, vamos a desglosar lo que harán los nuevos códigos de operación:

OP_DUP

OP_DUP hace estallar el primer elemento, y Duplicados eso. A continuación, agrega ambos de nuevo a la pila. Normalmente, esto se hace para que podamos hacer una operación en el duplicado sin afectar al original.

OP_HASH160

Esto hace estallar el primer elemento y lo aplica dos veces. La primera ronda se hash con el algoritmo SHA-256. A continuación, se aplica un algoritmo hash a la salida SHA-256 con el algoritmo RIPEMD-160. La salida resultante se agrega de nuevo a la pila.

OP_EQUALVERIFY

OP_EQUALVERIFY combina otros dos operadores: OP_EQUAL y OP_VERIFY. OP_EQUAL hace estallar dos elementos y comprueba si son idénticos. Si lo son, agrega un 1 a la pila. Si no es así, añade un 0. OP_VERIFY hace estallar el elemento superior y comprueba si es True (es decir, distinto de cero). Si no es así, se produce un error en la transacción. Combinado, OP_EQUALVERIFY hace que la transacción falle si los dos elementos principales no coinciden.

Esta vez, el scriptSig se ve así:

Debe proporcionar una firma y la clave pública correspondiente para desbloquear las salidas P2PKH.

Sólo estamos agregando un paso adicional para comprobar que la clave pública coincide con el hash en el script

Puedes ver lo que está pasando en el GIF anterior. No es muy diferente de un script P2PK. Solo estamos agregando un paso adicional para comprobar que la clave pública coincide con el hash del script.

Sin embargo, hay algo a tener en cuenta. En un script de bloqueo P2PKH, la clave pública no es visible – solo podemos ver su hash. Si vamos a un explorador de blockchain y miramos una salida P2PKH que no se ha gastado, no podemos determinar la clave pública. Sólo se revela cuando el receptor decide transferir los fondos.

Esto tiene un par de beneficios. La primera es que el hash de clave pública es simplemente más fácil de pasar que una clave pública completa. Satoshi lo lanzó en 2009 por esta misma razón. El hash de clave pública es lo que hoy conocemos como una dirección Bitcoin.

La segunda ventaja es que los hashes de clave pública podrían proporcionar una capa adicional de seguridad contra la computación cuántica. Debido a que nuestra clave pública no se conoce hasta que gastamos los fondos, es aún más difícil para otros calcular la clave privada. Tendrían que invertir las dos rondas de hash (RIPEMD-160 y SHA-256) para obtenerlo.

¿Desea comenzar con criptomonedas? Comprar Bitcoin en Binance!

Pay-to-Script-Hash (P2SH)

Pay-to-Script-Hash (P2SH) fue un desarrollo muy interesante para Bitcoin. Permite al remitente bloquear fondos al hash de un script: no necesita saber qué hace realmente el script. Tome el siguiente hash SHA-256:

e145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1

No necesitas saber the hash’s input para bloquear fondos a él. El gastador, sin embargo, necesita proporcionar el script que se usó para hash y necesita satisfacer las condiciones de ese script.

El hash anterior se creó a partir del siguiente script:

<4>

Si desea gastar las monedas vinculadas a ese scriptPubKey, no sólo proporciona esos comandos. También necesita un scriptSig que haga que el script completado se evalúe como True. En este ejemplo, ese es un elemento que para dar un resultado de <4>. Por supuesto, eso significa que nuestro scriptSig es sólo <2>.

En la vida real, el scriptPubKey para una salida P2SH es:

OP_HASH160 OP_EQUAL

No hay nuevos operadores aquí. Pero, tenemos como un nuevo elemento. Como su nombre indica, es un hash del script que necesitamos proporcionar para redimir los fondos (llamado el redeemScript). El scriptSig cambiará dependiendo de lo que hay en el canjeScript. Por lo general, sin embargo, encontrará que se trata de alguna combinación de firmas y las claves públicas adjuntas, seguido de la (obligatoria) redeemScript:

Nuestra evaluación difiere un poco de la ejecución de la pila que hemos visto hasta ahora. Sucede en dos partes. El primero simplemente comprueba que ha proporcionado el hash correcto.

Hemos llegado al final de este miniprograma, y el elemento superior es distinto de cero. Eso significa que es válido

Observará que no hacemos nada con los elementos anteriores a redeemScript. No se usan en este momento. Hemos llegado al final de este miniprograma, y el elemento superior es distinto de cero. Eso significa que es válido.

Aún no hemos terminado. Los nodos de red reconocen esta estructura como P2SH, por lo que en realidad tienen los elementos de scriptSig esperando en otra pila. Ahí es donde se usará la firma y la clave pública.

Hasta ahora, hemos tratado el redeemScript como un elemento. Pero ahora, se interpretará como instrucciones, lo que podría ser cualquier cosa. Tomemos el ejemplo de un script de bloqueo P2PKH, al que debemos proporcionar el Y que coincide con un dentro de la .

Una vez que su redeemScript se ha ampliado, puede ver que tenemos una situación que se parece exactamente a una transacción P2PKH normal.

Una vez que su redeemScript se ha ampliado, puede ver que tenemos una situación que se parece exactamente a una transacción P2PKH normal. A partir de ahí, sólo tienes que ejecutarlo como lo harías con uno normal.

Hemos demostrado lo que se llama un script P2SH(P2PKH) aquí, pero es poco probable que encuentre uno de esos en la naturaleza. Nada te impide hacer uno, pero no te da beneficios adicionales y termina ocupando más espacio en un bloque (y, por lo tanto, cuesta más).

P2SH generalmente es útil para cosas como transacciones compatibles con multifirma o compatibles con SegWit. Las transacciones Multisig pueden tener un tamaño muy grande, ya que pueden requerir varias claves. Antes de la implementación de Pay-to-Script-Hash, un remitente tendría que enumerar todas las claves públicas posibles en su script de bloqueo.

Pero con P2SH, no importa cuán complejas sean las condiciones de gasto. El hash de redeemScript siempre es de un tamaño fijo. Por lo tanto, los costos se pasan a los usuarios que desean desbloquear el script de bloqueo.

La compatibilidad con SegWit es otro caso en el que P2SH es útil (entraremos en los detalles de cómo la estructura de la transacción difiere en la siguiente sección). SegWit fue una horquilla suave que resultó en un cambio en los formatos de bloque/transacción. Debido a que es una actualización opt-in, no todo el software de la cartera reconoce los cambios.

Eso no importa si los clientes ajustan el hash de script SegWit en P2SH. Al igual que con todas las transacciones de este tipo, no necesitan saber cuál será el canje de desbloqueoScript.

Transacciones SegWit (P2WPKH y P2WSH)

Para una introducción más completa a SegWit, echa un vistazo Una guía para principiantes para testigos segregados.

Para entender el formato de transacción en SegWit, solo necesita saber que ya no solo tenemos un scriptSig y un scriptPubKey. Ahora, también tenemos un nuevo campo llamado el Testigo. Los datos que usamos para mantener en el scriptSig se mueven al testigo, por lo que el scriptSig está vacío.

Si se ha encontrado con direcciones que comienzan con ‘bc1’, esos son lo que llamamos SegWit-native (a diferencia de solo compatible con SegWit, que comienzan con un ‘3’ ya que son direcciones P2SH).

Pay-to-Witness-Pubkey-Hash (P2WPKH)

Pay-to-Witness-Pubkey-Hash (P2WPKH) es la versión SegWit de P2PKH. Nuestro testigo se ve así:

Observará que esto es lo mismo que el scriptSig de P2PKH. Aquí, el scriptSig está vacío. Mientras tanto, scriptPubKey se asemeja a lo siguiente:

Eso parece un poco extraño, ¿no? ¿Dónde están los códigos de operación para permitirnos comparar la firma, la clave pública y su hash?

No estamos mostrando operadores adicionales aquí, porque los nodos que reciben la transacción saben qué hacer con ella en función de la longitud de . Calcularán la longitud y comprenderán que debe ejecutarse en el mismo estilo que una buena transacción P2PKH con la moda.

Los nodos no actualizados no saben cómo interpretar la transacción de esa manera, pero no importa. Bajo las reglas antiguas, no hay testigo, por lo que leen un scriptSig vacío y algunos datos. Evalúan esto y lo marcan como válido: en lo que a ellos respecta, cualquiera podría gastar la salida. Esta es la razón por la que SegWit se considera una horquilla suave compatible con versiones anteriores.

Pay-to-Witness-Script-Hash (P2WSH)

Pay-to-Witness-Script Hash (P2WSH) es el nuevo P2SH. Si has llegado hasta aquí, probablemente puedas averiguar cómo se verá esto, pero lo revisaremos de todos modos. Nuestro testigo es lo que normalmente pondríamos en el scriptSig. En un P2WSH que envuelve una transacción P2PKH.

Gracias por leernos.