比特币交易的定稿字段里藏着两个时间相关的数值:交易级的 nLockTime 和每个输入各带一个的序列号(nSequence)。两个字段早年中继时几乎没人搭理,直到 BIP65 和 BIP68 分别给它们装上裁决语义,才变成今天时间锁、状态通道、闪电撤销逻辑的地基。很多人把”把 locktime 设成某个区块高度”当成”交易到那个高度才会生效”的全部故事,实际上这两个字段各有独立的开关位、各自的编码空间,还有一条容易被忽略的联动规则。
先讲绝对时间锁。一笔交易的 nLockTime 是四字节整数,BIP65 给它定的语义是:如果这个值大于等于 5 亿(源码里的 LOCKTIME_THRESHOLD,五亿这个门槛刻意落在区块高度与 Unix 秒不会重叠的区间),它被解释为 Unix 时间戳;小于五亿则被解释为区块高度。裁决规则是同一条:只有当链的当前值——对应高度或对应中位数时间——严格大于 nLockTime 声明的值,这笔交易才可被包含。等于还不行,必须严格大于。nLockTime 为 0 是最常见的默认值,含义就是”没有绝对时间锁”。
绝对时间锁有个容易被忽略的激活条件:只要交易中有任何一个输入的序列号取非最终值(低于 0xffffffff),nLockTime 才参与裁决。反过来,所有输入序列号都是 0xffffffff 时,即使 nLockTime 填了大数,也等于没锁。这个联动是 BIP68 写进共识的。也就是说旧钱包时代”随便改 locktime 玩”的交易,在今天的规则下要么按语义生效,要么被判定无效——字段不再是摆设,这正是当时 UASF 之前社区反复争论”字段是否激活”的技术根源之一。
再讲相对时间锁,编码在序列号里。BIP68 把 32 位序列号切成几段:最高位(1 后跟 31 个 0 的那位,0x80000000)是”相对锁定”开关位,置位时这个输入携带相对时间锁;次高位(0x00400000)是单位选择位,0 代表以区块高度计、1 代表以时间计;剩下低 16 位是数值,时间模式下以 512 秒(9 小时以下的粒度、源码里的 SEQUENCE_LOCKTIME_GRANULARITY 是 2 的 9 次方秒)为一个步进单位。也就是说序列号相对锁的”时间”天生粗糙——半小时级别的粒度,想要精确到秒的相对锁定在共识层不存在。
相对锁的参照对象同样不是墙上的钟。高度模式比较的是被花输出的确认高度加声明值:那个 UTXO 被写进链之后的第 N 个区块,本输入才可花。时间模式比较的是所在链位置的中位数时间 Past 加上声明秒数。注意语义起点是”这笔钱何时进账”,不是”你何时广播”,这让跨多笔交易的资金流水线可以各自锚定自己的进账时刻。闪电网络的状态更迭正是靠每笔撤销交易给各自的旧状态输出挂一个相对到期时间,形成一条按老化程度排列的兑换阶梯,让最新的通道状态永远先到期。
两类时间锁合用在真实产品里最常见,值得拆开看一眼一个具体形状:哈希时间锁合约(HTLC)在比特币侧到期判定的写法,是”要么在 T1 前提供原像(走相对时间锁与哈希条件那条脚本路径),要么在 T2 后退款(走绝对 locktime 路径)“。T1 和 T2 一个来自序列号一个来自 nLockTime,两条路径的到期参照分别是进账后的 MTP 增量与链当前 MTP——这就是为什么跨链交换给比特币侧留的缓冲,从来都是小时级而不是秒级。HTLC 的具体脚本结构各实现细节繁多,这里只到语义层。
运维细节上还有两笔账要算。第一是广播即锁死:绝对高度锁一旦交易进了内存池等待未来生效,它会以低优先级状态占用节点内存池名额,且在被确认前无法被任何冲突版本挤掉——如果它永远不被打包(比如目标高度写错在太远的未来),它会一直在内存池候选里躺着,直到到期或被放弃。想提前撤掉它,钱包侧的手段是 abandon(放弃)记账或 RBF 替换自己,具体取决于是否还留有可替换的输入。第二是测试与主网的差异:regtest 环境里区块秒数和难度规则被放宽,靠时间戳推进的测试逻辑与主网体感不一致,跨环境复用时间锁脚本的开发者常在这里踩坑。
最后划一下安全边界。相对时间锁的时间粒度 512 秒、MTP 的统计延迟、加上区块发现本身的泊松分布,意味着所有”精确到分钟”的时间承诺都不适合直接钉在共识层;协议内的时间语义只保证”不早于”,从不保证”恰好在那一刻”。写合约时把判断写成”到期后即可、到期前绝不可”,而不是”到期时自动触发”,才和机器行为对齐。对普通持有者,时间锁最常见的形态其实是你从未直接接触过它——收款时钱包没有弹任何提示,但某笔输出在脚本层被标注了到期日。看不懂的那部分不等于不存在,这正是逐项读交易结构值得花的时间。
风险提示:本文为交易结构与共识规则的机制说明,不构成任何投资建议;文中参数以比特币核心对应版本源码与 BIP65/BIP68 原文为准。

发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。