替换交易(RBF)费率提升

使用RBF(Replace by fee)费率提升增加交易费率的方法是创建一个支付更高费用的冲突版本的交易。如果两个或更多交易之间存在冲突,那么它们被认为是冲突的交易,因为只有其中一个可以包含在有效的区块链中,迫使矿工只能选择其中一个。冲突发生在两个或更多交易尝试花费相同UTXO的情况下,即它们各自包含具有相同输出点的输入(引用先前交易的输出)。

为了防止某人通过创建无限数量的冲突交易并将它们通过中继全节点网络发送来消耗大量带宽,比特币核心和其他支持交易替换的全节点要求每个替换交易支付的费率都比被替换的交易更高。比特币核心目前还要求替换交易支付的总费用高于原始交易,但这个要求产生了不良的副作用,开发人员正在寻找在撰写本文时删除它的方法。

比特币核心目前支持两种RBF的变体:

选择性RBF

一个未经确认的交易可以向矿工和全节点发出信号,表明交易的创建者希望允许它被更高费率的版本替换。这个信号和使用它的规则在BIP125中指定。截至目前,这已经在比特币核心中默认启用了数年。

完全RBF

任何未经确认的交易都可以被更高费率的版本替换。截至目前,此功能可以选择在比特币核心中启用(但默认情况下是禁用的)。

为什么有两种不同的RBF

有两种不同版本的RBF的原因是,完全RBF一直存在争议。比特币的早期版本允许交易替换,但这种行为在几个版本中被禁用。在那段时间里,使用现在称为比特币核心的软件的矿工或全节点不会用任何不同版本替换他们收到的未确认交易的第一个版本。一些商家开始期望这种行为:他们假设任何支付适当费率的有效未确认交易最终都会成为已确认的交易,因此他们在收到这样的未确认交易后不久提供他们的商品或服务。

然而,比特币协议无法保证任何未确认的交易最终都会被确认。正如本章前面提到的,每个矿工都可以自行选择要尝试确认的交易,包括这些交易的哪个版本。比特币核心是开源软件,因此任何拥有其源代码副本的人都可以添加(或删除)交易替换功能。即使比特币核心不是开源的,比特币也是一个开放的协议,可以由足够有能力的程序员从零开始重新实现,从而允许重新实现者包含或不包含交易替换功能。

交易替换打破了一些商家的假设,即每个合理的未确认交易最终都会被确认。交易的另一个版本可以支付与原始版本相同的输出,但不需要支付任何输出。如果未确认交易的第一个版本支付给了商家,而第二个版本可能没有支付给他们。如果商家基于第一个版本提供了商品或服务,但第二个版本得到了确认,那么商家将无法收回成本。

一些商家和支持他们的人请求不要重新启用比特币核心中的交易替换功能。其他人指出,交易替换提供了一些好处,包括能够对最初支付过低费率的交易进行费用增加。

最终,致力于比特币核心开发的开发人员实施了一项妥协:不是允许每个未确认的交易都被替换(全面RBF),而是只编程比特币核心允许那些表示希望允许替换的交易被替换(Opt-in RBF)。商家可以检查他们收到的交易是否有Opt-in信号,并将这些交易与没有信号的交易区别对待。

这并不改变基本的担忧:任何人仍然可以更改他们的比特币核心副本,或创建一个重新实现,以允许全面RBF,并且一些开发人员甚至做到了这一点,但似乎很少有人使用他们的软件。

几年后,致力于比特币核心的开发人员稍微改变了妥协。除了默认保留Opt-in RBF外,他们添加了一个选项,允许用户启用全面RBF。如果足够多的挖矿算力和传播全节点启用了此选项,则任何未确认的交易最终都可以被支付更高费率的版本替换。截至目前,尚不清楚是否已经发生了这种情况。

作为用户,如果您计划使用RBF费率提升,您首先需要选择一个支持该功能的钱包,比如列在https://oreil.ly/IhMzx上具有“发送支持”的钱包之一。

作为开发者,如果您计划实现RBF费率提升,您首先需要决定是执行选择加入RBF还是全面RBF。在撰写本文时,选择加入RBF是确保有效的唯一方法。即使全面RBF变得可靠,也可能有几年时间,加入RBF交易的替代版本得到的确认速度会略快于全面RBF替代版本。如果选择加入RBF,您的钱包需要实现BIP125中指定的信号,这是对交易中任意一个序列字段的简单修改。如果选择全面RBF,您无需在交易中包含任何信号。除此之外,与RBF相关的其他事项对这两种方法都是相同的。

当您需要提升费率时,您只需创建一个新交易,该交易至少花费与您要替换的原始交易相同的一个或多个UTXO。您可能希望保留支付接收者(或接收者)的相同输出。您可以通过减少找零输出的价值或向交易中添加额外的输入来支付增加的费用。开发者应该为用户提供一个费率提升界面,让用户只需提供(或建议)需要增加的费率即可完成所有工作。

在创建同一交易的多个替代版本时要非常小心。您必须确保所有版本的交易都相互冲突。如果它们不是全部冲突,那么可能会有多个独立的交易得到确认,导致您向接收方支付过多费用。例如:

  • 交易版本0包括输入A。

  • 交易版本1包括输入A和B(例如,您必须添加输入B以支付额外的费用)。

  • 交易版本2包括输入B和C(例如,您必须添加输入C以支付额外的费用,但C足够大,以至于您不再需要输入A)。

在这种情况下,任何保存了交易版本0的矿工都可以确认它和交易版本2。如果两个版本都支付给了相同的接收方,他们将被支付两次(矿工将从两个独立的交易中获得交易费用)。

避免这个问题的简单方法是确保替代交易始终包括与之前版本的交易相同的所有输入。

RBF费率调整与其他类型的费率调整相比的优势在于它可以非常有效地利用区块空间。通常,替代交易与其替代的交易大小相同。即使它更大,它通常也与用户在第一次创建交易时如果按照增加的费率支付所创建的交易大小相同。

RBF费率调整的根本劣势在于,通常只能由交易的创建者执行——即为交易提供签名或其他认证数据的人或团队。一个例外是设计允许通过使用签名哈希标志(参见“签名哈希类型(SIGHASH)”页)添加额外输入的交易,但这也带来了自己的挑战。一般来说,如果您是未确认交易的接收者,想要使其更快确认(或者根本确认),则不能使用RBF费率调整;您需要其他的方法。

RBF还存在其他问题,我们将在“交易固定”中探讨。

Last updated