nLockTime es la primera función de bloqueo de tiempo que tuvo Bitcoin desde sus principios y desarrollada por Satoshi Nakamoto, como una forma de permitir transacciones programadas y activadas por factores de tiempo en el protocolo Bitcoin.

Una de las propiedades más interesantes con las que cuenta Bitcoin son los bloqueos de tiempo o bien timelock como el nLockTime. Este género de funcionalidades dejan a los usuarios acotar el instante preciso en el que una transacción se puede validar y confirmar en internet. Una cualidad que transforma a Bitcoin en dinero digital programable. Por poner un ejemplo, a través de la implementación de smart contracts o bien contratos inteligentes. Todo esto es posible merced a que Bitcoin cuenta con un poderoso lenguaje de programación llamado Bitcoin Script.

Así debemos nLockTime es un bloqueo de tiempo absoluto a nivel de transacción. Lo que deja delimitar el instante desde el como una transacción va a poder ser ratificada y también incluida en un bloque válido de la blockchain. O sea, nLockTime detalla el instante más temprano desde el que se puede validar y confirmar una transacción.

Este género de bloqueo de tiempo es esencial para la implementación de transacciones programables en el sistema de Bitcoin. Que dejen que, una vez definidas y cumplidas las condiciones establecidas en un contrato, las transacciones se puedan ejecutar de manera automática y sin mediadores.

Así mismo, nLockTime es el único bloqueo de tiempo que ha estado presente desde la implementación del cliente del servicio original de Bitcoin, la Bitcoin Core. Con lo que en todos y cada transacción está incluido este campo. No obstante, en los clientes del servicio y monederos de Bitcoin el campo nLockTime está predeterminado con el valor 0. Con lo que si este campo no se altera, las transacciones se pueden incluir en cualquier bloque válido de la blockchain.

¿De qué forma marcha nLockTime?

El bloqueo de tiempo nLockTime establece un intervalo de tiempo mínimo a fin de que una transacción se pueda validar y también incluir en un bloque. Con lo que esta función se incorpora y emplea con el objetivo de eludir la extracción de una transacción antes que se alcance el tiempo determinado en el bloqueo establecido. Y de lo contrario, la red sencillamente inutiliza dicha transacción eludiendo su procesamiento.

En el usuario original de Bitcoin, este bloqueo solo dejaba establecer las condiciones de bloqueo basadas en la altura de bloque. Con 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 a fin de que se pudiesen aplicar condiciones de bloqueo basadas en el tiempo en las transacciones de Bitcoin. Que en nuestros días operan en función del tiempo medio pasado y no en la marca de tiempo propia del bloque. Con lo que nLockTime demanda entonces que transcurra un intervalo de tiempo definido o bien se alcance una altura de bloque determinada a fin de que la transacción se pueda validar.

Por su parte, en nLockTime el bloqueo se muestra como un número entero de treinta y dos bits, donde:

  • Si nLockTime es menor a 500.000.000, entonces se comprende como un bloqueo de tiempo basado en una altura de bloque. Donde, solo en el momento en que esta altura de bloque sea alcanzada o bien superada, la transacción va a poder ser confirmada en un bloque válido.
  • Si nLockTime es mayor a 500.000.000, entonces se comprende como un bloqueo de tiempo basado en tiempo, que va a ser medido en tiempo UNIX. Donde, solo en el momento en que se iguale o bien supere esta marca de tiempo, la transacción va a poder ser confirmada en un bloque válido.

Así mismo, nLockTime deja que una transacción pueda ser bloqueada hasta por nueve mil quinientos años tratándose de un bloqueo de tiempo basado en la altura de bloque. Al paso que para los bloqueos basados en un intervalo de tiempo, nLockTime puede establecer un bloqueo sobre una hasta por dos.106 años.

Implementación de nLockTime

Como nLockTime solo dejará que una transacción pueda ser extraída y añadida a un bloque válido cuando se alcance o bien supere una altura de bloque o bien tiempo establecido, este bloqueo es usado para establecer y programar transacciones que solo van a ser confirmadas en el futuro. Con lo que es extensamente útil para la creación de contratos inteligentes.

La peculiaridad de nLockTime deja que si ciertas partes implicadas en el contrato no cumple, las transacciones programadas puedan ser cambiadas o bien cambiadas, antes que transcurra el tiempo limitado o bien se alcance la altura de bloque y las transacciones sean ejecutadas. Si ocurre alguna eventualidad, incumplimiento o bien sencillamente ciertas partes decide cambiar de parecer, una nueva transacción sin bloqueo puede ser establecida para inutilizar a la transacción que sí tiene el bloqueo de tiempo. Siempre que se utilice como entradas exactamente las mismas salidas empleadas como entradas en la transacción con el bloqueo nLockTime establecido. De esta forma, la nueva transacción creada, al no tener tiempo de bloqueo establecido, va a ser ratificada y confirmada en ciertos bloques siguientes justo después de su creación.

Contratos inteligentes o bien canales de pago sin confianza

Por otra parte, mediante nLockTime se pueden crear canales de pago que no precisan de confianza ni de terceros. Por poner un ejemplo, si se maneja una dirección multifirma 2/2 en la que se depositan bitcoins para efectuar pagos de forma gradual a una de las partes implicadas, las dos partes van a tener posesión sobre una de las claves de la dirección.

El usuario A, ya antes de efectuar el depósito de bitcoins en la dirección multifirma con la que se le va a pagar al usuario B, puede establecer una transacción nLockTime a una cierta altura de bloque o bien marca de tiempo establecida.

Entonces, el usuario A va a tener posesión de una de las claves, y el usuario B va a tener posesión de la otra clave de la dirección. De esta forma, el usuario A puede firmar una transacción cuando desee realizar un pago al usuario B; poniendo los bitcoins en una salida que precisa de la firma de las dos partes (usuarios A y usuario B), mas 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 por medio de la dirección multifirma. En este punto, como las dos partes deben firmar, la transacción no se puede llenar. Con lo que ninguna de las partes puede gastar los bitcoins.

Como el campo nLockTime está definido con una altura de bloque o bien marca de tiempo, la transacción se puede devolver al usuario A. Esto en el caso de no cumplirse las condiciones del contrato y de que la transacción no sea firmada por las dos partes como se requiere. Por lo que se va a poder recobrar el depósito efectuado, una vez haya trascurrido el bloqueo definido, si la otra parte implicada no cumple con el trabajo o bien actúa de forma errada.

¿Cuánto sabes, criptonauta?

¿nLockTime es la manera más fácil de bloqueo de tiempo de Bitcoin?

nLockTime y CLTV ¿En que se distinguen?

En Bitcoin existen múltiples formas de bloqueo de tiempo o bien timelocks. Estas operaciones dejan que Bitcoin pueda tener transacciones o bien operaciones que pueden programarse. Y esto puede ser con relación a una unidad temporal (descrita como un timestamp) o bien a una determinada altura de bloque (activación con altura de bloque). Gracias a ellos, se puede mandar una TX y que esta solo se pueda validar después de alcanzarse la condición de tiempo o bien altura concretada.

Un ejemplo de esta utilidad puede que María desee mandarle un pago a Daniel. Mas dicho pago solo va a poder hacerse efectivo quince horas tras emitida la transacción. Para esto María emite la transacción usando la función nLockTime. De esa forma se cerciora de que la transacción solo se pueda procesar quince horas tras emitida. Bastante útil en honor a la verdad.

Pero ¿Qué sucede si precisamos hacer operaciones más complejas?  Puesto que bien en un caso así, nLockTime no nos deja hacer cosas más complejas. Conque para salvar esta situación, los desarrolladores de Bitcoin crearon CLTV o bien CheckLockTimeVerify. Este OP_CODE o bien código de operación deja emplear el valor de nLockTime (el valor de bloque de tiempo o bien bloque) y añadir una programación auxiliar. O sea, CLTV nos deja añadir una serie de condiciones auxiliares que se deben cumplir a fin de que la transacción se pueda validar. Aun, CLTV puede mudar dichas condiciones caso de que las condiciones iniciales no se hayan cumplido, dejando desbloquear el pago bajo otras condiciones ya programadas.

Un ejemplo claro de empleo 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 alterar las condiciones de desbloqueo de tales fondos. De este modo podemos transformar una dirección multifirma del modelo dos-de-tres en una dirección multifirmas con modelo 1-de-tres. Con lo que bastaría solo una firma válida para poder acceder a dichos fondos.