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

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

更多文章