本文深入探讨了比特币交易手续费追加的两种主要方法:手续费替换(RBF)和子为父偿(CPFP)。RBF允许用户通过支付更高的手续费来替换未确认的交易,而CPFP则允许用户创建一笔新的子交易,该交易花费未确认父交易的输出,从而提高整个交易包的平均手续费率。文章分析了这两种方法的原理、用户体验考量以及对大体量用户的特殊影响,并讨论了各自的优势和劣势,为比特币工程师和相关服务提供商提供了宝贵的参考。
作者:Bitcoin Optech
比特币的手续费市场瞬息万变,可能会导致交易上链所需的手续费剧烈上升或下降。
- (6 个月的交易池规模图,以手续费率的高低分组及着色,来自 https://jochen-hoenicke.de/queue/#1,24h) -
手续费波动性的原因之一是市场选择哪些交易能进入一个区块的机制。在市场上,矿工们每 10 分钟左右供给 400 万重量(weight)(译者注:一种虚设的计量单位,用来度量一笔交易的体积)的区块空间,而用户们则(通过交易费率)竞拍,让自己的交易进入区块。许多钱包的手续费估计算法都粗糙,而用户有时候对高费率并不敏感,这就意味着,当交易池规模急速增长、预期的确认时间开始增加的时候,用户之间的竞拍战争可能迅速升温,钱包也开始为交易附加极高的手续费。
但这个市场还有个奇怪之处:当用户的竞拍失败、交易未能入块时, 这个竞标并不会撤回,而是继续参与下一个区块的竞标。这是因为交易具有一种不变的属性:一旦它从某个区块开始是一笔有效的交易,那么它往后就一直是有效的交易。实际上,作废一笔已然有效的交易(从而 “撤回” 竞标)的唯一方法就是在另一笔交易中花费原交易的输入(不论一个还是多个)。
这种奇怪的特征一般来说不会对用户造成困扰,因为如果一个用户签名了一笔交易,那他们当然愿意这笔交易立即就能进入区块得到确认,而且相比他们愿意让这笔交易在不远的将来、以同样的代价进入区块。但是,有一种情境中,无法从交易池中撤回交易可能给用户造成严重的困扰:当用户没有给交易附加足够高的交易费,因此交易无法入块,但用户又有紧急需求,想让交易入块。遭遇这种情形可能有很多原因:钱包或者用户个人低估了所需的交易费、用户尝试在预期的手续费范围的底部出价来节约手续费,或者仅仅因为交易广播出去之后,入块所需的手续费率意外暴涨。不论是什么原因,用户会发现自己的交易因为低手续费率而 “困” 在了交易池里,而且未来能入块的希望也非常渺茫。
交易可能卡住的风险也会影响用户给交易费出低价的空间。如果没有办法让交易在广播之后解除困局,那么用户就不得不在一开始出一个保守(较高)的价格来避免交易卡住的风险。
因此,我们需要一种办法给已经广播出去的交易追加手续费,原因有:
当前有两种常见的释放滞留在交易池中交易的办法:“手续费替换(Replace-by-fee,RBF)” 和 “子为父偿(Child Pays for Parent,CPFP)”。
用户构造和签名一笔替换交易,替换交易要花费被阻交易的一个或多个相同输入,并且要支付更高的手续费(一般来说是通过减少找零输出的数额,减少的数额就是额外支付的手续费)。如果替换交易附带了足够高的手续费,矿工就有激励打包它。
用户创建一笔新的交易,新交易要花费被阻交易的一个或多个输出。这笔子交易附带了一大笔手续费 —— 足以提高其自身与被阻交易的联合手续费率,使之高于入块所需的费率。但是,这种办法只有在用户拥有交易的输出时才能动用。
在选择打包入块的交易时,矿工将需要考虑交易 “包”,要看整个交易包的总体费率。矿工为了最大化区块的手续费收入,是有激励这样做的。
这个特性也可正确称之为 “裔为祖偿(Descendants-Pay-For-Ancestors)”,因为一个理性的矿工会尝试最大化自己的手续费收入,哪怕交易包内的交易大于两代,也不是问题。举个例子,Bitcoin Core 的挖矿代码会考虑最高达 25 笔交易组成的任意长度交易链条的交易包。
手续费追加策略对比特币钱包和服务的用户体验有显见的影响。比特币服务需要考虑的问题比如:
这些问题会在本文的后续章节中得到更细致的讨论。
对于那些重度使用比特币区块链的实体(比如交易所和托管商),还有额外的考量:
这些问题也会在本文的后续章节得到更深入的讨论。
(待续 1)
(待续 2)
(待续 3)
(待续 4)
(待续 5)
即使钱包和服务自身不支持用户创建选择使用 RBF 的交易以及替换交易,也应该在处理 RBF 交易时向用户提供清晰和准确的体验:
(待续 6)
(待续 7)
子为父偿(CPFP)是一种钱包功能,用户可以花费一笔未确认的交易( 父交易)的输出、作为一笔新交易( 子交易)的输入。钱包会让子交易附带足够的交易费,从而提高父交易和子交易的联合交易费率。
在构造一个新区块时,矿工的利益在于用手续费最高的一组交易填满 1vMB 的区块(译者注:vMB 也是一个虚设的计量交易体积的单位,跟上面说的 weight(重量)可以相互换算)。如果所有的未确认交易都是独立的,那么操作就很直接 —— 矿工只需按手续费率高低降序排列,从上往下加入候选区块中直至区块满载。这样做就能最大化矿工从区块中获得的收入(围绕一个区块的最后几个字节,要做稍微复杂一点的操作才能保证尽可能填满了区块)。
不过,未确认的交易 不是 独立的。有可能会有一连串的未确认交易在花费一笔尚未确认的交易的输出。举个例子,交易 A 有输出 a1 和 a2,交易 B 可能在 A 打包入块之前就使用其中之一作为输入。这时候,如果矿工想要在区块中包含 B,就必须先包含 A,因为如果没有 A,B 就是在花费一个不存在的输出,因此是无效的交易。
如果一个矿工在构造区块时总是孤立地考虑交易给自己带来的好处,她可能会因为前序交易的低手续费而错过后序交易的极高手续费(甚至更糟糕,她可能会创建一个带有无效交易(依赖于未上链交易)的无效区块)。因此,为了最大化自己的利润,在构造新区块时她应该以 交易包(相互依赖的交易的集合)的角度来选择交易。
钱包可以利用矿工的这种理性行为模式,激励她们将一笔因低手续费而卡住的交易打包上链,办法就是花费这笔卡住交易的一个输出,并提高整个交易包的整体手续费率。
想要利用 CPFP 来追加手续费,有两个前提条件:
在 2012 年以前,区块很少是满的,所以也没什么手续费市场可言。Bitcoin Core 的挖矿部分因此没有特别优化以尽可能获得更多手续费。交易首先按照 “优先级”(每个输入的币龄总和(value X coin age),除以交易的体积)排序,并在区块可以打满的时候 提高所需的手续费率。Bitcoin Core PR #1590 改变了挖矿的代码,变成主要按照手续费率对交易排序,同时保留了一些空间给优先级分数较高的交易。因此,2012 年 9 月发布的 Version 0.7.0 是一个主要按照手续费率来排序交易的 Bitcoin Core 版本。
大约在同一时间,Luke-jr 开始维护 一个补丁,它会在排序可加入区块的交易时考虑其子交易的手续费。这个补丁至少被一些矿工使用了,但因为缺少测试和基准测试,以及担心它可能开启针对矿工的 DoS 攻击界面,从未合并到 Bitcoin Core 中。
更细致考虑交易包的 Bitcoin Core 挖矿代码在 2016 年 更新。这段代码会考虑 25 笔交易以及 101 vkB 以内的交易包。这个更新纳入到了 V0.13。
在本文撰写之时(2018 年 11 月),基本上可以确定,大部分矿工都在运行 Bitcoin Core V0.13 或手续版本,或者其衍生软件。因此,钱包可以安全地假设,后代交易的手续费会在祖先交易是否能入块时被考虑进去。
Holders 比特币交易所(Hodlers Bitcoin Exchange,HBE)有几十万用户,并且每天都有几千笔取款。因为他们每个区块都要发送许多区块支付,他们会每十分钟发起一笔交易,批量处理取款。
HBE 希望保持客户的手续费低廉,所以他们总是非常设定非常经济的手续费 —— 他们喜欢给出刚刚好足够入块的交易费,不想多给!这就意味着,偶尔,他们的取款交易不会立即得到确认,会卡在交易池中。用户因此会抱怨取款速度慢或者卡住。
为了提升他们客户的体验,HBE 实现了 CPFP 来为卡住的批量取款交易追加手续费。为此,他们会使用一笔批量区块交易的找零输出作为另一笔取款的第一个输入,并保证第二笔交易会给出足够高的手续费来拉高两笔交易的平均手续费率。如果这还是不足以让交易被打包,他们会使用第二笔批量取款交易的找零输出作为第三笔交易的输入,以此类推。
在实现 CPFP 系统时,HBE 需要考虑一下几个方面:
总的来说,HBE 非常满意自己的新 CPFP 实现。客服工单减少了,用户一般都不会注意到他们的取款用到了 CPFP 来追加手续费,因为他们取款交易的 id 和输出的索引都不会改变。
钱包和浏览器应该向用户提供关于交易包的相关信息:
(待续 8)
(待续 9)
(待续 10)
(待续 11)
(待续 12)
手续费替换和子为父偿都是有用的手续费追加技术。两个各有各的优点和不足,视场景而定,使用其中某种(或两者都用)可能会比另一种要更合适。
比特币工程师应该熟悉这两种技术,而且比特币的产品和服务应该(在用户用到这些技术时)向用户提供清晰和准确的体验,即使自身并不支持创建 RBF 和 CPFP 交易。
这篇文章里讨论的两种方案都跟网络中的节点和矿工在一笔交易入块之前的行为模式有关。因此,这些行为模式更多与对策相关,而不是与共识相关。两种解决方案都是跟矿工的激励兼容的 —— 一个想要尽可能获得收益的矿工,既会接受 RBF 替换交易,也会接受 CPFP 交易包。因此个体节点的交易池(是最便于一个节点猜测下个区块的内容的工具)应该也会接受 RBF 替换交易和 CPFP 交易包。
- 本文转载自: btcstudy.org/2022/03/17/... , 如有侵权请联系管理员删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!