El código de operación CheckSequenceVerify, es una interesante funcionalidad de Bitcoin que abre las puertas a scripts avanzados que nos permite hacer pagos seguros controlados por valores de tiempo programables.
Una de las funciones más útiles que tiene Bitcoin Script, son los bloqueos de tiempo o TimeLock, como el código de operación (OP_CODE) CheckSequenceVerify (CSV). Que junto a otros códigos de bloqueo hacen posible que Bitcoin pueda ser utilizado como un dinero digital programable.
El CheckSequenceVerify es un bloqueo de tiempo relativo que opera a nivel de script. Este nos permite poder definir el momento exacto en que terminara un bloqueo sobre una transacción determinada. Y aunque esta es una característica que hizo parte del soft fork del BIP 68, no fue hasta el BIP 112 donde verdaderamente fue añadida al sistema Bitcoin.
La utilidad los CheckSequenceVerify permite funcionalidad avanzadas para la construcción de sistemas como los canales de pago de Lightning Network (LN). Además, abre las puertas a la creación de funcionalidades avanzadas para el manejo de fondos de forma descentralizados, útiles para exchanges descentralizados (DEX) o servicios de intercambio P2P seguros.
Así mismo, aunque la manera de operar de CheckSequenceVerify (CSV) sea bastante similar a la de CheckLockTimeVerify (CLTV), en CSV se comprueba la pila superior con el campo de entrada, en lugar de verificar el tiempo como es el caso de CLTV. Asi podemos calcular el tiempo en función al número de bloques que se han generado luego de confirmada la transacción. Es decir, que los bloqueos de tiempo relativo como CheckSequenceVerify pueden marcar una transacción como inválida. Y para ello vigilan que haya transcurrido el intervalo de tiempo establecido desde que se confirmaron las salidas anteriores de la transacción.
En palabras más simples, los bloqueos de tiempo relativo nos permiten definir exactamente la cantidad de tiempo a transcurrir para que se pueda confirmar una transacción. A diferencia de los bloqueos de tiempo absoluto que definen el momento exacto (número de bloque, o fecha y hora) en que culminará el bloqueo sobre la transacción.
¿Cómo funciona CheckSequenceVerify (CSV)?
Los bloqueos de tiempo a nivel de script como CheckSequenceVerify (CSV) operan en conjunto con los bloqueos a nivel de transacción, por lo que estos últimos son importantes a la hora de aplicar un bloqueo CSV. Esto se debe a que en los bloqueos CSV los scripts comprueban el bloqueo de la transacción. Para ello verifican que dicha transacción esté bloqueada y utilizan estos bloqueos sobre las transacciones como una garantía de antigüedad que indica que ha transcurrido el tiempo establecido.
En el BIP 112 de Bitcoin, CheckSequenceVerify es descrito como un código de operación que le otorga una nueva definición al comando OP_NOP3 ya existente. Esta actualización, le permite realizar bloqueos a una transacción a nivel de script en función de la edad o la antigüedad de la salida que se está gastando. Esta funcionalidad se ejecuta en conjunto con el BIP 68. De esta forma, también puede impedir que una transacción se pueda incluir dentro de un bloque. Esto hasta que no haya transcurrido el tiempo o la antigüedad establecida.
Cuando se comprueba el bloqueo CSV con el valor nSequence establecido, se verifica si ya se ha cumplido la antigüedad mínima de la salida que se está gastando. En caso de no cumplirse aún, las rutas de ejecución de script que incluyan el bloqueo CSV se podrán validar. Así la transacción no se podrá incluir en un bloque hasta que no se cumpla la condición.
Así, cuando el código de operación CSV es llamado, hace que la secuencia de comando falle a menos que el número de secuencia en la transacción indique que ya ha transcurrido un intervalo de tiempo en el bloqueo de tiempo relativo, que sea mayor o igual que el indicador del código de operación CSV. Garantizando así que la transacción sólo pueda ser incluida en un bloque válido una vez que se haya cumplido o expirado el tiempo de bloqueo.
Cuando se implementa este código de operación, CheckSequenceVerify permite establecer bloqueos sobre las transacciones con un máximo de hasta 65.535 bloques. Pero también se puede establecer dicho bloqueo a un máximo de hasta 65.535*512 segundos. Por otro lado, estos bloqueos son muy útiles al momento de establecer bloqueos de tiempo relativo sobre las transacciones que no han sido confirmadas o transmitidas a la red. Puesto que CSV permite la creación de transacciones inteligentes definiendo y estableciendo todas las instrucciones que sean necesarias para su ejecución por adelantado. Asi tenemos la garantía y la seguridad que dicho contrato o transacción sólo ocurrirá bajo el orden establecido. Todo ello sin importar el momento en el que se comience a ejecutar.
Implementaciones de CheckSequenceVerify (CSV)
La implementación del código de operación OP_CSV permiten que las transacciones en la blockchain tengan una fecha de vencimiento relativa. Una propiedad que a su vez permite que las transacciones se puedan almacenar de forma indefinida. Siempre y cuando permanezcan las condiciones de bloqueos de tiempo inicialmente establecidas. Todo lo contrario sucedería si se emplea el código de operación OP_CLTV, con el cual toda la cadena de transacciones si tendrían una fecha límite de ejecución y vencimiento.
Entonces, cuando se emplea OP_CSV para encadenar las transacciones a través de los tiempos de bloqueos relativos, es posible crear una ruta de código que sólo sea accesible al transcurrir el intervalo de tiempo establecido. Es decir, después de que se confirmen las salidas que se están gastando. Permitiendo la creación y aplicación de funciones adicionales que hacen mucho más atractiva a la red. Por ejemplo, la implementación de contratos con plazos de vencimiento o la posibilidad de contar prácticamente con la característica de reorganización de la cadena o invalidación retroactiva. Que aunque es casi imposible de realizar en una blockchain, sí se pueden establecer otras aplicaciones similares como protocolos de custodia o contratos con tiempo bloqueado, canales de pago bidireccionales y Lighting Network.
¿Cuánto sabes, criptonauta?
¿La existencia de CheckSequenceVerify es vital para Lightning Network?¡CIERTO!
Uno de los requisitos necesarios para el funcionamiento de Lightning Network es la función CheckSequenceVerify, una necesidad descrita en el whitepaper de Lightning Network, especialmente para evitar situaciones en los que alguna de las partes pueda robar fondos del sistema.
Casos de uso de CheckSequenceVerify (CSV)
Ahora bien examinemos algunos casos de uso que CSV nos permite dentro de Bitcoin gracias a su creación:
Creación de contratos con tiempo de vencimiento
Con CSV es posible establecer contratos con tiempo a plazo fijo o fecha de vencimiento. En estos contratos, se pueden definir varias condiciones que iniciaran cuando se comience y se haga efectiva una transacción. Por ejemplo: para efectuar un depósito de garantía entre 2 o más personas, que se venza de forma automática después de 30 días de haberse realizado, las partes involucradas (María, Pedro y Juan) pueden crear una dirección multifirma con las siguientes condiciones:
- Los fondos se pueden gatar en cualquier momento que se desee, si se emplean 2 de las 3 firmas autorizadas. Estas se pueden combinar de cualquier manera (María y Pedro, Pedro y Juan, María y Juan).
- María puede firmar sola y hacer uso de los fondos sólo después de que transcurran 30 días de efectuada la transacción.
Este bloqueo de tiempo relativo dará inicio hasta que se confirme la transacción en la dirección de depósito.
Creación de protecciones de invalidación retroactiva
Si bien por razones de seguridad y protección, la blockchain es inmutable una vez que se ha añadido datos e información en ella. Pero hay muchos casos en los que es ideal poder cambiar o anular un contrato una vez establecido. No obstante, aunque directamente no se puede realizar una invalidación retroactiva una vez que los datos han sido confirmados dentro de la blockchain, sí se puede efectuar una reorganización de la cadena. Aunque esta característica también es particularmente difícil de hacer y bastante costosa.
Aun así, por medio del código de operación CSV se pueden construir scripts con varias ramificaciones para la ejecución de las operaciones. Donde, si una o varias de estas ramas se retrasan o no se cumplen, se crea un espacio en el que es posible añadir una condición para la invalidación del contrato original, que permita el gasto de las salidas. Anulando la ramificación donde está establecida la condición que no se cumplió. Evitando así que la transacción se transmita a la red. En caso caso contrario, el contrato seguirá el curso establecido originalmente.
Creación de contratos HTLC (Hash Time Locked Contracts)
Una de las funciones más importantes de los CSV es la creación de los Hash Time Locked Contracts o Contratos de tiempo de hash bloqueado (HTLC). Es gracias a estos contratos que es posible realizar un sistema que permite a dos usuarios crear una canal de pago. Uno donde la parte receptora debe crear una prueba criptográfica válida a fines de liberar el pago retenido por el contrato.
Esta función es la que permite por ejemplo crear canales de pago seguro entre dos usuarios. Siendo estos canales capaces de realizar operaciones on-chain (en la misma cadena) y cross-chain (entre dos cadenas distintas). De esa forma, los HTLC habilitan un mecanismos seguro para realizar operaciones de atomic swaps.
Pero no solo eso, los HTLC también son los que hacen posible el funcionamiento seguro de la Lightning Network. Demostrando así el impacto y utilidad de las CSV en todo el ecosistema Bitcoin.