背景图

BIP-68使用共识序列号记录相对锁定时间

抽象

该BIP介绍了的相对锁定时间(RLT),RLT使用序列号字段来实现强一致性语义,以使已签名的交易输入在确认其相应的输出后在限定的时间段内保持无效。

动机

比特币交易每个输入都有一个序列号字段。最初的想法似乎是mempool中的交易将被替换为具有更高序列值的相同输入。虽然这没有得到很好的实施,但假设即使较低的序列号利润更高,矿工会喜欢较高的序列号。然而,一个仅仅依靠利润动机的矿工会完全打破这个假设。此BIP所描述的更改将重新调整新用例的序列号,而不会破坏现有功能。这也为未来扩展和其他使用情况留下了空间。

交易nLockTime用于防止在某个日期之前挖掘交易。nSequence将被重新用于防止交易的挖掘,直到花费在某个时间或时间段内的输出块高的确认。除此之外,此功能还允许使用散列时间片合同(HTLC)和BIP112中使用的双向付款渠道。

规范

本规范为nVersion大于或等于2的交易定义了序列号的含义,本规范的其余部分都是基于该规则的。

所有对过去的中位时间(MTP)的定义说明都是由BIP113定义的。

如果序列号的位(1 << 31)被设置(最高位被设置),则没有共识含义被应用于序列号,并且可以被包括在当前所有可能情况下的任何块中。

如果序列号的位(1 << 31)未被设置,则序列号被解释为编码的相对锁定时间。

序列号编码解释如下:

  • 位(1 << 22)确定相对锁定时间是基于时间的还是基于块的:如果设置该位,则相对锁定时间以512秒为单位指定时间间隔。时间范围从输出的前一个块的中值时间开始,并在前一个块的MTP结束。如果该位未设置,则相对锁定时间将指定多个块。
  • 标志(1 << 22)是3字节有符号整数中的最高位,用于比特币脚本,作为带有OP_CHECKSEQUENCEVERIFY(BIP 112)的3字节PUSHDATA。

本规范仅将序列号的16位解释为相对锁定时间,因此必须将0x0000ffff掩码应用于序列字段以提取相对锁定时间。16位规范允许一年的相对锁定时间,其余位允许将来扩展。

对于基于时间的相对锁定时间,选择512秒的粒度,因为比特币块每600秒产生一次。所以当使用基于块或基于时间的时候,可以用可用的位数来编码相同的时间量。从序列号转换为秒是通过乘以512=2^9,或等价地向上移位9位来执行的。

当相对锁定时间是基于时间的时候,它被解释为输入年龄的最小块时间约束。相对基于时间的零锁定时间表示可以包含在任何块中的输入。更一般地说,相对基于时间的锁定时间n可以被包括在任何在其消费的输出的挖矿开采日期之后512*n秒产生的块中,或者之后的任何块中。输出的开采日期等于先前开采的块的开采时间的中间值。

块产生时间等于其前一块过去的中值时间。

当相对锁定时间是基于块的时候,它被解释为输入年龄的最小块高度约束。相对基于块的锁定时间为零表示可以包含在任何块中的输入。更一般地说,一个相对块锁定时间n可以包含在它所花费的输出的开采日期之后的n个块中,或者之后的任何块中。

新规则不适用于coinbase交易输入的nSequence字段。

履行

参考实现由以下拉取请求提供 https://github.com/bitcoin/bitcoin/pull/7184

致谢

值得一提的是格雷戈里麦克斯韦提供了一个简洁明了的描述这种变化的行为,这成为这个BIP文本的基础。

BIP由BtcDrak,Nicolas Dorier和kinoshitajona编辑。

部署

该BIP将通过使用位0的“versionbits”BIP9进行部署。

对于比特币mainnet,该BIP9 开始时间将是午夜2016年5月1日UTC(大纪元时间戳1462060800)和BIP9 超时将是午夜2017年5月1日UTC(大纪元时间戳1493596800)。

对于比特币testnet,该BIP9 开始时间将是午夜2016年3月1日UTC(大纪元时间戳1456790400)和BIP9 超时将是午夜2017年5月1日UTC(大纪元时间戳1493596800)。

该BIP必须与BIP112和BIP113同时部署,使用相同的部署机制。

兼容性

比特币核心参考客户端软件唯一使用的序列号是禁用检查事务中的nLockTime约束。该BIP保留了该应用程序的语义。

从规范部分可以看出,该BIP未定义若干位,以便通过设置位(1 << 31)来允许其他用例,因为其余31位在此BIP下无意义。另外,当位(1 << 31)未设置时,位(1 << 23)至(1 << 30)根本无意义。

此外,该BIP仅指定16位来实际编码相对锁定时间,这意味着还有6个位未被使用(1 << 16至1 << 21)。这样就可以通过软叉提高粒度,或者增加将来最大可能的相对锁定时间。

从相对锁定时间计算序列号的最有效方法是使用位掩码和位移:

1
2
3
4
5
6
7
// 0 <= nHeight < 65,535 blocks (1.25 years)
nSequence = nHeight;
nHeight = nSequence & 0x0000ffff;

// 0 <= nTime < 33,554,431 seconds (1.06 years)
nSequence = (1 << 22) | (nTime >> 9);
nTime = (nSequence & 0x0000ffff) << 9;

参考

比特币邮件列表讨论:https://www.mail-archive.com/bitcoin-development@lists.sourceforge.net/msg07864.html

BIP9:https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki

BIP112:https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki

BIP113:https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki

散列时间片契约(HTLCs):https://github.com/ElementsProject/lightning/raw/master/doc/deployable-lightning.pdf

引用和参考

BIP68:使用序列号的相对锁定时间

0%