
卡住的交易:为什么会发生,以及手续费替换如何把你救出来
你发出了一笔付款。钱包显示「待确认」。一个小时过去了。然后是三个小时。区块浏览器显示你的交易正坐在内存池里,未被确认,看上去要永远坐下去。
没有任何东西坏掉,也没有任何东西丢失。你只是在一场拍卖里出价太低,而这场拍卖还在进行。
手续费是一场拍卖,不是一个价格
区块空间是稀缺的,而且会一直稀缺下去。每个区块只能容纳有限的交易数据,矿工则挑选把哪些交易打包进去。他们按费率挑选——每虚拟字节多少聪——因为这样才能让收入最大化。
这意味着你附上的手续费不是某项服务的价格。它是一份出价,投在一场持续进行的拍卖里,对手是所有其他想挤进下一个区块的人。
由此得出两个结论,而且两个都反直觉:
你的手续费只有相对于其他人的手续费才有意义。 上周二十分钟就确认的那个费率,在一个繁忙的周末可能一躺就是两天。你的交易什么都没变;变的是竞争对手。
不存在超时。 一笔出价过低的交易既不会过期,也不会失败。它在内存池里等着,看出价更高的人一个个越过它,而且可以无限期等下去。节点最终会把非常陈旧的交易从自己的内存池里丢掉——通常是在两周左右之后——但那只是本地的清理默认值,而不是协议规则,你不能把它当作逃生出口来依赖。
第二点正是卡住的交易让人如此难受的原因。没有错误提示,没有退款,也没有显而易见的动作可做。只有一个永远转不完的加载图标。
你的这笔为什么卡住了
手续费估算过时了。 估算器读取的是近期状况。如果在你估算和你广播之间内存池被填满——某家大型交易所在做归集、一场 NFT 铸造、一波 ordinals 浪潮——你的出价瞬间就落到了市场行情之下。
你选了经济档,也就得到了你所要求的东西。 低优先级档位明确就是一场赌注,赌拥堵会缓解。通常确实会。有时候不会。
你的交易体积很大。 费率是按字节计的,所以一笔花费许多小额输入的交易,比同样金额的简单交易更难被确认。持有大量粉尘的钱包总是撞上这一点。
你在花一个未确认的输入。 如果你花掉某笔尚未确认交易的找零,你这笔新交易在父交易确认之前就无法确认。一笔卡住的付款,可以悄无声息地把它之后的一切都搁浅在原地。
手续费替换:真正的解法
手续费替换在 BIP 125 中被规定,它允许你为一笔未确认交易广播一个支付更高手续费的替代版本。节点丢弃原始交易并转发新的那一笔;矿工采纳更好的出价。两者中永远只有一笔能被确认——它们花的是同样的输入,因此在构造上就是互斥的。
这不是第二笔付款。这是同一笔付款,重新出价。
实践中有两个细节要紧。
交易必须事先被标记为可替换。 RBF 是选择性启用的:通过把某个输入的序列号设为低于 0xfffffffe 来发出信号。Bitcoin Core 的惯例是 0xfffffffd,而 SSP 设置的正是这个值——在交易构造器中字面上就写作 0xffffffff - 2。如果一笔交易在创建时没有被标记为可替换,大多数节点会拒绝这个替代版本,你的选项也会大幅收窄。
替代交易必须越过一道下限,而最显而易见的那道下限是错的。 BIP 125 的第四条规则要求,替代交易支付的手续费至少要达到原始手续费加上它自身体积按最低转发费率计算的金额。很多人在这里栽跟头:从「经济」提到「普通」可能抬高了费率,但体积几乎没变,而只要算术差了那么一点,节点就会拒绝这个替代版本,你便一无所获。SSP 会在构建替代交易之前显式计算这道下限,从而保证新的手续费能越过第 4 条规则,而不是被网络无声无息地拒掉。
在 SSP 中,一笔未确认且可替换的交易会在交易列表里显示一个手续费替换操作。它会预先填入相同的收款方和金额,并把被替换交易的手续费一并带上以便计算下限,随后引导你在两台设备上签署这笔替代交易,和其他任何一笔付款完全一样。第二枚签名仍然是必须的——替代交易是一笔新交易,而没有任何东西可以用单台设备签名。
并非每条链都允许
RBF 是一项政策选择,而不是一个普适功能,SSP 支持的各条链在这一点上确实各不相同:
| 链 | 在 SSP 中可替换 |
|---|---|
| 比特币 | 是 |
| 莱特币 | 是 |
| 狗狗币 | 是 |
| Ravencoin | 是 |
| 比特币现金 | 否 |
| Zcash | 否 |
| Flux | 否 |
比特币现金被排除在外,是那条链自己的刻意选择:BCH 移除了 RBF,好让零确认付款在实体收银场景中更可靠。这是一个真实的取舍,而不是疏漏——你获得了对未确认付款的信心,失去的是纠正一笔低价出价的能力。Zcash 与 Flux 同样不转发替代交易。
在这些链上,一笔定价过低的交易只能硬等。而这恰恰是最有力的理由:在一条不让你收回的链上,一开始就别出价过低。
真的发生时该怎么办
首先,稍微等一等。 内存池的拥堵是一阵一阵的。晚上九点看起来注定无望的一笔交易,往往会在夜里积压疏散时确认。在为解决方案花钱之前,先看看内存池可视化工具。
如果可替换而你又赶时间,那就替换它。 挑选一个高于当前「下一个区块底部」费率的费率,而不只是高于你原来的那个。比一个已经输掉的出价只高出一丁点,正是把这件事做两遍的方式。
不要广播第二笔付款。 如果第一笔最终确认了,你就付了两次。替换之所以安全,恰恰因为它与原交易互斥;另起一笔独立交易则不然。
不要花掉卡住交易的找零。 你会把第二笔卡住的交易接在第一笔后面。
如果无法替换,那就等。 在没有 RBF 的链上,交易要么在拥堵散去时被确认,要么最终从各节点的内存池中被丢弃,此后这些币便重新可花。不要去找什么「取消」服务;那种东西并不存在。
下次如何避免
看手续费本身,而不只是档位的标签。 「经济」在一个清静的周日和在一次手续费高峰期间,含义并不相同。包括 SSP 在内的大多数钱包,都会把实际费率展示给你。
诚实地让紧急程度与手续费相匹配。 一笔真的可以拖上一天的付款,就该用低手续费——档位存在的意义正在于此。而一笔你会焦虑地反复刷新的付款,则不该。
保持你的 UTXO 集合整洁。 在手续费低廉时把小额输入归集起来,会让往后的每一笔交易都更小、更便宜。这是长期持有者在手续费问题上能做的最有效的一件事,而最佳时机就是别人都不想要区块空间的时候。
有意识地挑选链与时机。 手续费策略是一项真实的技能,而其中大部分不过是注意到:区块空间在某些时刻就是比另一些时刻便宜。
卡住的交易,是加密世界里少数几个真正无害的问题之一。你的币从未离开你的掌控,没有任何攻击者牵涉其中,而解法是一项规范明确的协议功能。它之所以让人觉得像紧急事故,只是因为界面没有提供任何安抚——而这件事本身,就足以成为你去理解底下究竟在发生什么的理由。


