交易钉住是什么:为什么有的卡单 RBF 也救不了 图 1
交易钉住是什么:为什么有的卡单 RBF 也救不了 · 图 1

加速失败的另一半真相

交易卡住后大家学过两手:RBF 自己替换、CPFP 拉包费率,见 比特币RBF和CPFP怎么选?。但存在一类失败:替换版本费率再高也被节点拒收,加速按钮形同虚设——这多半是钉住(pinning)。它不是故障,而是把节点维护内存池的合规预算武器化,让“替换这笔”在协议规则内永远凑不出合法包。

预算武器化的原理

节点接收交易时有一组祖先/后代限制:一笔交易的未确认祖先与后代在条数与体积上都有硬顶,超限的交易被直接拒收,见 交易包与祖先限制:为什么低费率父交易会拖累你的加急子交易。BIP125 的替换规则同样受这套预算约束:新版本交易及其祖先集合必须相对旧版本满足额外费率与结构条件。攻击者只要在目标交易的祖先或依赖链上先塞进一条自己控制、费率极低的交易,再让这条链在需要时“长胖”,你的替换方案要么撑爆祖先条数被拒,要么永远凑不齐替换增量——钉住的本质是:我不用打败你的费率,我只需要在规则边界上占住你的预算。

三种典型形态

第一类是对手方钉:多方可参与的交易(通道协商、协作构造)里,某一方在自己的输入上挂低费子孙,让共同交易失去可替换性;闪电的锚定输出设计正是针对这类场景——给承诺交易配独立锚点,让 CPFP 不必依赖对方控制的输入,见 闪电网络通道链上关闭的手续费谁来付?Anchor Outputs 锚定输出怎么起作用。第二类是第三方钉:与交易无利害的路径节点或旁观者预埋小额依赖,被动但同样有效。第三类是自身结构钉:链式找零依赖、把低费在途收款选作输入,等于自己给自己上锁,这类是新手最容易踩的,见 比特币钱包为什么要生成找零地址?选币机制与粉尘 UTXO 怎么管理

识别与缓解

识别信号:替换版本被 testmempoolaccept 预检拒绝且原因指向依赖结构(而非费率),见 testmempoolaccept怎样预检交易?;或同一交易的两个版本在不同节点视图里命运迥异——不同祖先池的节点会给出不同裁决,浏览器上尤其明显。缓解工具箱按前提分档:有锚定输出时直接锚点 CPFP;交易声明 opt-in RBF 且结构可解时,构造合规替换;结构被钉死时,唯一干净路径是放弃旧结构,用不依赖问题输入的 UTXO 重建全新交易,配合双花规则等矿工裁决,见 abortprivatebroadcast能撤回交易吗?

协议层的长线修补

钉住不是新话题,但包中继把它推进了新一章:把交易连同依赖作为整体检查、整体中继,让“祖先已在池”不再是接收前提,结构性钉住的一部分土壤被抽走,见 submitpackage怎样提交交易包?getblockstats费率字段怎么读? 的包视图视角。另一条线是替换规则持续细化:对“仅费率略增但结构不变”的纯费用提升替换放宽约束、对链式新增依赖收紧,方向是让费用竞争重新决定排序,结构把戏失去收益。

小结与风险提示

钉住是钱包、协议与经济激励的夹层地带:规则都遵守,自由被偷走。防御顺序——先挑依赖干净的输入,再确认替换信号与锚点存在,最后才对被钉场景准备重建预案。理解预算武器化,你就理解了为什么“费率不是手续费问题的全部答案”。交易构造与依赖选择存在真实加速失败风险,本文不构成投资建议。

一个思想实验:为什么“多加费率”输给“多占预算”

设想你的可替换交易只有一条干净的依赖链,替换它只需要多付一点增量费率,规则畅通。现在对手往链上塞了一条低费交易作为你的祖先:它的存在不违法、费率低到没有任何矿工愿意单独打包、体积恰好让祖先配额接近饱和。你的替换版本这时要背两座山——BIP125 要求它比旧版本多出的费用覆盖被抛弃交易的费率缺口,祖先与后代限制又可能让你的新版本加上这条链直接超限。对手的成本只是几笔微小转账的手续费,你的每次加速尝试都要付全额重包费用,这就是钉住作为“低成本高摩擦武器”的经济学。顺带提醒:钉住不等于双花成功,你的原始交易最终仍可能正常进块——钉住赢在时间与选择权,不在于永远拒绝你。