El código de operación CheckSequenceVerify, es una funcionalidad interesante de Bitcoin que abre las puertas a scripts avanzados que nos permiten 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 realmente fue añadida al sistema Bitcoin.
La utilidad los CheckSequenceVerify permite funciones 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 intercambios descentralizados (DEX) o servicios de intercambio P2P seguros.
Así mismo, aunque la manera de operar de CheckSequenceVerify (CSV) es 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 funcion al numero de bloques que se han generado luego de confirmada la transaccion. Es decir, que los bloqueos de tiempo relativos 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 confirmon las salidas anteriores de la transacción.
En más palabras simples, los bloqueos de tiempo relativos 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 define el momento (número de bloque, o fecha exacta 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 transacciones, 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 verificar que dichas transacciones estén bloqueadas y utilizar 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 se describe 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 incluyen 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 caducado 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 relativos 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 presentando todas las instrucciones que sean necesarias para su ejecución por adelantado. Asi tenemos la garantia y la seguridad que dicho contrato o transaccion solo ocurrira 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 permite que las transacciones en la cadena de bloques 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 establecidos. Todo lo contrario sucedería si se empleara 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 crear, cuando se emplea OP_CSV para encadenar las transacciones a través de los tiempos de bloqueos relativos, es posible 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 con la característica de reorganización de la cadena o invalidación retroactiva. Que aunque es casi imposible de realizar en una cadena de bloques, sí se pueden establecer otras aplicaciones similares como protocolos de custodia o contratos con tiempo bloqueado, canales de pago bidireccionales y Lighting Network.
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 utilizan 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 realización de la transacción.
Este bloqueo de tiempo relativo daría 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 cadena de bloques es inmutable una vez que se ha agregado 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 cadena de bloques, 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 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 un canal de pago. Uno donde la parte receptora debe crear una prueba criptográfica válida a multas 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 mecanismo 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.