52 / 736BIP125

Replace-by-Fee (RBF)

用更高手续费版本替换未确认交易

Replace-by-Fee (RBF) 允许用手续费更高的交易替换等待确认的 Bitcoin 交易。钱包可借此帮助尚未进入区块的支付,但不能撤回已经确认的支付。

发出支付不等于支付已经确认。节点是验证并转发比特币交易的程序。在矿工将交易放入区块前,它们可能把交易保存在自己的 Mempool 中,也就是本地的待确认交易列表。在一定条件下,RBF 允许节点改为接受一笔新交易,它至少花费原交易所用的一个 UTXO,即尚未花费的输出。替代交易必须带有有效签名,并发送到网络;仅仅提高手续费,并不能保证快速确认。

Anna 发出了 20,000 sat,但支付还在等待。 sat 是 satoshi 的缩写,即比特币的最小单位。 钱包提供通过 RBF 提高手续费的功能。举个简单例子:原交易花费 50,000 sat,其中收款人获得 20,000 sat,手续费是 200 sat,剩下 29,800 sat 作为找零回到 Anna 手中。替代交易仍可让收款人获得 20,000 sat,把手续费提高到 2,000 sat,并给 Anna 找零 28,000 sat。这些数字只解释机制,不是对当前手续费的建议。签名前,Anna 要检查地址、收款金额和新的手续费总额。钱包必须能够为所需输入签名;使用硬件钱包时,可能需要重新连接设备。替代交易会有新的 txid,也就是交易标识,因此可能需要给收款人新的查询链接。使用提高手续费功能,与用其他 UTXO 另发一笔独立支付不同:两笔独立支付都可能确认,导致付两次钱。 [1] [2] [12]

钱包可能在第一次确认前就显示一笔入账。这叫 zero-conf:支付已经被看到,但还不在区块中。另一个版本可能先确认,先前显示的入账也可能消失。因此,‘RBF 已关闭’这个标签不能证明支付已稳妥完成。收到未确认支付就交付商品,是主动承担商业风险。交易进入区块后,RBF 就不能改写它;链重组是另一类风险,也是较大额支付会等待更多确认的原因。 [1]

RBF 本身不要求保留原收款人。替代交易可以只提高手续费并继续付给同一个人,也可以把资金发往其他地方。两个版本都试图花费同一个 UTXO,技术上属于冲突的花费尝试,即 Double Spend;这个名称本身并不能说明是否存在诈骗。不过,攻击者不能随意替他人的支付签名:替代交易仍须满足花费条件,包括所需签名。如果钱包提供用一笔付给自己的交易来‘取消’支付,那只是尝试抢在原交易之前确认,并不是保证能够撤销支付。 [1]

RBF 改动的是等待中的交易本身。Child Pays for Parent (CPFP) 则保留原交易,再创建一笔花费其某个输出的新交易。为了获得新交易的手续费,矿工也必须收录原交易,因此可以一起评估它们的费率。新交易称为子交易,原交易称为父交易。能花费相关输出的人可以创建子交易,例如收款人,或者使用找零的付款人。具体能否操作,取决于钱包支持、所需签名和交易间的依赖关系。CPFP 不替换原支付,也不保证确认时间。 [2]

Mempool 不是全体 Bitcoin 共用的一条队列。每个节点都有自己的列表,以及接收和转发待确认交易的规则。RBF 属于这类本地策略,不属于决定区块是否有效的共识规则。因此,矿工可以选择一笔有效的冲突交易,即使另一个节点此前并未保存它。Full Node 随后按 Bitcoin 规则检查整个区块,本地 mempool 先前偏好哪一笔不会决定验证结果。一个节点接受替代交易,不代表所有节点都一定接受。 [1] [6]

钱包用户需要区分两个数字:总共付多少钱,以及按交易大小计算的费率。假设交易大小为 200 vB,200 sat 就是 1 sat/vB;大小不变时,2,000 sat 就是 10 sat/vB。虚拟字节 vB 是由交易重量换算出的大小单位。重新构建交易可能改变大小,因此钱包也必须重新计算费率。 总手续费是 satoshi 金额,费率是每虚拟字节金额,单位 sat/vB。Core 30 单笔替换的手续费须覆盖所有被移除交易的手续费总和,再加上按 incrementalrelayfee 和替代交易大小计算的成本。其费率须高于所有直接冲突交易。仅提高费率或增加 satoshi 都不够;Core 30 默认 incrementalrelayfee 为 0.1 sat/vB,但节点配置可能不同。 [2] [9]

另一笔待确认支付可能已经依赖第一笔:有人花费第一笔尚未确认交易的输出。这些后续交易称为后代交易。如果父交易被移除,后代在 mempool 中也不能继续有效使用,因此节点必须考虑整个受影响的交易组。 替换父交易还可能从 mempool 移除花费其输出的后代。因此不一定只比较两笔交易。Core 30 对单笔替换要求直接冲突交易的后代计数之和不超过 100,各计数包含交易自身;共有后代可能被重复计数。交易包的手续费和依赖关系因此会影响替换是否成功。 [2]

节点还必须防止有人用不断重复的替换计算拖垮服务。这就是防范 DoS,即针对服务可用性的攻击。UTXO 是先前交易尚未花费的输出,新交易的输入指向它。下面描述的是 Bitcoin Core 30 的具体规则,不是 Bitcoin 永不改变的定律。 Bitcoin Core 30 对单笔替代交易的策略还限制新增未确认输入和被移除交易数量。替代交易须满足节点对可接受交易形式的本地要求(标准性),以及转发和有效性规则,仅仅花费相同 UTXO 不够。这些限制保护计算资源、内存和带宽;交易包替换规则须按节点版本另行评估。 Core 31 引入 Cluster Mempool 后改变了这项策略:相互关联的待确认交易会按组进行评估。替换交易必须改善 feerate diagram,也就是将累计手续费与逐步占用的空间进行比较的图表。此外仍须满足其他条件,例如足够的总手续费,以及转发替换交易所需的额外手续费。因此,不要把上述 Core 30 的限制直接套用到更新版本,应核对自己节点的规则。 [2] [13]

为什么一些钱包还显示 RBF 开关?采用早期 opt-in RBF 策略的节点要求原交易事先发出允许替换的信号。Bitcoin Core 24 允许配置不依赖这一条件的 full-RBF,Core 28 默认启用它,Core 29 移除了 mempoolfullrbf 开关。下面的 BIP125 细节解释的是原来的信号机制,并非今天所有节点通用的规则。 BIP125 描述的显式 opt-in 信号是至少一个输入的 nSequence 小于 0xfffffffe,也描述了从未确认祖先继承信号。这是历史策略而非共识条件。Full-RBF 可在没有此信号时评估替换;没有信号不保证支付无法替换。 [1] [3] [4] [5] [6]

这一节面向使用自有节点的读者。RPC 是查询或控制软件的命令;使用提高手续费按钮并不需要掌握这些命令。 getmempoolentry 显示该节点 mempool 中某笔交易的状态;testmempoolaccept 根据本节点当前 mempool 和规则测试一笔已签名的替代候选交易,不广播它。结果不保证其他节点接受或矿工打包。Core 28 通过 mempoolfullrbf 默认启用 full-RBF,Core 29 移除了该选项。getmempoolinfo 提供手续费参数,但 Core 30 的 fullrbf 字段已标为弃用;始终核实版本和实际配置。 [5] [6] [7] [8] [10] [11]

要获得更完整的理解,请将本词条与以下词条结合阅读: Transaction Fees, Mempool, CPFP (Child Pays for Parent), 双重支付, 确认, Fee Rate. 反向关联还来自: Change Address, 确认, 双重支付, Fee Rate.

DOC · 001BIP 125 — Opt-in Full Replace-by-Fee Signaling规范 DOC · 002Bitcoin Core v30.0 — Mempool replacement policy文档 DOC · 003Bitcoin Core 0.12.0 release notes文档 DOC · 004Bitcoin Core 24.0.1 release notes文档 DOC · 005Bitcoin Core 28.0 release notes文档 DOC · 006Bitcoin Core 29.0 release notes文档 DOC · 007Bitcoin Core getmempoolinfo RPC文档 DOC · 008Bitcoin Core testmempoolaccept RPC文档 DOC · 009Bitcoin Core 30.0 release notes文档 DOC · 010Bitcoin Core getmempoolentry RPC文档 DOC · 011Bitcoin Core v30.0 — Mempool RPC implementation一手来源 DOC · 012Bitcoin Core 30.0 — bumpfee RPC文档 DOC · 013Bitcoin Core v31.0 — Mempool replacement policy文档
修订日期: 来源优先 · 非投资建议