作者:Shinobi

来源:https://bitcoinmagazine.com/technical/rbf-debate-is-incentives-and-choice

令人惊讶!比特币人因为给下一个版本的 Bitcoin Core 提议的变更而吵翻天了。

“选择性手续费替换(Opt-in RBF)” 是一种交易池策略,在 2015 年提出,给了用户处理因为网络手续费暴涨而卡在交易池中很长时间的交易的办法。

显然,只要网络的交易的数量增长持续高于可以被区块链处理的交易数量,用户就会遇到交易卡住的问题,所以,除非你认为网络永远不会达到这样的接受度,不然就得承认这是一种必要的功能。

交易替换实际上也被包含在比特币软件的最初版本中(在中本聪消失之前)。他最终禁用了这个特性,因为他最初实现它的方式会对节点产生一种拒绝服务式(DoS)攻击界面。他的实现允许任何交易被替换,无需支付更高的手续费,所以,用户可以发起一笔交易然后广播无数笔替换交易。显然,这就可以大量数据来轰炸节点(广播这些数据不需要提供工作量证明),而且可能会让运行节点的成本变得高不可攀。

过去几年,人们为改进的、更安全的交易替换方案讨论了不同的提议。我们会快速讲解一下。

全面 RBF

RBF 的最简单的变种。任何交易都可以被替换,只要替换版本支付了比原版更高的手续费。所有交易都可以被替换,但你每替换一次就要支付更高的手续费,这就防止了出现无限数量的替换交易导致节点过载。

只进不退 RBF

这个提议也允许交易池中的任何交易被替换,只有一个限制:原版交易中的所有输出都必须包含在替换版本中,包括找零输出。这个提议依然要求提高手续费,但要求使用相同的输出,意味着你只能给交易添加输入和另一个找零输出(你不能替换到原来的输出)。这导致替换交易的体积更大,而且必须支付更高的手续费,以保证替换交易的手续费率比原版交易高。

延迟 RBF

这个提议允许交易池中的任何交易被替换,但是需要等节点看到原版交易的一段时间以后才行。它背后的想法是,在高手续费环境中被卡住的交易可以被替换并更快得到确认,但这个时间间隔的限制可以防止重复花费零确认的交易。

选择性 RBF

这就是由 BIP 125 定义,在 2016 年实现的 RBF 策略。只有设置了特定标记的交易,以及在未确认的交易链条中有祖先设置了特定标记的交易,才能被替换;这是为了让人们在接收资金时,知晓一笔未确认的交易会不会被替换。

当前的争议是,Bitcoin Core 的下一个版本 0.24,引入了一个全面 RBF 的交易池选项。用户可以使用这个选项,将本地的交易池策略从选择性 RBF 变成全面 RBF;不过,这个选项默认是关闭的(节点默认不会使用全面 RBF,除非手动配置)。那么,为什么人们还会为这个变更大动干戈呢?

接受零确认交易的企业,依赖于绝大部分节点都会拒绝没有使用 RBF 标记的交易的替换交易。他们是通过让自己的节点有策略地连接到全世界的许多节点,来确保这一点的。这使得他们可以非常快速地检测出网络中的重复花费交易;为了让原版(没有使用 RBF 标记的交易)能够大概率到达矿工的节点,也只能这样做。还值得指出的是,每一家这样做的企业,实际上都要对网络发动女巫攻击。这些企业声称全面 RBF “打破” 了他们使用 RBF 的业务模式。一些人甚至批评 Core 开发者 “强制” 推行一项对他们的业务有负面影响的变更。

一个简单的事实是,重复花费总是有可能出现的,无论使用选择性 RBF,还是全面 RBF,对此都没有任何影响。更进一步地说,只是创建一个让你可以改变本地交易池策略的选项(这个选项是默认关闭的),也不是对任何人的发号施令,只是给了用户作出自己的选择的机会。迄今为止,关于哪一笔交易能够进入比特币的区块,唯一有影响的交易池是矿工们的交易池。个人用户的交易池只是存储交易的雏形链,最终目的是把所有的未确认交易传递给矿工,让它们最终能够进入区块。

交易池策略是一种防止对节点的 DoS 攻击、保护用户不要搬起(复杂交易和脚本的)石头砸自己的脚的软安全机制。许多流行的交易在共识上是有效的,也可以进入区块,但不会被默认的交易池策略接受和转发。这也完全无法阻止一名有决心的用户直接把一笔会被网络中的其它节点拒绝的交易发给矿工。

这就是问题的关键所在。矿工只需要建立一个 API,接受直接发送给他们的交易(有些矿工已经在这么做了),然后整个网络的交易池策略的限制就无关紧要了。你只需要直接把一笔交易交给矿工,就可以绕过其他节点限制什么东西可以进入他的交易池的所有规则。请考虑一下其中的激励 —— 如果挖出某一些交易可以赚到钱,但网络中的节点的交易池都会拒绝这些交易,你是一个矿工,你会怎么做?直接收集它们呀。区块补贴越少,交易费占矿工收益的比重就越大,矿工直接收集支付更高手续费的替换交易的局面就越不可避免(如果节点们不会转发它们的话)。这没有什么好说的。

这次变更并没有改变 Bitcoin Core 的默认交易池策略,它只是为想改变本地交易池策略的个人节点运营者提供了一个选项。

而且我还要补充的是,只要用户选择修改自己的客户端,这个选项其实一直都在。所以这次变更做的只是让一个一直都存在的选择变得更容易执行。只要矿工是理性行事的 —— 这无可避免 —— 激励机制就会导向所有的交易都可以被替换的局面。唯一的问题只是,软件应该允许人们决定自己的交易池使用什么策略从而暴露出这种激励吗,还是说,人们应该坐等交易的转发围绕直接发送给矿工的机制变得中心化呢?

最终的结果是一样的,但等待矿工都站到直接收集交易那边去,会产生非常糟糕的后果。这会给在网络中广播交易的用户的隐私造成负面影响,而且可能会对用户确定手续费水平的能力造成负面的影响。如果大量的待机交易都不是公开在网络中的,那么用户判断中标机会(交易可以进入区块的手续费水平)的视野就不完整。甚至于,矿工可以谎报手续费的分布,从而激励用户支付高出实际需要的手续费。

提供这个选项的唯一真正缺点是,全面 RBF 可能因为启用它的节点(包括矿工节点)太少而无法一致地工作。但是,从功能迁移的角度看,这跟隔离见证升级在根本上没有什么不同。在迁移期间,没有升级的节点不会转发隔离见证的交易,因为他们无法验证这些交易;同样地,在迁移到全面 RBF 之前,交易的传播也会不连贯,直到足够多的节点升级。但最终来说,这不会改变一个事实:升级是用户的个人选择。

最终来说,攻击全面 RBF,只是否认网络中的激励因素的事实。没有人在发号施令,一个配置选项只是给个人用户一个为自己作选择的条件。反而,我觉得奇怪的是,与此同时,那么多人一边无视激励机制的事实、声称一种接收支付的不安全的方法可以抵抗激励、保持安全,一边又主张用户不应该被允许配置自己的软件。

我的节点,当然应该由我做主,不是吗?

(完)