Los timelocks son una de las más practicas funcionalidades de Bitcoin, permitiéndole la capacidad de programar acciones de acuerdo a una serie de parámetros y convirtiendo así al Bitcoin en algo mejor que el dinero, un dinero digital completamente programable.
Una de las innovadoras funciones con las que cuenta Bitcoin es conocida como TimeLock. Esta es una herramienta que sirve para establecer y especificar ciertas condiciones bajo las cuales las transacciones podrán ser validadas.
Un timelock o bloqueo de tiempo, es un tipo de contrato inteligente primitivo, que hace referencia a qué altura de bloque o tiempo específico, una transacción en particular podrá ser incluida por los mineros en la blockchain. Por lo que funciona como una especie de bloqueo absoluto o restricción al gasto de ciertos bitcoins hasta que se cumplan dichas condiciones.
Se puede establecer un timelock en base a un tiempo real o a una altura de bloque específica. Así, cuando se alcance ese tiempo o esa altura del bloque definida en el timelock, los mineros podrán incluir la transacción en el hash del árbol de Merkle, y añadirla al último bloque de la blockchain. Y en este momento es que la transacción podrá ser confirmada.
Clasificación de los TimeLocks
Los timelocks fueron añadidos al software original de Bitcoin por su creador, Satoshi Nakamoto. Están presentes en todas las transacciones aunque la mayoría no usen esta función, por lo que el tiempo de bloqueo predeterminado es 0x00000000 (0) ó 0xFFFFFFFF (4294967295). No obstante, para aquellas transacciones en las que sí se emplea el timelock, es importante conocer que éste cuenta con 3 atributos importantes. Que son: ubicación, orientación y métrica.
Ubicación
Como ya mencionamos, los timelocks pueden encontrarse en las transacciones aunque no se haga uso de esta función. Y también pueden estar incluidas en los scripts. Ambos son muy similares, pero desempeñan funciones completamente distintas.
En las transacciones, los timelocks hacen que ésta no pueda ser validada hasta cumplir cierto tiempo o alcanzar una altura de bloque definida, aunque sus firmas digitales y scripts sí sean válidos. Mientras que los locktimes en los scripts, determinan si una secuencia de comandos es válida. Por lo que se pueden establecer condiciones en todas las transacciones que gastan una salida.
A diferencia del bloqueo en las transacciones, que sólo restringen esa transacción en particular. De allí la importancia de la ubicación de los timelock para que estos puedan realizar la operación correspondiente.
Orientación
Existen los timelocks de tiempo absoluto o de tiempo relativo. El primero, nos permite definir el bloqueo en términos de un tiempo determinado. Por lo que podemos escoger el momento exacto en el que finalizará el bloqueo.
Mientras que el bloqueo de tiempo relativo, nos permite definir una cierta cantidad de tiempo que debe transcurrir partiendo desde la confirmación de las salidas anteriores. Ambas opciones son en extremo útiles para definir intervalos de tiempo necesarios para que una transacción pueda ser procesada por la red Bitcoin.
Métrica
En Bitcoin existe dos formas de medir el tiempo: el número de bloque y la marca de tiempo. Por lo que podemos utilizar ambos para establecer un timelock. Cuando se establece un timelock en base a un número de bloque, los mineros deben esperar alcanzar dicho número de bloque. Esto para poder validar y confirmar la operación, e incluirla en un nuevo bloque.
Por el contrario, cuando se establece el timelock en base a una marca de tiempo, los mineros esperan a que transcurra el tiempo establecido en segundos. Es decir, que se alcance un momento determinado para hacer la validación de la transacción. Esto se mide con la marca de tiempo Unix.
Tipos de Bloqueos
En la actualidad, Bitcoin cuenta de momento con 4 formas de establecer bloqueos o timelocks. Dos de estas herramientas son a nivel de transacción y las otras dos son a nivel de scripts. Veamos cada una de ellas.
1. nLockTime
Este es un bloqueo de tiempo absoluto a nivel de transacción. Es el único bloqueo de tiempo que estaba disponible en la versión original de software de Bitcoin. Cuando los nodos no retransmitían ni minaban transacciones con nLockTime igual o mayor que la altura del bloque actual.
Por lo que las transacciones no eran validadas hasta tanto se alcanzara el bloque establecido. En estos bloqueos, el tiempo se expresa como números enteros de 32 bits sin signos. Si el número es inferior a 500 millones, se interpreta como una altura de bloque. Por el contrario, si es superior a 500 millones se toma como una marca de Tiempo Unix.
En la versión 0.1.6 de Bitcoin, la interpretación de nLockTime se ajustó para permitir también el bloqueo basado en el tiempo. Luego, a partir del bloque 31001, las restricciones nLockTime se activaron como una regla que también se aplicaba a la aceptación del bloque. Más tarde, en julio de 2016, los bloqueos basados en el tiempo se cambiaron para operar en el tiempo medio pasado en lugar de la marca de tiempo del bloque.
Un nLockTime puede bloquear una transacción hasta por 9.500 años usando los números de bloques, y 2.106 años usando las marcas de tiempo. Y aunque actualmente cada transacción contiene la función nLockTime, la mayoría de las wallets la tienen preestablecida en 0. Esto significa que las transacciones pueden ser validadas en cualquier bloque de la cadena.
2. nSequence
Este es un bloqueo de tiempo relativo a nivel de transacción. Estos bloqueos fueron introducidos en la soft fork del BIP 68 a mediado del año 2016. En él, los números de secuencia son empleados para establecer timelocks de tiempo relativo en el nivel de transacción. Esto permite que una entrada especifique el tiempo más temprano que se puede añadir a un bloque. En función de cuánto tiempo hace que la salida gastada por esa entrada se incluyera en un bloque en la blockchain.
Al aplicar un nSequence se pueden establecer varias condiciones de tiempo distintas dentro de la misma transacción. Así, para que la transacción sea válida, deben cumplirse todas las condiciones. Y si esto no ocurre, toda la transacción será rechazada.
A diferencia de los nLockTime, los nSequence sólo utilizan 18 de los 32 bits totales, por lo que quedan en reserva 14 bits para implementaciones futuras. Y de esos 18 bits en uso, 16 bits son destinados para codificar el tiempo de bloqueo. Por lo que los bloqueos nSequence están limitados a 65.535 unidades en bloques, y a sólo 18 horas en segundos.
3. CheckLockTimeVerify
También conocido por sus siglas como CLTV, es un bloqueo de tiempo absoluto a nivel de script. Está detallado en el soft fork BIP 65 y se introdujo a la red a finales del año 2015, por el desarrollador Peter Todd. Dicha propuesta abre la posibilidad de poder realizar una transacción en la que se pueda especificar la fecha concreta en la que se hará efectiva (es decir, la fecha en la que el receptor podrá hacer uso de los fondos enviados).
Una de las funciones avanzadas que CTLV permite es la de cambiar el parámetro de autenticación de una dirección multifirma. Por ejemplo, si se ha creado una dirección multifirma con un esquema 2 de 3, CLTV puede cambiar dicho parámetro bajo ciertos criterios a un esquema 1 de 3. De esta manera, la persona puede recuperar los fondos ante determinadas condiciones previamente pactadas y que se definen en la transacción debido a la capacidad de ser Bitcoin dinero programable.
¿Cuánto sabes, criptonauta?
¿Los timelocks pueden ampliar la capacidad de programación y de características de Bitcoin?¡CIERTO!
Los timelock son muy útiles para brindarle a Bitcoin nuevas capacidades de programación que permitan la construcción de nuevas y llamativas características. Un ejemplo de esto es Lightning Network, la cual depende de los timelocks y su capacidad para programar acciones en Bitcoin.
4.- CheckSquenceVerify
Es el bloqueo de tiempo relativo a nivel de script. También parte del soft fork BIP 68, pero se describió en el BIP 112 y se añadió a mediados de 2016. El CSV proporciona un tiempo de bloqueo relativo, al igual que el CLTV proporciona uno para el tiempo de bloqueo absoluto, por lo que son extremadamente muy similares. No obstante, en lugar de verificar el tiempo como lo hace el CLTV, el CSV comprueba la pila superior con el campo de entrada.
Cuando se llama al código de operación CSV, hará que la secuencia de comandos falle a menos que nSequence en la transacción indique que ha pasado una cantidad de tiempo de bloqueo relativa igual o mayor que el parámetro proporcionado al código de operación CSV. Esto garantiza que la transacción pueda incluirse en un bloque válido cuando el el bloqueo de tiempo basado en CSV haya expirado.
Con este código de operación se pueden bloquear las transacciones un máximo de 65.535 bloques, que equivalen aproximadamente a 455 día. O un máximo de 65.535×512 segundos, que son aproximadamente 388 días.