术语表 /交易与手续费
序列号
又称 nSequence。
- 序列号是什么?
- 序列号是每个交易输入中的一个四字节字段,用于发出费用替换信号、启用锁定时间,并可编码相对时间锁。
规定于 BIP-68。
三项互不相关的功能共用同一个字段,因为比特币无力再增加一个字段。中本聪最初为它设计的方案是一种粗糙的支付通道,每个新版本都会调高该数值,但由于没有任何规则迫使矿工优先选择数值更高的版本,该方案在2010年前后被放弃。留存下来的是一组特殊数值,它们决定您钱包中的交易如何运作。
运作方式
解读序列号,需要按规则出现时间的先后,依次对照三项相互独立的规则。
最终值。 序列号为0xffffffff,即十进制的4,294,967,295,表示该输入为最终状态。如果一笔交易的所有输入都是最终状态,则锁定时间字段会被完全忽略。这是早期钱包的默认设置,在从未考虑过该字段的软件所构建的交易中仍然可以看到。
替换信号。 BIP125 为取值范围的低端赋予了含义:任何设为0xfffffffd 或更低的输入,都表示发送方可以用支付更高费用的版本替换该交易。数值0xfffffffe 则介于两者之间,启用锁定时间,同时不发出替换信号。这一区别的作用已大为减弱,因为自2024年10月发布的28.0版本起,Bitcoin Core 无论是否有该信号都会中继替换交易。
相对时间锁。 BIP68 对声明版本为2或更高的交易重新定义了低位的含义,该规则于2016年7月在区块419,328开始强制执行。当第31位未置位时,低16位表示该输入所花费的那笔币在确认之后必须经过多长时间。第22位用于选择单位:未置位表示区块,最多65,535个区块,约合455天;置位则表示以512秒为一个周期,上限约为388天。计时从上一笔交易(父交易)确认时开始,而不是从某个固定日期开始,这正是两个人之间的合约所需要的。
在哪里会遇到它
序列号在原始交易转储中是一列数据,在钱包软件中则是一个复选框,两种视图很少使用相同的措辞。
解码输入的区块浏览器会在每个输入旁显示类似4294967293的数值。这就是0xfffffffd,说明钱包构建的是可替换交易。Bitcoin Core 的decoderawtransaction显示同样的数值,Sparrow 和 Electrum 则把它放在"replace by fee"开关之后,而不是显示为数字。
闪电网络是其最主要的实际使用者。通道的撤销延迟,即对手方因发布旧状态而可被惩罚的时间窗口,就是通过承诺交易输入中的这一字段来强制执行的相对时间锁。潜水艇互换(submarine swaps)、保险库设计,以及任何要求退款路径只有在另一方有合理机会采取行动之后才可用的合约,也都以同一机制为基础。
序列号 vs 锁定时间
序列号针对每个输入,锁定时间针对整笔交易。这是区分二者最快的方法,也说明了它们为何用于不同的目的。
锁定时间为整笔交易设定一个绝对期限,以区块高度或挂钟时间表示,无论所花费的币是一天前还是五年前产生的,都同样适用。序列号中的相对时间锁则从该输入所花费的那笔具体的币被确认时开始计算,因此每个输入都可以有自己的等待期,同一脚本无论何时注资都能正常运作。二者之间还存在一种不便的依赖关系:只有当至少一个序列号低于最终值时,锁定时间才会被强制执行,因此把所有序列号都设为0xffffffff 的钱包,会悄然停用另一个字段。