檢查鎖定時間 CLTV(OP_CHECKLOCKTIMEVERIFY)

檢查鎖定時間,是 Bitcoin Script 中的一個操作碼,用來限制某個 UTXO 必須等到指定的區塊高度或時間之後,才能被花費。

檢查鎖定時間 CLTV(OP_CHECKLOCKTIMEVERIFY)

 

OP_CHECKLOCKTIMEVERIFY(CLTV),檢查鎖定時間,是 Bitcoin Script 中的一個操作碼,用來限制某個 UTXO 必須等到指定的區塊高度或時間之後,才能被花費。

CLTV 由 BIP 65 定義,透過軟分叉於 2015 年啟用。在 CLTV 出現之前,nLockTime 只能限制交易何時可以被納入區塊,無法限制 UTXO 本身何時可以被花費。CLTV 將時間條件寫進鎖定腳本,使絕對時間鎖定成為 UTXO 的花費條件。

因此,CLTV 是 Bitcoin 腳本層的重要時間鎖定機制,連結了鎖定腳本、nLockTime、nSequence 與 Lightning Network 等機制。


檢查鎖定時間 基本概念

  • 腳本層時間鎖定

    nLockTime 是交易中的欄位,由建立交易的人自行設定。

    持有私鑰的人可以隨時建立另一筆 nLockTime = 0 的交易,立即花費同一個 UTXO。

    CLTV 則是寫在 UTXO 的鎖定腳本中,任何人想要花費該 UTXO,都必須滿足腳本中的時間條件。

    因此,CLTV 讓時間鎖定從「交易何時有效」,變成「UTXO 何時可以被花費」。

 

  • 操作碼

    OP_CHECKLOCKTIMEVERIFY 的操作碼為 0xb1。

    這個操作碼原本是 OP_NOP2,屬於沒有任何作用的保留操作碼。

    BIP 65 將其重新定義為 CLTV。

    未升級的舊節點仍將它視為 NOP,因此這項變更屬於軟分叉,新舊節點可以共同運作。

 

  • 檢查 nLockTime

    CLTV 並不直接比較目前的區塊高度或時間,而是檢查花費交易的 nLockTime。

    CLTV 要求花費交易的 nLockTime 必須大於或等於腳本中指定的數值。

    交易實際何時可以被納入區塊,再由 nLockTime 的規則決定。

    因此,CLTV 與 nLockTime 結合後,才完成整個絕對時間鎖定的驗證。

 

  • 不移除堆疊數值

    由於 CLTV 是從 NOP 升級而來,為了與舊節點相容,它執行後不會移除堆疊頂端的數值。

    因此,腳本中通常會在 CLTV 之後加上 OP_DROP,將該數值移除。

    常見的寫法為:

    [鎖定值] OP_CHECKLOCKTIMEVERIFY OP_DROP

 

  • 鎖定類型

    CLTV 使用與 nLockTime 相同的 LOCKTIME_THRESHOLD,分界值為 500,000,000。

    • 小於該值時,數值代表區塊高度。
    • 大於或等於該值時,數值代表 Unix Timestamp。

    腳本中的鎖定值與交易的 nLockTime 必須屬於同一種類型,否則驗證失敗。


檢查鎖定時間 運作方式

  • 建立鎖定腳本

    建立 UTXO 時,將 CLTV 條件寫入鎖定腳本。如:

    [900000] OP_CHECKLOCKTIMEVERIFY OP_DROP [PubKey] OP_CHECKSIG

    代表該 UTXO 必須等到區塊高度 900000 之後,並且提供對應公鑰的簽章,才能被花費。

 

  • 建立花費交易

    花費該 UTXO 時,交易必須設定符合條件的 nLockTime。

    同時,該交易輸入的 nSequence 不可以是 0xffffffff,否則 nLockTime 不會生效。

 

  • 讀取鎖定值

    節點執行腳本時,CLTV 會讀取堆疊頂端的數值,作為鎖定值。

    如果堆疊為空,或鎖定值為負數,驗證失敗。

 

  • 判斷鎖定類型

    CLTV 檢查鎖定值與交易的 nLockTime 是否屬於同一種類型。

    如果一個是區塊高度,另一個是時間,驗證失敗。

 

  • 比較 nLockTime

    CLTV 檢查交易的 nLockTime 是否大於或等於鎖定值。

    如果 nLockTime 小於鎖定值,驗證失敗。

 

  • 檢查 nSequence

    CLTV 檢查該交易輸入的 nSequence 是否為 0xffffffff。

    如果是,nLockTime 不會生效,時間條件可以被繞過,因此驗證失敗。

 

  • 繼續執行腳本

    CLTV 檢查通過後,腳本繼續執行。

    OP_DROP 移除鎖定值,接著執行 OP_CHECKSIG 等其他條件。

 

  • 節點驗證

    腳本驗證通過後,交易的 nLockTime 仍須符合 nLockTime 的規則。

    使用區塊模式,會比較區塊高度。

    使用時間模式,會比較 Median Time Past。

    只有在腳本條件與 nLockTime 條件都符合後,交易才可以被納入區塊。

 


檢查鎖定時間 使用示例

  • 絕對區塊鎖定

    假設 UTXO 的鎖定腳本為:

    [900000] OP_CHECKLOCKTIMEVERIFY OP_DROP [PubKey] OP_CHECKSIG

 

    花費交易設定:

    nLockTime = 900000     Input 0 → nSequence = 0xfffffffe

 

    鎖定值與 nLockTime 都小於 500,000,000,屬於同一種類型。

    nLockTime 等於鎖定值,且 nSequence 不是 0xffffffff,因此 CLTV 檢查通過。

    依照 nLockTime 規則,該交易最早可以被納入區塊 900001。

 

  • 絕對時間鎖定

    假設 UTXO 的鎖定腳本為:

    [1767225600] OP_CHECKLOCKTIMEVERIFY OP_DROP [PubKey] OP_CHECKSIG

 

    花費交易設定:

    nLockTime = 1767225600     Input 0 → nSequence = 0xfffffffe

 

    鎖定值與 nLockTime 都大於或等於 500,000,000,屬於時間模式。

    1767225600 對應的時間為 2026-01-01 00:00:00 UTC。

    CLTV 檢查通過後,該交易必須等到 Median Time Past 超過該時間,才可以被納入區塊。

 

  • nLockTime 不足

    假設 UTXO 的鎖定值為 900000

 

    花費交易設定:

    nLockTime = 899000     Input 0 → nSequence = 0xfffffffe

 

    由於 899000 小於 900000,CLTV 驗證失敗。

    因此,無論目前區塊高度為多少,這筆交易都不是有效交易。

 

  • nSequence 為 0xffffffff

    假設 UTXO 的鎖定值為 900000

 

    花費交易設定:

    nLockTime = 900000     Input 0 → nSequence = 0xffffffff

 

    雖然 nLockTime 等於鎖定值,但 nSequence 為 0xffffffff,nLockTime 不會生效。

    為了避免時間條件被繞過,CLTV 驗證失敗。

 

  • 鎖定類型不同

    假設 UTXO 的鎖定值為 1767225600

 

    花費交易設定:

    nLockTime = 900000     Input 0 → nSequence = 0xfffffffe

 

    鎖定值屬於時間模式,nLockTime 屬於區塊高度模式,兩者類型不同。

    因此 CLTV 驗證失敗。


CLTV 應用

  • 時間鎖定存款

    使用者可以將資金鎖定到指定時間或區塊高度之後才能動用,作為長期儲蓄或遺產規劃。

    由於條件寫在鎖定腳本中,即使持有私鑰,也無法提前花費該 UTXO。

 

  • 閃電網路 Lightning Network

    Lightning Network 的 HTLC 使用 CLTV 設定付款的逾時條件。

    如果收款方沒有在期限內提供付款證明,付款方可以在逾時後取回資金。

    因此,CLTV 構成 Lightning Network 多跳付款安全機制的重要底層基礎。

 

  • 逾時退款 Escrow

    雙方可以將資金鎖定在多簽腳本中,並加入 CLTV 條件。

    在指定時間之前,需要雙方共同簽章才能花費。

    超過指定時間後,其中一方可以單獨取回資金,避免資金因對方不配合而永久鎖住。

 

  • 原子交換 Atomic Swap

    跨鏈原子交換使用 HTLC 結構,並以 CLTV 設定逾時退款條件。

    如果交換沒有在期限內完成,雙方都可以在逾時後取回自己的資金。


CLTV 相關 BIP

  • BIP 65:OP_CHECKLOCKTIMEVERIFY
  • BIP 113:Median time-past as endpoint for lock-time calculations
  • BIP 112:CHECKSEQUENCEVERIFY
2026/10/28 10:39 AM


更多文章