CLTV o CheckLockTimeVerify es una interesante funcionalidad de bloque de tiempo que existe en Bitcoin diseñada para permitir que sus script puedan realizar avanzadas programaciones temporales en sus transacciones. Una función que permite programar scripts avanzados ajustados a la cada vez más creciente demanda de funciones dentro de Bitcoin.
La llegada de Bitcoin, junto a la innovadora tecnología Blockchain, ha abierto un mundo de posibilidades; entre ellas el dinero programable. Sí, como se escucha, dinero programable. Bitcoin integra muchas funciones, y una de esas funcionalidad es la conocida como Check Lock Time Verify (CLTV), que hace posible que las salidas no gastadas (UTXO) de Bitcoin sean bloqueadas y no puedan gastarse hasta llegado un momento previamente determinado.
La función CLTV fue integrada en Bitcoin Core a través de la bifurcación blanda BIP-0065, en la cual su desarrollador Peter Todd describe el nuevo código de operación (OP_CODE) OP_CHECKLOCKTIMEVERIFY. Esta función permite que una transacción realizada en Bitcoin permanezca bloqueada en el tiempo y no se haga efectiva hasta que no se llegue a una fecha, tiempo o altura de bloque determinado.
Así pues, la función CLTV es muy útil y positiva para varios casos de uso dentro del sistema Bitcoin. Por ejemplo, para el ahorro a largo plazo de fondos destinados para el pago de la universidad o graduación de un familiar. También es posible programar pagos futuros para fechas específicas, como alquileres, servicios, citas médicas, o incluso una herencia inteligente entre otros.
Así mismo, esta función es especialmente importante para la apertura de nuevas alternativas de pago. Por ejemplo la creación de canales de pago estilo CLTV. Estos canales de pago permiten realizar transacciones fuera de la blockchain manteniendo toda la seguridad y beneficios de una transacción convencional ocurrida dentro de la cadena. Además, la función CLTV también permite el establecimiento de otras alternativas como reembolsos por tiempo limitado o de fideicomisos. Realmente las aplicaciones y casos de uso que tiene esta función son infinitas.
¿Cómo funciona CLTV?
Cuando un usuario establece y realiza una transacción con el código OP_CHECKLOCKTIMEVERIFY, las salidas de dicha transacción serán activadas sólo en el momento en que se cumpla la condición establecida, y no en el momento en que se realiza la transacción. Lo que quiere decir que la transacción se efectúa correctamente pero las criptomonedas permanecerán bloqueadas en el tiempo hasta un momento futuro.
El código OP_CHECKLOCKTIMEVERIFY se ejecuta como parte de un script de Bitcoin, y su programación está basado en el uso de los tiempos UNIX (Unix Timestamp) o en las alturas de bloques dentro de la blockchain. Es decir, es necesario establecer una condición en alguno de estos parámetros para realizar una comparación con el tiempo actual. Entonces el OP_CHECKLOCKTIMEVERIFY verifica el elemento superior de la pila con el bloqueo de tiempo (nLockTime) que se estableció en la transacción. Si al hacer esta comparación, se comprueba que la condición se ha cumplido, el script puede ejecutarse, en caso contrario el script fallará.
Las condiciones para que el script falle en una transacción CLTV son las siguientes:
- Que la pila esté vacía y no exista un tiempo definido para que el código realice la comparación y verificación.
- Que, como ya se mencionó, el elemento superior de la pila sea menor que el de la condición establecida para el desbloqueo de las salidas no gastadas. Lo que indica que no ha transcurrido el tiempo necesario para desbloquear la transacción.
- Otra condición de fallo se dará si el bloqueo de tiempo establecido es medido en altura de bloques y el elemento superior de la pila utiliza medidas en tiempo (en segundos) o viceversa.
- El campo nSequence de esta entrada está establecido en 0xFFFFFFFF.
Entonces, una transacción CLTV sólo puede incluirse dentro de la blockchain una vez que ha superado el tiempo o la condición establecida. Una vez que sucede esto, las transacciones CLTV son verificadas y añadidas inmediatamente a la blockchain, y se consideran como gastadas.
Relación de CLTV y nLockTime
Tanto CLTV como nLockTime son dos funciones que permiten a Bitcoin programar acciones que dependen del tiempo o altura de bloque para su correcta ejecución. Pero la relación y alcance de ambas va mucho más allá. Por un lado, nLockTime garantiza que Bitcoin pueda programar transacciones que se ejecuten en una determinada altura de bloque (bloqueo de tiempo en bloque) o por marca de tiempo o timestamp (bloqueo de tiempo específico). Con esto Bitcoin habilita la capacidad de poder programar pagos usando estos parámetros.
Pero por otro lado, CLTV permite agregar una capa de verificación y de programación adicional a los nLockTime. Esto es porque CLTV toma el nLockTime y verifica que un conjunto agregado de condiciones programadas para su activación están dadas, una situación que era mucho más directa con el nLockTime original. Incluso, CLTV permite alterar ciertas condiciones originales de la transacción si se dan determinadas condiciones.
Por ejemplo, una dirección de multifirmas 2 de 3, que no se haya movilizado en un determinado periodo de tiempo, puede cambiar sus parámetros de autentificación a 1 de 3, para que así alguna de las personas autorizadas inicialmente pueda movilizar los fondos que están allí contenidos. Esta es una funcionalidad única que CLTV puede ofrecer y nLockTime por sí sola no puede.
¿Cuánto sabes, criptonauta?
¿CLTV es capaz de modificar las propiedades de los scripts con el paso del tiempo y bajo ciertas condiciones?¡CIERTO!
Una de las mayores características de CLTV, es que hacer uso del mismo permite crear script que fácilmente pueden modificar las condiciones para la activación de un evento o transacción en la blockchain de Bitcoin.
Implementación de CLTV
Uno de los mayores y más importantes potenciales de la función CLTV es permitir la creación de canales de pagos y que éstos puedan implementarse de forma correcta. A través de los canales de pago se pueden crear micro-transacciones fuera de la blockchain. Todo ello sin necesidad de pagar tantas tarifas de comisión por cada una y sin colapsar la blockchain.
En los canales de pago, un usuario puede realizar una transacción a otro depositando una cierta cantidad de criptomonedas en una dirección multifirma (MultiSig). Ambos usuarios tendrán acceso a dicha dirección. Y el usuario que realiza la transacción puede ir firmando pequeñas transacciones que serán realizadas al otro usuario a partir de esos fondos. Esto hasta que obtenga el producto deseado. El restante de los fondos le serán devueltos a sí mismo en una transacción de retorno por cada micro-transacción que realice. Mientras que el comerciante podrá reclamar el pago final acumulado, que se habrá realizado sin colapsar la blockchain y por el que María pagó sólo una tarifa de comisión.
Ejemplo de cómo funciona CLTV
Si María desea ver un video, pero por él debe pagar 1 sat por segundo visualizado. A María no le conviene realizar estas transacciones de 1 sat por segundo a través de una transacción convencional en Bitcoin. Ya que para esto deberá pagar la tarifa de comisión por cada transacción que realice. Además debe esperar que dicha transacción se confirme en un bloque; lo que ocurre cada 10 min en Bitcoin.
Al ver que no es conveniente, María decide crear un canal de pago. En este canal hará un depósito en una dirección multifirma de 0.5 BTC, que equivale a 50.000.000 de satoshis. Tanto el comerciante como María tendrán acceso a la dirección multifirma. Entonces cuando María comienza a visualizar el video, ella firmará una transacción donde enviará 1 sat al comerciante por el primer segundo visualizado. Y 49.999.999 sats a una dirección de cambio de su pertenencia.
Este proceso se repetirá varias veces siempre y cuando María continúe viendo el video. Es decir, ella seguirá firmando micro-transacciones y pagando la cantidad de satoshis equivalente a los segundos que visualice del video, y depositando sus vueltas en una dirección de retorno. Si María sólo visualizó 2 segundos de video, entonces firmará una nueva transacción, pero esta vez de 2 sat para el comerciante y 49.999.998 sat para su dirección de retorno. Si visualizó sólo 3 segundos, firmará otra transacción, pero esta vez de 3 sat para el comerciante y 49.999.997 sat para su dirección de retorno.
Durante este proceso, el comerciante no reclamará ni firmará las transacciones de 1 sat o 2 sat recibidas. Sino que esperará a que María visualice todo lo que desee del video y reclamará el pago final. Es decir, la transacción más grande. El resto de transacciones realizadas al principio no serán firmadas ya que implicaría un doble gasto. Por lo que el comerciante debe optar por la transacción más grande que contiene todos los satoshis recibidos, en este ejemplo la transacción de 3 satoshis.
Además al final el comerciante firma sólo una transacción, ésta es la que será añadida en la blockchain y será la única por la que se deba cancelar la tarifa de comisión correspondiente a los mineros. Además, María puede implementar una transacción CLTV al inicio para garantizar la retornabilidad de sus fondos depositados en la dirección multifirma. Si establece un tiempo determinado para que ambos firmen la transacción y por cualquier motivo, uno o ninguno de los dos puede firmarla antes de ese tiempo. Así María puede recuperar su dinero. Ya que si no se firma la transacción antes de la condición establecida, María puede firmar la transacción y tener su dinero de vuelta luego de transcurrido el tiempo establecido.
Entonces, en resumen, el código OP_CHECKLOCKTIMEVERIFY ofrece una ventaja positiva para la implementación de contratos inteligentes. Esto pues garantiza la integridad de los fondos hasta haber alcanzado la marca de tiempo o altura de bloque establecida. Al tiempo que evita las fallas del sistema por la maleabilidad de las transacciones.