时间锁是四种机制的总称:整个事务的 nLockTime、OP_CHECKLOCKTIMEVERIFY (CLTV/BIP65)、根据 BIP68 的相对 nSequence 和 OP_CHECKSEQUENCEVERIFY (CSV/BIP112)。时间检查使用 BIP113 过去的中位时间。 (Median Time Past)
比特币有两个绝对层和两个相对层。 nLockTime 限制整个交易,CLTV 特定的脚本分支,BIP68 为输入提供相对年龄,CSV 允许脚本请求该年龄。
nLockTime 是一个 32 位字段。零意味着没有绝对锁定。如果所有输入的 nSequence = 0xffffffff,则忽略未满足的 nLockTime;因此,有效锁定至少需要一个非最终序列。
低于 LOCKTIME_THRESHOLD = 500,000,000 的值是平均块高度,此边界的值是 Unix 时间戳。边界只会改变同一领域的解释。
锁定时间与前一个块的中位时间进行比较,而不是与候选块的自由选择的时间戳进行比较。 Bitcoin Core 在检查下一个区块时使用 GetMedianTimePast。
BIP65 中的 OP_CHECKLOCKTIMEVERIFY 要求交易的 nLockTime 花费达到指定的金额或时间,并且相应的输入不是最终的。 CLTV 本身不会发送任何内容或自动解锁。
对于版本 2+ 的交易,BIP68 将 nSequence 解释为从已用 UTXO 的年龄开始的相对延迟,以块或 512 秒为单位。禁用标志可以关闭该输入相关逻辑。
BIP112 中的 OP_CHECKSEQUENCEVERIFY 允许脚本分支请求最小相对年龄。它适用于仅在延迟后才开放的恢复和处罚车道,包括闪电施工。
SEQUENCE_FINAL = 0xffffffff 可以抵消所有输入上的 nLockTime。禁用标志 BIP68 是另一个具有不同含义的位; CSV 将包含此标志的操作数视为 NOP。
达到的高度或时间只会改变有效性。钱包仍然需要存储或创建交易、对其进行签名、满足其他脚本条件、支付费用、推广并获得确认。
检查 CLTV 或 CSV 脚本中每个输入的 nLockTime、交易版本和 nSequence。 Decoderawtransaction 将显示该字段,而 testmempoolaccept 将告诉候选者当前是否可接受。
要获得更完整的理解,请将本词条与以下词条结合阅读: CHECKLOCKTIMEVERIFY, CHECKSEQUENCEVERIFY, Lightning Network, Payment Channel, 交易, Bitcoin Script. 反向关联还来自: 确认, Bitcoin Script, HTLC, CHECKLOCKTIMEVERIFY.