设想的剧本
费用狙击不是双花,而是吞费。剧本是:矿工 A 刚在区块 N 里收了一批高费交易,矿工 B 手握可观算力,判断与其老老实实在 N 上面挖 N+1,不如同时挖一个竞争版本的区块 N’——把 N 里那些高费交易原样搬进 N’,赌自己先让 N’ 被网络接受。N 变成孤块,N 的矿工颗粒无收,高费落入 B 的口袋。比特币维基与相关提案把这种行为定性为一种“低通胀未来里可能变理性的坏激励”:当区块补贴退到很低、费差足够大时,重挖上一块的期望收益可能盖过正常挖矿。
反制怎么起效
比特币核心从 2014 年合并的 PR 2340 开始,在钱包构造新交易时把 nLockTime 设为当前链头高度,并把输入的 nSequence 配成让锁生效但不发替换信号的值。效果是:这笔交易只能被高度不低于链头的区块包含。B 想重挖高度更低的 N’,就会发现抢手的交易全都“不属于那个高度”——它们是为下一块签的。狙击方被迫把这些费放进第二块,而第二块本身又面临被别人反狙击的递归风险。一条字段级的约定,就这样改写了整个博弈的收益表。
随机化回拨与隐私代价
若每笔交易的 nLockTime 都精确等于链头高度,外界一眼能看出“这是默认钱包策略的交易”,也会与少数故意用时间锁的交易在形态上混同。实现因此引入随机化:以一定概率把 nLockTime 往回拨一段随机的小区块数,让不同钱包、不同场景的交易在字段上更接近。后来的 BIP326 提案进一步建议在 Taproot 花费里把反狙击字段的一部分改用 nSequence 表达,让链上观察者更难区分普通钱包交易与链下协议结算交易——反狙击和隐私这层关系,社区已经公开讨论了十年。
为什么补贴退坡让它重新变热
狙击的动机函数里只有两项:块间费差,与重挖的机会成本。补贴高企的年代,浪费十分钟正常挖矿去重挖一块近乎疯狂;当补贴一次次减半、费收入占比抬升,同样冒险的平衡点会下移。这也是钱包层反制被反复强调“别省这个字段”的原因:护栏目前靠惯例而非共识规则维持,任何不设置 nLockTime 的钱包都在悄悄给狙击者扩大弹药库。
一条直觉线
把 nLockTime 反制想成快递单上的日期章:只要每笔交易的生效日期写着“明天”,抢今天仓库的劫匪就永远空手——他要抢的货全部标注着明天。要破局,他得连续抢先两个仓库,而第二个仓库的货又标着后天。递归一层,收益立刻塌掉。
常见误区
一是把它和“自私挖矿”混同:自私挖矿藏的是自己挖到的区块来骗对手算力,费用狙击偷的是别人块里的交易费,动作和收益模型都不同。二是以为 nLockTime 保护是共识规则:它是钱包默认行为加上矿工接受策略,理论上可被放弃。三是把“设置 nLockTime 会拖慢确认”当成代价:把锁设在下一个块高度不引入任何实际等待。
一个常被忽略的边角
反狙击字段和替换信号共用输入序列号空间:锁生效要求序列号不能取最大值,而完整的替换信号又要求它低于另一个阈值。钱包替每笔交易二选一时,实际上是在“防重挖”和“可加速”之间做了默认权衡。这也是为什么排障手册里会说:看到一笔带着锁高度却又不发替换信号的交易,不必惊讶,那只是反狙击的默认形状。
快速问答
问:交易所提现交易一般设置吗?答:多数主流实现遵循该惯例,具体以对应钱包源码为准。问:狙击历史上发生过吗?答:公开记录里没有确认成灾的案例,它更像长期摆着的坏激励与护栏设计。
风险提示:本文只做挖矿激励与交易字段科普,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。