Las direcciones P2SH o Pay-to-Script-Hash son un tipo especial de dirección en Bitcoin, que permite crear direcciones que pueden recibir o enviar transacciones en las que se deben cumplir una serie de instrucciones para poder desbloquear los saldos que contienen dichas direcciones.
El Pay-to-ScriptHash, o también conocido como P2SH, es un formato de script utilizado en la red Bitcoin que permite bloquear los bitcoins en el hash del script (una parte) y luego proporcionar el script original (completo) cuando los bitcoins son desbloqueados al momento de realizar una transacción.
Esta función permite que sea posible la creación de scripts de canje personalizados que pueden ser compartidos con facilidad con otros usuarios. Es decir, permite crear direcciones o transacciones con programaciones no convencionales. Y estas solo pueden desbloquearse cumpliendo una serie de condiciones preestablecidas.
Desde 2012, Bitcoin y otras criptomonedas incorporan el formato P2SH en muchas de sus direcciones. A través de las cuales se pueden efectuar transacciones que se envíen a un hash de script, en lugar de a uno de clave pública. Es decir, que las transacciones se envíen a una dirección que comience con 3 en lugar de una que comience con 1 (ECDSA). Por lo que las direcciones codificadas bajo este formato representan el hash codificado de un script y no el de una clave pública ECDSA.
Así mismo, debido a esta característica, las direcciones con formato P2SH se emplean generalmente para efectuar transacciones a direcciones multifirmas. Aunque éste no sea su único uso. Con P2SH se pueden configurar direcciones que pueden representar un script a través del cual se codifica a otro tipo de transacciones. Por ejemplo, con P2SH un usuario puede enviar sus bitcoins a una dirección segura de muchas formas posibles o inusuales sin tener conocimiento de cómo se ha configurado la seguridad. Mientras que el usuario que recibe la transacción podría necesitar cumplir ciertas condiciones o instrucciones especiales para poder desbloquear la transacción.
Ejemplo de una transacción P2SH
Una transacción P2SH funciona gracias a que el scriptPubKey contiene un hash que debe ser desbloqueado con el fin de liberar el pago de los bitcoins bloqueados. En primer lugar, el script de origen de desbloqueo de la transacción (redeem script o script de canje) está dentro del scriptSig de la transacción.
Aquí podemos ver claramente que el scriptSig hace mención a una dirección MuSig o multifirma del tipo (2 de 3). En ella vemos tres claves (las llaves en la imagen), dos firmas (de los participantes de la transacción) y el OP_CODE (código de operación), OP_CHECKMULTISIG. Lo que hará esta parte del script de la transacción es verifica que las firmas y llaves dentro del mismo sean capaces de desbloquear la operación.
Es decir, verificar que al menos 2 de las tres personas autorizadas están haciendo la transacción. Una vez que el script haya verificado esto, podemos estar seguro que tenemos en nuestro poder el script de desbloqueo de los bitcoin y pasamos a la segunda parte.
En la segunda parte vemos como el scriptPubKey de una transacción P2SH tiene la siguiente estructura:
Estos OP_CODEs nos dicen que el scriptPubKey solo se desbloqueara si podemos probar que tenemos el script de origen de la transacción (el redeem script comprobado en el scriptSig). Para ello debemos tomar el resultado de este script y ejecutar la operación OP_HASH160. Es decir, aplicar al script un hash SHA-256 y luego, un RIPEMD-160. El resultado será comparado con el “hash script” dentro del scriptPubKey (esto usando OP_EQUAL) y si el resultado es idéntico, habremos desbloqueado con éxito nuestros bitcoins.
Implementación del formato P2SH en las direcciones de Bitcoin
BIP-0013
El formato de dirección de Pay-to-ScriptHash fue introducido inicialmente en el BIP 13 diseñado por Gavin Andresen. Donde describe un nuevo formato para las direcciones de Bitcoin con el que se puede admitir transacciones arbitrarias complejas.
En este BIP Andressen describe que este nuevo formato para las direcciones de Bitcoin va a utilizar una longitud fija de 20 bytes. Que representa el hash del script por medio del cual se puede intercambiar las criptomonedas. Y que puede ser utilizado y escaneado de forma fácil desde un código QR, o ser copiado y pegado rápidamente para efectuar la transacción que se desea.
Así mismo, Andresen describe que en los primeros 4 bytes de la secuencia de bytes está integrada la función checksum o suma de verificación de la dirección, que fortalece la infraestructura y la seguridad de la red Bitcoin. Al permitir la implementación de un método de verificación mucho más seguro, óptimo y eficiente que simplemente truncar a SHA-256. Al mismo tiempo que se añade una identidad propia para cada dirección creada en la red.
BIP-0016
Así mismo, en el BIP 16, que fue anunciado unos meses después del BIP 13 por Gavin Andresen, se explica a P2SH como una bifurcación suave al protocolo de Bitcoin diseñado de forma que permita establecer las direcciones P2SH como un nuevo tipo de transacción estándar. Que busca la simplificación en el uso de los scripts en cualquier tipo de transacción, por muy compleja que esta sea.
El BIP 16, junto al BIP 13, pretende minimizar los cambios que se necesitan realizar en la infraestructura de soporte de la red Bitcoin. Haciendo que sea más fácil el poder compartir los scripts de bloqueo con otros usuarios, por muy complejos que estos scripts sean.
Por ejemplo, antes de la implementación de P2SH si quería añadir una secuencia de comandos de bloqueo compleja en sus bitcoins, era necesario que compartiera toda la secuencia de comandos de bloqueo con el usuario que le realizara una transferencia. Pero con la llegada de P2SH ahora es posible darle a ese usuario sólo una parte de la secuencia de comandos de bloqueo, en lugar de la secuencia completa. Es decir, se puede entregar sólo un hash del script en lugar del script completo.
Ventajas de la implementación de P2SH
Direcciones multifirmas
La activación de P2SH le permite a los usuarios del sistema Bitcoin poder realizar o recibir transacciones en direcciones multifirmas. De hecho, esta es la aplicación más común que se conoce para el formato P2SH. Ya que las direcciones con formato P2SH están diseñadas para admitir un conjunto de firmas que sea igual o menor que la cantidad de claves privadas que están vinculadas o asociadas a ellas. Es decir, en una dirección multifirma que tenga 3 claves asociadas, las 3 claves pueden ser los firmantes, o en su defecto sólo 2 o 1 de ellas.
Por otra parte, las direcciones de Bitcoin que utilizan el formato P2SH se identifican fácilmente ya que inician con el número 3. Pero aunque su uso frecuente sea para crear direcciones multifirma, no siempre que una dirección comience con este número significa que se trata de una dirección multifirma. Una dirección que inicie con el número 3 siempre será una dirección P2SH, pero no siempre se tratará de una dirección multifirma.
Seguridad y Privacidad
A través del formato P2SH un usuario puede financiar cualquier script sin conocer cuáles son las condiciones de gasto que están vinculadas a ese script. Es decir, el usuario puede enviar o compartir los scripts asociados a una transacción sin tener conocimiento parcial o total sobre la configuración de estas condiciones o instrucciones de seguridad.
Por lo que en el caso de ser remitente, el usuario sólo deberá enviar las transacciones que desee realizar a la dirección P2SH. Sin necesidad de saber cómo serán gastados los fondos que ha enviado. Mientras que en el caso de ser receptor o destinatario, el usuario sí debe conocer las condiciones de gastos asociadas con esa transacción. Que pueden variar entre la necesidad de multifirma, contraseña u otro, para poder acceder a las criptomonedas que le han sido enviadas.
Así mismo, si el script de bloqueo P2SH sólo contiene un hash del script, es imposible saber qué tipo de script que proviene de ese hash. Haciendo impoisible que un usuario pueda conocer si una transacción proviene de una dirección particular o de una multifirma.
Salidas no gastadas más pequeñas
Como todas las salidas no gastadas o UTXOs de Bitcoin se almacenan en la memoria RAM de los nodos, es importante ahorrar este espacio de almacenamiento. Así, al emplear scripts de bloqueo P2SH con secuencias más pequeñas, las UTXOs requerirán un espacio menor para ser almacenadas, permitiendo que los nodos sean computacionalmente más eficientes y que trabajen de forma ágil y competente en la validación de las transacciones de la red.
Tarifas de comisión más bajas
Como las tarifas de comisión que son cobradas en Bitcoin no están relacionadas con las cantidades transferidas sino con el tamaño de las transacciones, un hash de script con una longitud más pequeña le permite al remitente de una transacción poder enviar sus fondos a direcciones P2SH sin tener que pagar tarifas de comisión elevadas. Como sí ocurriría en el caso de utilizar los scripts completos.
Aunque esto en la actualidad puede no significar un problema grave, es posible que sí lo sea en el futuro; cuando las recompensas por minería se reduzcan y los nodos se mantengan con las tarifas de comisión por transacción.
SegWit
Las direcciones con formato P2SH son compatibles tanto con direcciones SegWit como con las que no lo son. Por lo que los usuarios pueden enviar sus fondos y realizar transacciones en ambos monederos con facilidad.
Desventajas de la implementación de P2SH
La verdad es que P2SH tiene muy pocas desventajas o limitaciones. Debido a que P2SH fue implementado tiempo después del desarrollo de los scripts originales de Bitcoin, por lo que los desarrolladores tuvieron oportunidad de corregir las limitaciones que se presentaban en la red para ese entonces. No obstante, las limitaciones que presenta P2SH son:
Tamaño de los datos
P2SH ocupa mayor espacio dentro de la blockchain. Lo que puede llegar a ocasionar congestión e influir en la capacidad de operación de la red. Esto se debe a que durante el bloqueo de bitcoins en P2SH se añaden 25 bytes más al script original, dejando a un script multifirma 2 de 3 que utilice P2SH con 278 bytes. En comparación con los 253 bytes que tendría el mismo script multifirma 2 de 3 que utilice P2MS.