跳转到正文
buybitcoinsmart

术语表 /交易与手续费

Locktime

又称 nLockTime。

Locktime 是什么?
Locktime 是交易的最后四个字节,用于设定网络将该交易纳入区块的最早区块高度或时钟时间。

可以把 locktime 看作写入协议的远期支票。同一个字段有两种含义,由一个阈值决定:低于500,000,000的值按区块数计算,等于或高于该值的则按自1970年起的秒数计算。您发送的大多数交易都会带有 locktime,而它除了防范矿工的一种隐蔽手法外,不起任何作用。

运作方式

Locktime 位于序列化交易的最末尾,在考虑该笔支出的其他任何内容之前先行检查。

正是阈值规则让一个字段承担两项功能。locktime 为900,000,表示该交易不能出现在高度低于900,000的区块中。locktime 为1,800,000,000,则是一个 Unix 时间戳,表示该交易要等到前十一个区块的中位时间越过该时刻后才能出现。分界线500,000,000对应1985年11月5日,这个时间远早于比特币诞生,也远高于任何可能的区块高度。该字段为四个字节,因此能表示的最大时间是2106年2月7日。

其中有一个开关。只有至少一个输入的序列号低于0xffffffff 时,locktime 才会被强制执行。如果把所有输入都设为0xffffffff,该字段就被完全忽略,这正是钱包找到它的用途之前,交易多年来的运作方式。

这一用途是防范手续费狙击(anti-fee-sniping)。当手续费较高时,在区块竞争中落败的矿工有动机尝试重新挖出前一个区块并夺取其手续费,而不是向前继续构建区块。如果钱包把每笔交易的 locktime 设为当前链顶,这些交易在任何更早的区块中都会失效,从而消除大部分可得的收益和这种动机。Bitcoin Core 在普通支出中就是这样做的,并且约每十次有一次,会在前100个区块中均匀随机选取一个高度,使不同钱包软件发出的交易彼此没有明显区别。

在哪里会遇到它

在区块浏览器中打开任何一笔近期交易,locktime 字段通常会是一个接近该交易被挖出时区块高度的数字。

这就是防范手续费狙击的行为,而看到它,也就略微暴露了构建该笔付款的软件特征。把该字段留为零的钱包同样在透露信息。链上分析公司之所以会读取这个字段,正是因为很少有用户会留意它。

有意为之的用途则较为有限。设为未来时间的 locktime 会产生一笔可以现在签名并交出、但要到之后才能广播的交易,这是简单继承方案和退款路径的基础。闪电网络的强制关闭交易和潜水艇互换(submarine swap)使用时间锁,使消失的对手方无法让您的资金永远被困。构建这类交易的人应当注意其明显的弱点:被锁定的交易只与其背后的币一样可靠,如果发送方先以其他方式花掉了这些输入,这笔远期交易就变得毫无价值。

Locktime vs OP_CHECKLOCKTIMEVERIFY

Locktime 限制的是一笔交易,OP_CHECKLOCKTIMEVERIFY 限制的是一枚币。这一差别很重要,因为两者之中只有一个能约束签名者以外的人。

locktime 由构建交易的人选定,因此不保护任何人:发送方完全可以另行构建一笔没有它的交易。OP_CHECKLOCKTIMEVERIFY 由 BIP65 定义,自2015年12月14日在区块388,381起在网络上生效,它把条件写入输出自身的脚本。此后对这枚币的任何支出,本身都必须带有不早于所述时间点的 locktime,任何签名都无法绕过。这使时间锁从一种意图变成一项规则,也是金库、担保托管和继承方案都用该操作码而不用该字段来编写的原因。

请勿混淆

常见问题

为什么我的交易显示的 locktime 接近当前区块高度?

这是防范手续费狙击,并且是有意为之。把 locktime 设为链顶,会使该交易在任何更早的区块中无效,从而消除矿工为获取手续费而重新挖出前一个区块的动机。它不影响您的交易确认的速度。

我可以用 locktime 来安排未来某一日期的付款吗?

您可以构建这样的交易,但这并非可靠的安排。没有任何机制阻止您或发送方更早地在另一笔交易中花掉相同的输入,这会使远期交易失效。合约设计则改为在输出脚本中使用 OP_CHECKLOCKTIMEVERIFY。

相关术语

交易与手续费中的更多术语

阅读本页英文版