nLockTime es la primera función de bloqueo de tiempo que tuvo Bitcoin desde sus inicios y diseñada por Satoshi Nakamoto, como una forma de permitir transacciones programadas y activadas por parámetros de tiempo dentro del protocolo Bitcoin.
Una de las propiedades más interesantes con las que cuenta Bitcoin son los bloqueos de tiempo o timelock como el nLockTime. Este tipo de funcionalidades permiten a los usuarios definir el momento exacto en el que una transacción se puede validar y confirmar en la red. Una cualidad que convierte a Bitcoin en dinero digital programable. Por ejemplo, mediante la implementación de smart contracts o contratos inteligentes. Todo esto es posible gracias a que Bitcoin cuenta con un poderoso lenguaje de programación llamado Bitcoin Script.
Así tenemos que nLockTime es un bloqueo de tiempo absoluto a nivel de transacción. Lo que permite definir el momento a partir del cual una transacción podrá ser validada e incluida dentro de un bloque válido de la blockchain. Es decir, nLockTime especifica el momento más temprano desde el que se puede validar y confirmar una transacción.
Este tipo de bloqueo de tiempo es fundamental para la implementación de transacciones programables en el sistema de Bitcoin. Que permitan que, una vez definidas y cumplidas las condiciones establecidas dentro de un contrato, las transacciones se puedan ejecutar de forma automática y sin intermediarios.
Así mismo, nLockTime es el único bloqueo de tiempo que ha estado presente desde la implementación del cliente original de Bitcoin, la Bitcoin Core. Por lo que en cada transacción está incluido este campo. Sin embargo, en los clientes y monederos de Bitcoin el campo nLockTime está predeterminado con el valor 0. Por lo que si este campo no se modifica, las transacciones se pueden incluir dentro de cualquier bloque válido de la blockchain.
¿Cómo funciona nLockTime?
El bloqueo de tiempo nLockTime establece un intervalo de tiempo mínimo para que una transacción se pueda validar e incluir dentro de un bloque. Por lo que esta función se implementa y utiliza con la finalidad de evitar la extracción de una transacción antes de que se alcance el tiempo determinado en el bloqueo establecido. Y en caso contrario, la red simplemente invalida dicha transacción evitando su procesamiento.
En el cliente original de Bitcoin, este bloqueo sólo permitía establecer las condiciones de bloqueo basadas en la altura de bloque. Por lo que los nodos de la red no podían incluir las transacciones con nLockTime hasta tanto no se alcanzara la altura mínima de bloque establecida en el bloqueo.
Más tarde nLockTime fue ajustado para que se pudieran aplicar condiciones de bloqueo basadas en el tiempo en las transacciones de Bitcoin. Que actualmente operan en función del tiempo medio pasado y no en la marca de tiempo propia del bloque. Por lo que nLockTime exige entonces que transcurra un intervalo de tiempo definido o se alcance una altura de bloque determinada para que la transacción se pueda validar.
Por su parte, en nLockTime el bloqueo se muestra como un número entero de 32 bits, donde:
- Si nLockTime es menor a 500.000.000, entonces se entiende como un bloqueo de tiempo basado en una altura de bloque. Donde, sólo una vez que esta altura de bloque sea alcanzada o superada, la transacción podrá ser confirmada dentro de un bloque válido.
- Si nLockTime es mayor a 500.000.000, entonces se entiende como un bloqueo de tiempo basado en tiempo, que será medido en tiempo UNIX. Donde, sólo una vez que se iguale o supere esta marca de tiempo, la transacción podrá ser confirmada dentro de un bloque válido.
Así mismo, nLockTime permite que una transacción pueda ser bloqueada hasta por 9.500 años cuando se trata de un bloqueo de tiempo basado en la altura de bloque. Mientras que para los bloqueos basados en un intervalo de tiempo, nLockTime puede establecer un bloqueo sobre una hasta por 2.106 años.
Implementación de nLockTime
Como nLockTime sólo permitirá que una transacción pueda ser extraída y añadida a un bloque válido una vez que se alcance o supere una altura de bloque o tiempo establecido, este bloqueo es utilizado para establecer y programar transacciones que sólo serán confirmadas en el futuro. Por lo que es ampliamente útil para la creación de contratos inteligentes.
La particularidad de nLockTime permite que si alguna de las partes involucradas dentro del contrato no cumple, las transacciones programadas puedan ser cambiadas o modificadas, antes de que transcurra el tiempo limitado o se alcance la altura de bloque y las transacciones sean ejecutadas. Si ocurre alguna eventualidad, incumplimiento o simplemente alguna de las partes decide cambiar de opinión, una nueva transacción sin bloqueo puede ser establecida para invalidar a la transacción que sí posee el bloqueo de tiempo. Siempre y cuando se utilice como entradas las mismas salidas utilizadas como entradas en la transacción con el bloqueo nLockTime establecido.
Así, la nueva transacción creada, al no tener tiempo de bloqueo establecido, será validada y confirmada dentro de alguno de los bloques siguientes inmediatamente después de su creación.
Contratos inteligentes o canales de pago sin confianza
Por otra parte, a través de nLockTime se pueden crear canales de pago que no requieren de confianza ni de terceros. Por ejemplo, si se maneja una dirección multifirma 2/2 en la cual se depositan bitcoins para realizar pagos de forma gradual a una de las partes involucradas, ambas partes tendrán posesión sobre una de las claves de la dirección.
El usuario A, antes de realizar el depósito de bitcoins en la dirección multifirma con la que se le pagará al usuario B, puede establecer una transacción nLockTime a una cierta altura de bloque o marca de tiempo establecida.
Entonces, el usuario A tendrá posesión de una de las claves, y el usuario B tendrá posesión de la otra clave de la dirección. Así, el usuario A puede firmar una transacción cuando desee efectuar un pago al usuario B; colocando los bitcoins en una salida que requiere de la firma de ambas partes (usuarios A y usuario B), pero no la transmite a la red. Por medio del hash de esta primera transacción, el usuario B crea una segunda transacción que gasta a la primera y le devuelve los bitcoins al usuario A a través de la dirección multifirma. En este punto, como ambas partes deben firmar, la transacción no se puede completar. Por lo que ninguna de las partes puede gastar los bitcoins.
Como el campo nLockTime está definido con una altura de bloque o marca de tiempo, la transacción se puede devolver al usuario A. Esto en caso de no cumplirse las condiciones del contrato y de que la transacción no sea firmada por ambas partes como se requiere. Por lo cual se podrá recuperar el depósito realizado, una vez haya transcurrido el bloqueo definido, si la otra parte involucrada no cumple con el trabajo o actúa de forma errada.
¿Cuánto sabes, criptonauta?
¿nLockTime es la forma más sencilla de bloqueo de tiempo de Bitcoin?¡CIERTO!
nLockTime es la primera y la forma más básica de bloqueo de tiempo dentro de Bitcoin y una característica diseñada por el mismo Satoshi Nakamoto.
nLockTime y CLTV ¿En que se diferencian?
En Bitcoin existen varias formas de bloqueo de tiempo o timelocks. Estas operaciones permiten que Bitcoin pueda tener transacciones u operaciones que pueden programarse. Y esto puede ser en relación a una unidad de tiempo (descrita como un timestamp) o a una determinada altura de bloque (activación con altura de bloque). Gracias a ellos, se puede enviar una TX y que esta solo se pueda validar luego de alcanzarse la condición de tiempo o altura especificada.
Un ejemplo de esta utilidad puede ser que María quiera enviarle un pago a Daniel. Pero dicho pago sólo podrá hacerse efectivo 15 horas después de emitida la transacción. Para ello María emite la transacción haciendo uso de la función nLockTime. De esa forma se asegura de que la transacción sólo se pueda procesar 15 horas después de emitida. Bastante útil a decir verdad.
Pero ¿Qué pasa si necesitamos hacer operaciones más complejas? Pues bien en ese caso, nLockTime no nos permite hacer cosas más complejas. Así que para salvar esta situación, los desarrolladores de Bitcoin crearon CLTV o CheckLockTimeVerify. Este OP_CODE o código de operación permite usar el valor de nLockTime (el valor de bloque de tiempo o bloque) y agregar una programación adicional. Es decir, CLTV nos permite agregar una serie de condiciones adicionales que se deben cumplir para que la transacción se pueda validar. Incluso, CLTV puede cambiar dichas condiciones en caso de que las condiciones iniciales no se hayan cumplido, permitiendo desbloquear el pago bajo otras condiciones ya programadas.
Un ejemplo claro de uso de CLTV, es un fondo bitcoin protegido por una dirección multifirma. Si dichos fondos no se movilizan en un determinada periodo de tiempo, CLTV puede modificar las condiciones de desbloqueo de dichos fondos. Así podemos convertir una dirección multifirma del modelo 2-de-3 en una dirección multifirmas con modelo 1-de-3. Con lo que bastaría solo una firma válida para poder acceder a dichos fondos.