精通比特币(41):绝对时间锁定

  • A+
所属分类:学习笔记
时间锁是只允许在一段时间后才允许支出的交易。比特币从一开始就有一个交易级的时间锁定功能。它由交易中的nLocktime字段实现。在2015年底和2016年中期推出了两个新的时间锁定功能,提供UTXO级别的时间锁定功能。这些是CHECKLOCKTIMEVERIFYCHECKSEQUENCEVERIFY

 

时间锁对于后期交易和将资金锁定到将来的日期很有用。更重要的是,时间锁将比特币脚本扩展到时间的维度,为复杂的多级智能合同打开了大门。

 

交易锁定时间(nLocktime)

交易锁定时间是交易级设置(交易数据结构中的一个字段),它定义交易有效的最早时间,并且可以在网络上中继或添加到区块链中。
锁定时间也称为nLocktime,是来自于Bitcoin Core代码库中使用的变量名称。
在大多数交易中将其设置为零,以指示即时传播和执行。
如果nLocktime不为零,低于5亿,则将其解释为块高度,这意味着交易无效,并且在指定的块高度之前未被中继或包含在块链中。
如果超过5亿,它被解释为Unix纪元时间戳(自Jan-1-1970之后的秒数),并且交易在指定时间之前无效。指定未来块或时间的nLocktime的交易必须由始发系统持有,并且只有在有效后才被发送到比特币网络。如果交易在指定的nLocktime之前传输到网络,那么第一个节点就会拒绝该交易,并且不会被中继到其他节点。使用nLocktime等同于一张延期支票。

 

交易锁定时间限制
nLocktime就是一个限制,虽然它可以在将来花费,但是到现在为止,它并不能使用它们。

 

【签署交易设置了nLocktime的发送者,可以重新签署一笔交易在nLocktime之前消费这笔交易。】了解交易nLocktime的限制很重要。 唯一的保证是接受者nLocktime之前无法兑换它。 不能保证接受者得到资金。 为了实现这样的保证,时间限制必须放在UTXO本身上,并成为锁定脚本的一部分,而不是交易。

 

检查锁定时间验证Check Lock Time Verify (CLTV)

2015年12月,引入了一种新形式的时间锁进行比特币软分叉升级。根据BIP-65中的规范,脚本语言添加了一个名为CHECKLOCKTIMEVERIFY(CLTV)的新脚本操作符。 CLTV是每个输出的时间锁定,而不是每个交易的时间锁定,与nLocktime的情况一样。这允许在应用时间锁的方式上具有更大的灵活性。 简单来说,通过在输出的赎回脚本中添加CLTV操作码来限制输出,从而只能在指定的时间过后使用。

 

nLocktime是交易级时间锁定时,CLTV是基于输出的时间锁。

 

CLTV不会取代nLocktime,而是限制特定的UTXO,并通过将nLocktim设置为更大或相等的值,从而达到在未来才能花费这笔钱的目的。

 

CLTV操作码采用一个参数作为输入,表示为与nLocktime(块高度或Unix纪元时间)相同格式的数字 。如VERIFY后缀所示,CLTV如果结果为FALSE,则停止执行脚本的操作码类型。如果结果为TRUE,则继续执行。

 

为了使用CLTV锁定输出,将其插入到创建输出的交易中的输出的赎回脚本中。

 

例如,如果Alice支付Bob的地址,输出通常会包含一个这样的P2PKH脚本:
DUP HASH160 <Bob's Public Key Hash> EQUALVERIFY CHECKSIG
要锁定一段时间,比如说3个月以后,交易将是一个P2SH交易,其中包含一个赎回脚本:
<now + 3 months> CHECKLOCKTIMEVERIFY DROP DUP HASH160 <Bob's Public Key Hash> EQUALVERIFY CHECKSIG
其中是从交易开始被挖矿时间起计3个月的块高度或时间值:当前块高度+12,960(块)或当前Unix纪元时间+7,760,000(秒)。

 

当Bob尝试花费这个UTXO时,他构建了一个引用UTXO作为输入的交易。他使用他的签名和公钥在该输入的解锁脚本,并将交易nLocktime设置为等于或更大于Alice设置的CHECKLOCKTIMEVERIFY 时间锁。然后,Bob在比特币网络上广播交易。
Bob的交易评估如下。如果Alice设置的CHECKLOCKTIMEVERIFY参数小于或等于支出交易的nLocktime,脚本执行将继续(就好像执行“无操作”或NOP操作码一样)。否则,脚本执行停止,并且该交易被视为无效。 更确切地说,CHECKLOCKTIMEVERIFY失败并停止执行,标记交易无效(来源:BIP-65):
  1. 堆栈是空的要么
  2. 堆栈中的顶部项小于0;要么
  3. 顶层堆栈项和nLocktime字段的锁定时间类型(高度或者时间戳)不相同;要么
  4. 顶层堆栈项大于交易的nLocktime字段;要么
  5. 输入的nSequence字段为0xffffffff。
注释 CLTV和nLocktime使用相同的格式来描述时间锁定,无论是块高度还是自Unix纪元以秒钟以来所经过的时间。 最重要的是,在一起使用时,nLocktime的格式必须与输入中的CLTV格式相匹配,它们必须以秒为单位引用块高度或时间。

 

执行后,如果满足CLTV,则其之前的时间参数仍然作为堆栈中的顶级项,并且可能需要使用DROP进行删除,才能正确执行后续脚本操作码。 为此,您将经常在脚本中看到CHECKLOCKTIMEVERIFY+DROP在一起使用。
通过将nLocktime与CLTV结合使用,交易锁定时间限制中描述的情况发生变化。 因为Alice锁定了UTXO本身,所以现在Bob或Alice在3个月的锁定时间到期之前不可能花费它。

 

通过将时间锁定功能直接引入到脚本语言中,CLTV允许我们开发一些非常有趣的复杂脚本。 该标准在BIP-65(CHECKLOCKTIMEVERIFY)中定义。

 

发表评论

您必须才能发表评论!