一个字段,三份工作
比特币交易的每个输入里都有一个 4 字节的 nSequence 字段。它不是序号这种单一用途字段,而是被三套机制复用的多功能开关。理解它,很多看似玄学的钱包选项——最终交易、可替换、时间锁——其实都只是在这个数字上做文章。

第一重身份:nLockTime 的启用开关
交易的 nLockTime 字段要生效,前提是至少有一个输入的 nSequence 小于最大值 0xffffffff。所有输入都填满最大值,等于宣告本交易任何时刻都合法。想让交易表达某高度或某时间之后才能被打包,必须把某个输入的 nSequence 调低。BIP125 在定义替换信号时特意说明了两者的兼容方式:想保留时间锁又不落入替换信号区间,可以把 nSequence 设为 0xffffffff-1——它满足时间锁的启用条件,同时仍站在不可替换的边界上。
第二重身份:相对时间锁的载体
BIP125 同时提到该信号与 BIP68、BIP112 对 nSequence 的其他用途兼容。相对时间锁的语义是:从被花交易确认那一刻起算,经过若干区块或时间之后才允许花费。BIP68 只取序列号的低 16 位作为增量值,因此以区块计最长约可表达一年的延迟,剩余位留给未来扩展;其中一位用来区分按区块计还是按时间计。操作码 OP_CHECKSEQUENCEVERIFY 验证时读取的正是被花交易输入的 nSequence。闪电承诺交易等契约靠它给对手方留出惩罚窗口。位段的精确语义在相应 BIP 中定义,这里强调一个事实:同一个数字,在不同规则视角下会被不同机制读取。
第三重身份:可替换信号
按 BIP125 的可选式全量替换策略,任意输入的 nSequence 小于 0xffffffff-1,整笔交易即被视为明确声明可被更高费用的双花替换;若其未确认祖先在声明,则经继承信号同样可替换。想声明不可替换的钱包,通行做法是把 nSequence 留在 0xffffffff,配合时间锁时用 0xffffffff-1。顺带一提,这个字段最初的用途正是替换——后来被撤,BIP125 才重新赋予它信号含义。
为什么复用同一个字段
不新增字段,是在不硬分叉的前提下叠加新规则的常用手法:新用途占用新的数值区间或新的解读方式,旧节点按旧规则继续验证即可保持兼容。代价是语义隐晦——你在钱包里勾选开启 RBF,链上留下的只是某个输入少了一点的序列号。
三个注意点
一是最终性开关有真实链上后果:带替换信号的 0 确认交易对收款方不是最终支付。二是合约交易若被软件误设序列号,可能意外获得或失去可替换性,先小额演练再上真实资金。三是各软件默认值随版本不同,以所用软件文档为准,不要套用别家软件的常识。本文只做字段机制科普,不构成任何操作或投资建议。
组合使用的真实例子
最典型的组合是闪电承诺交易:它同时用到多个身份——nLockTime 非零并配一个低于最大值的序列号来满足时间锁条件,相对时间锁字段为惩罚窗口计时,整体又通常被设计成不可替换,以便双方能在不见面的情况下放心预签。也正因各机制挤在同一段字节里,软件构造交易时才有固定的位段分配:哪一位是相对锁标志、哪一段是增量、哪一位用于屏蔽,都在相应 BIP 里写死,钱包只要偏离一位就可能让交易整体验证失败或被赋予你没想到的可替换性。审计一笔合约交易时,把序列号与时间锁字段逐位读一遍,是比看界面勾选更可靠的核对方式——界面只暴露意图,位段才是事实。
常见参数速查
把三个关键取值放在一起更直观:0xffffffff 是默认值,配合非零 nLockTime 也不启用时间锁,也不声明可替换;0xffffffff-1 启用 nLockTime,同时仍不落入替换信号;小于它则触发 BIP125 的显式可替换声明。而相对时间锁场景里,同一字段低 16 位承载增量、一位区分计时方式,剩余位保留。写工具或读交易数据时,务必先明确当前规则视角,再解释这段位;跨视角误读是比特币底层教程里最常见的以讹传讹来源之一。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。