假设有人给你转了比特币,但手续费较低,付款一直没有确认。如果钱包支持对这笔付款使用 CPFP,你可以创建一笔后续交易,例如转到自己的另一个地址。原交易称为父交易,新交易称为子交易:子交易花费父交易创建的一个输出,也就是一笔带有花费条件的金额。矿工要收取子交易的手续费,就必须先有父交易。原付款保持不变;提高整体手续费可能有助于确认,但不能保证确认时间。
Anna 正在等待 100 000 sat。sat 是 satoshi(聪)的缩写,是比特币的最小单位。她已经能看到付款,但发送方设置的手续费较低,交易还没有进入区块。她的钱包允许花费这个尚未确认的输出。于是,Anna 用它创建一笔转到自己地址的新交易,并支付更高的手续费。她不是给发送方付钱,也不是给某项特殊服务付报酬,而是在支付普通的比特币交易手续费。矿工不能在没有原交易的情况下确认新交易,因为缺少原交易时,被验证的链中就没有新交易要花费的那个输出。父交易必须已经在此前确认,或者与子交易进入同一个区块并排在子交易前面;其他必要的未确认祖先交易也必须先被纳入。反过来却不需要:父交易可以在没有子交易的情况下确认。 [3] [5]
先看一个没有其他未确认祖先交易的简单例子。父交易大小为 200 vB,手续费为 200 sat。vB 是虚拟字节,是根据交易权重计算出的大小单位;sat/vB 表示每个单位支付多少聪。子交易大小为 100 vB,Anna 为它支付 2 800 sat。如果子交易只有一个输出,那么收到的 100 000 sat 将剩下 97 200 sat。两笔交易合计支付 3 000 sat,占用 300 vB,整体费率就是 10 sat/vB。子交易单独的费率是 28 sat/vB,但矿工还得纳入手续费较低的父交易。只看子交易的高费率,就忽略了这一依赖关系。这只是说明原理的计算,不是今天应使用的费率建议;钱包会核对实际大小和所需的总手续费。如果还有其他必要的祖先交易,计算也会改变。进阶补充:节点是验证并转发交易的程序。在本地接收交易包时,它不会重复计入已经接收的交易,还可能使用经本地调整的手续费。因此,该场景显示的费率不一定等于这里面向矿工的简单合并计算。 这里的调整后手续费只是节点作出决策时使用的本地数值,不会改变交易实际支付的手续费。 [3]
CPFP 不是任何人都能按一下、替别人加速交易的按钮。你必须有权花费父交易的某个输出,并满足其条件,包括提供所需签名。Anna 作为收款人可以这样做;发送方则可能通过返还自己剩余资金的找零输出,也就是 change,来操作。仅仅在区块浏览器或 Watch-only Wallet 中看到金额并不够。 Watch-only Wallet 用于查看付款,本身不保存花费资金所需的私钥。钱包还必须支持花费这个未确认输出。签名前要核对花费的是哪个输出、资金发往哪里、剩余多少,以及总共支付多少手续费。如果输出金额很小,手续费可能消耗其中很大一部分。 [5]
Replace-by-Fee (RBF) 创建一笔新的冲突交易,用来替换原交易。它至少花费一个与原交易相同的输入,但不要求全部输入完全一致。CPFP 则保留原付款及其标识符,再增加一笔交易。使用 RBF,需要满足替换交易各输入的花费条件;普通 CPFP 则需要满足原付款某个输出的花费条件。因此,收款人即使无法签署发送方的替换交易,也可能使用 CPFP。发送一笔毫无关联的高费率付款并不能帮忙:子交易必须真正依赖那笔等待中的付款。 [3]
更高的整体费率会让矿工更愿意选择这两笔交易,却不会预留下一块的位置。可能出现付费更高的其他交易,也可能有矿工根本没有收到这个交易包。因此,要同时关注原付款和子交易的确认情况。节点显示已接收,还不等于交易已在区块中确认。如果发送方通过 RBF 替换了原付款,引用旧输出的子交易不能自行接到另一笔新交易上,需要重新判断情况。创建了子交易,也不代表尚未确认的收款就变成了确定到账的资金。 [3]
以下内容面向希望深入了解规则或运行自己节点的读者。Mempool 是某个节点保存的待确认交易列表,不是整个网络共用的一条队列。交易包是一起提交的一组交易。需要区分三个判断:交易是否有效、节点是否接收,以及矿工是否选择它。 共识决定交易和区块的有效性;mempool 策略决定本地接收和转发;矿工规则决定候选区块的交易选择。CPFP 不改变共识。经济上有吸引力的交易包仍可能不符合本地策略,一个节点接受它也不会约束其他节点或矿工。 [3] [5]
父交易和子交易一起传播的方式仍在发展。Package CPFP 指把相关交易作为一个交易包来评估。RPC 是与节点交互的命令;minrelaytxfee 表示节点对普通转发设置的最低费率。TRUC 是一种特殊交易规则,对祖先与后代之间的关系作出限制。下面的历史说明对应所列出的 Bitcoin Core 版本。 Bitcoin Core 26 引入 submitpackage RPC 和 package CPFP:子交易可帮助费率低于 mempool 动态最低费率的父交易,但当时不能低于最低转发费率。这不是永久限制。Core 31 在支持的一父一子交易包转发中,允许父交易低于 minrelaytxfee,甚至零手续费,也适用于非 TRUC 交易;子交易的其他未确认父交易必须已经在 mempool 中。本地接收依然不保证整个网络以相同方式传播。 [1] [2]
节点不能接收任意庞大的依赖网络。祖先交易是另一笔交易所必需的前序交易;后代交易则沿依赖关系继续花费输出。WU 表示交易权重单位,拓扑描述交易如何互相连接。这些技术限制属于相应节点版本的策略。 限制用于保护内存、处理器资源和带宽。旧版 Core 限制祖先和后代的数量及大小;Core 31 用相连 cluster 的限制替代这些 mempool 限制。独立的交易包限制仍存在:Core 31 文档规定最多 25 笔交易,总权重不超过 404000 WU。权重不是虚拟大小。拓扑错误、冲突或不符合节点对可接受交易形式的本地要求(标准性),都可能在手续费足够时阻止 CPFP。 [2] [3]
相互依赖的待确认交易,并不总能单独评估其经济价值。Cluster Mempool 让节点能够考虑相互连接的交易组。cluster 是完整的连通组;在交易选择过程中处理的较小组称为 chunk。它们不是已经确认的区块碎片。 Bitcoin Core 31 使用 Cluster Mempool:cluster 由通过任意方向父子关系相连的交易组成。每个 cluster 的默认限制为 64 笔交易和 101 kB 虚拟大小,可通过配置调整。排序考虑一起被挖出的交易组,即 chunks,及其费率。历史上的 CPFP carveout 允许对后代限制作有限例外;Core 31 已移除它,不能再以此绕过 cluster 的交易数量限制。 [2] [4]
本节中的命令不能互相替代。测试可能只是描述结果;提交交易包则可能真正接收并传播已经签名的交易。vsize 字段表示虚拟大小。普通钱包可以替用户处理这些细节。 在 Core 31 中,getmempoolentry RPC 显示本节点 mempool 中某笔交易的手续费、vsize、依赖关系及 chunk 数据;getmempoolcluster 显示相关 cluster。testmempoolaccept RPC 仅在本地测试,不接收也不广播;传入多笔交易时,祖先必须排在子孙之前,且交易不能彼此冲突或与 mempool 冲突。submitpackage RPC 则实际提交受支持的交易包以便接收到 mempool 并转发,不只是测试。检查每笔交易的结果、版本和配置;任何结果都不保证交易能被纳入区块。 [2] [6] [7] [8] [9]
要获得更完整的理解,请将本词条与以下词条结合阅读: Replace-by-Fee (RBF), Transaction Fees, Fee Rate, Mempool, 交易, UTXO. 反向关联还来自: Change Address, 确认, 双重支付, Fee Rate.