AVA:干货 | UTXO 合并是什么?

来源:BixinInstitute,原题《UTXO合并》

DavidA.Harding文

本文由币信研究院原创编译,原文链接:

https://github.com/bitcoinops/scaling-book/blob/6a7b1e9cc64ddf832b86276e7569604334f9012c/x.consolidation/consolidation.md

本文版权归原作者所有,仅代表作者本人观点,不代表币信或币信研究院的观点或立场。

本文约6500字,阅读全文需约20分钟。

未使用交易输出合并是指将存储在多个UTXO中的比特币价值合并为一个UTXO。这样可以减少你控制的UTXO的数量,同时使你的余额保持大致相同,从而在为了获得快速确认需要支付的时候,更有机会能够创建更小、更实惠的交易。

合并示例

把交易想象成一个矩形,其高度是它的费率,其长度是它的大小,其面积是它的总费用。例如,以下所示为一笔简单交易,它从一个P2WPKHUTXO花费到两个P2WPKH输出——一个输出给客户,另一个作为找零回到花费者那里。

大多数钱包最终都会遇到这样的情况,即它们在一个UTXO中没有足够的价值来支付它们想要花费的金额。这就要求它们通过花费更多的UTXO为交易增加更多价值。例如,让我们在示例交易中花费两个额外的P2WPKHUTXO:

尽管这似乎是一个很小的变化,但它几乎使我们的交易大小和成本增加了一倍。这就是合并发挥作用的地方。通过提前准备,我们可以把大型交易的三个UTXO,通过一笔自己发给自己的低费率交易,合并到一个UTXO。然后,我们可以在高费用交易中使用单个UTXO向客户付款,交易形式与上述第一个示例交易相同:

比较总成本,我们发现两次交易的版本比使用三个UTXO的单笔高费率交易便宜40%。即使两次交易的版本使用了更多的总区块空间,这也是可能的。

如果合并交易在你发送第二笔给客户的交易之前得到确认,那么,与单笔交易相比,客户不会遇到任何额外的延迟,因此你可以节省少量的钱而完全无需改变接收方的体验。

平均花费的UTXO

从前面的示例中,我们可以看出,当需要在一个交易中使用多个UTXO时,支出是低效的,而合并才有用。这对你来说有多频繁?如果你可以获取以下两个数据,则可以使用下面提供的简单公式估算每个交易使用的UTXO的平均数量。

转入——你的钱包从其他人处获得的输出数量。

转出——钱包创建的将比特币发送给其他人的交易数量。如果你使用批量付款,请注意,这是交易数量,而不是付款数量。为了提高精度,你可以在此总数中包括你期望在钱包为空之前进行的交易数量。

要计算每笔交易花费的UTXO的平均数量,请使用以下公式:

average_utxos=(转入+转出)/转出

之所以转出在除号的上下都有,是因为我们预期你创建的大多数交易,也会产生一个找零输出,把未使用的价值作为一个新UTXO返回到你的钱包。

上面等式的最小现实结果是1.0,这也是交易可包含的UTXO的最小数量。你的结果越是高于1.0,你将从UTXO合并中受益越多,这将在下一部分中看到。

预计节省

要估计使用合并可以节省多少,让我们看看一笔典型交易的总费用如何取决于它花费了多少UTXO。查看此图表时,请将x轴与你在上一节中计算的UTXO平均数量进行比较。

如果我们能使用仅支付上图所用费率的1/10的合并交易,将所有多余的UTXO合并为一个UTXO,会怎么样?然后,我们可以按足额费率只用一个UTXO去创建常规支出。将这些数据覆盖在上图的顶部,我们可以看到可以节省多少:

让我们以百分比的形式绘制节省的量:

显然,我们节省的实际金额将取决于用于合并的低费率和用于支付客户的较高费率之间的比率。使用本文附录中提供的数据,在撰写本文时,通常可以实现以下比率:

另一个会影响我们节省金额的事情是,为了花费每笔UTXO,我们需要向交易中添加多少数据;即交易输入的大小。对于P2WPKH,大约为每UTXO68vbytes;但是对于P2SH2-3多签,大约为294vbytes。假设我们将常规支出的费率统一为1/10,则各种常见脚本模板的节省为:

根据以上估计,我们预计,至少在某些时候,几乎所有活动的比特币服务都可以通过合并节省大量费用。例外情况是,UTXO的平均数量非常少,或者在快速费率和慢速费率之间的差额持续小的时候尝试合并的服务。

UTXO池

上面的示例假定你将从拥有n个UTXO变为仅有一个UTXO,但是,如果你需要广播一笔交易而你的交易其中一笔又没有被确认,那么这可能会造成问题。

从全节点的角度来看,UTXO有两种形式:已确认和未确认。已确认UTXO是最佳区块链上一笔交易的输出。大多数现有节点将始终接受第一眼看到的已确认UTXO的支出,前提是该支出是有效的,即支付了适当的费率,小于100000vbytes,并且遵循其他一些简单规则。

一个未确认UTXO是一笔仍在内存池里的交易的输出。为了防止针对节点内存池的DoS攻击,节点对使用未确认UTXO的交易设置了其他限制。这意味着,你无法保证能够在任意时间使用未确认UTXO。例如,在第一个交易被确认之前,钱包可能无法传播以下所示的第二个交易:

由于许多用户希望在请求付款后的几秒钟内就在钱包里收到新的未确认交易的通知,因此许多支出者不希望自己陷入这种状态:等待之前的一笔交易得到确认,而无法向网络提交新交易。这会导致这些花费者维护一个UTXO池——一套可以随时使用的已确认UTXO。

UTXO池不会显著影响前面所述的节省,因为你始终可以等到以后将池子合并为一个UTXO。但是,你在不同UTXO之间分配资金以确保即时可花费性的次数越多,你需要付款超出你控制的任何单个UTXO的价值的可能性就越大——这削弱了UTXO合并的费用节省。

如果你很少在UTXO池中遇到该问题,则可以忽略这种情况,因为它的效率很低。如果经常发生,则有几种选择:

1.通过保持输出数量相同并增加每个输出的价值,来增加UTXO池中输出的平均价值,从而总体上增加池子里的资金量。请注意,这还会增加你因盗窃或热钱包意外而蒙受的金钱损失。

2.通过保持总量不变但减少输出数量,增加UTXO池中输出的平均价值。你可以通过批量付款来减少在任何特定时间所需的UTXO数量来完成此操作。

3.如本章稍后所述,专注于创建不找零的交易。由于后面小节中所描述的原因,不找零的交易通常不如合并有效,但可以为你节省一些钱。当优化你的UTXO池以进行不变的交易时,你希望UTXO拥有各种金额,以便你有尽可能多的不同金额组合。

最佳合并大小

要合并UTXO,你要在交易中包含的数据不只是UTXO,还必须包括输出,该输出将资金返还给自己,并包含一些交易样板。你在单个交易中合并的UTXO越多,该交易的固定成本在UTXO之间的分配就越好,每个UTXO的成本渐近地接近其中一项输入的平均大小。

如上所示,通过同时合并额外UTXO所节省的金额并不是特别大,因此即使你不注意合并大小,也可以获得合理的效率。

冷钱包合并

某些服务在其钱包之间有着基本的职责划分。收到的客户存款或付款都将存入冷钱包。付款或提款是使用热钱包进行的。必要时,一个或多个工作人员将钱从冷钱包转移到热钱包。

一个简单的合并策略是将在一定时期内收到的所有UTXO都放到冷钱包里,然后将它们合并到一个UTXO。但是,你可能会想知道这是否产生了浪费,因为你可能最终在以后将单个UTXO拆分为热钱包UTXO池的多个UTXO。例如,如果将10个UTXO合并为1个UTXO,则将其转移回5个UTXO似乎效率很低。

但是,两种替代选项可能更糟。第一种替代选项是你不合并冷钱包。你只用等到需要转账到热钱包并执行合并。这最大程度地减少了区块链空间的使用——但所有这些空间都用在了单笔大型交易里。如果你需要交易进行快速确认——例如,因为你需要这笔钱才能动热钱包——你可能会为该交易支付高额费率,从而失去合并冷钱包的好处。

第二种替代选项是,将10个UTXO合并到冷钱包中的5个UTXO,然后将5个冷的UTXO转移到5个热钱包UTXO。在所有可用选项中,这将使用最多的区块空间。它以低合并费率创建了一笔大型交易,并以较高的费率创建了一笔中等规模的交易来把钱发送到热钱包。这使它成为表现最差的选项。

虽然最大程度地合并UTXO然后在以后进行拆分似乎有点愚蠢,但本节开头描述的简单合并策略确实可以提供最大的节省。

隐私问题

当你收到从未使用过的新地址的付款时,查看区块链历史的分析人员将不知道谁拥有该UTXO。但是,如果你将UTXO与他们已确定属于你的其他UTXO合并,则分析师可以做出合理的假设,即所有合并的资金均属于你。

因此,试图最大化自己的比特币余额或交易历史的私密性的用户不应使用本文档中描述的UTXO合并。以前使用过诸如混币之类的技术来将其UTXO的所有权历史与其他UTXO混合在一起的用户,尤其应该避免这种情况。

有可能在混币期间执行一种限量的合并,例如,在Joinmarket或Wasabi中的实现。此外,未来协议开发的构想,例如通道工厂或混合池,可能会使由多个人拥有的多个UTXO合并为一个UTXO,然后用于定期支出的情况变得更为普遍,使得分析者更不清楚谁拥有来自合并的币。

选择UTXO进行合并

你的目标是使用一个UTXO完成尽可能多的付款,因此你应该首先合并最低价值的UTXO。此外,通过确保每次选择接收到特定地址的UTXO时,还选择接收到同一地址的所有其他UTXO,可以减少隐私损失。例如,假设你想在下面的示例钱包中合并三个UTXO:

你应该选择abcdef:0,因为它是价值最低的UTXO。然后选择cdefab:0,因为它被发送到与abcdef:0相同的地址。最后,选择bcdefa:0,因为它是价值次低的UTXO。

关于选择相关UTXO的更多信息,请参阅BitcoinCore里的-avoidpartialspend配置选项。

合并与竞争技术

在使用UTXO合并的同时,无法有效地使用另一些节省费用的技术,因此以下小节将它们与合并进行了比较,同时突出了它们的优缺点。

不找零的交易

不找零的交易不包含找零输出,这使典型交易的大小减少了约31至43vbytes。尽管在仅花费一个UTXO的时候有可能创建一笔不找零的交易,但是,通常需要同时花费两个或更多UTXO才能产生一笔不找零的交易。这是因为,如果你愿意使用任意数量的输入,那么,可以在交易中包括的UTXO组合的数量会极大地有助于寻找一笔不找零的交易。

不找零的交易节省了区块空间和费用,因此强烈建议你使用。但是,与需要在同一笔交易中花费两个或多个UTXO的不找零交易相比,有效使用UTXO合并几乎总是可以节省更多的钱。这是因为,所有常用脚本的交易输入都比交易输出大得多,因此可以省略输出省下的成本并不能弥补必须包含额外输入的成本。

不找零的交易还会从你的钱包中删除一个UTXO,与UTXO合并一样,减少了你未来的交易费负担。节省下来的钱更难分析,因为通常你会凑整交易费来创建不找零的交易,从而增加支出费率。但是,即使我们忽略这一点,因为输入远远大于输出,所以,以较低的费率进行合并仍将比以较高的支出费率创建两个输入的不找零交易节省更多的钱。考虑一个示例:Alice和Bob分别收到10个UTXO。Alice将其UTXO合并为单个UTXO,费用为正常支出费用的1/10,然后发送五笔付款。Bob将自己的UTXO分开存放,并自己发送五笔付款,每笔付款都使用两个UTXO来按正常支出费率创建不找零的交易:

Alice的合并交易为679.25vbytes;她随后的五笔付款交易是136.50vbytes。Bob的五笔不找零的交易大小为169.25vbytes。

如果Alice和Bob都以相同的费率发送他们的付款交易,我们可以使用一些简单的代数来计算Bob进行合并交易所需的费率百分比,以便与Alice使用不找零的交易节省的钱相等:

719.25*x+5*140.50=5*177.25

x=0.26

总之,如果Alice能够以她通常花费费率的1/4或更低进行合并,她将比Bob省下更多的钱,即使她使用了比他多将近一倍的区块空间。本章附录中的费率数据表明,在我们粗略的假设下,超过96%的时间都有可能节省费用。

如果Bob需要为每个交易使用两个以上的输入来创建不找零的交易,即使Alice为合并交易使用了相应较高的费用率,她也可以节省更多的钱。

就是说,与合并交易相比,不找零的交易的明显优势在于,它们使支出者节省了区块空间并节省了适度的交易费,同时保留了他们的隐私以防上述「合并隐私」部分所述的问题。对于大多数个人消费者,甚至是花费不频繁的小企业而言,隐私优势对他们来说比合并节省的交易费更为重要。

预测性/有机UTXO管理

预测性UTXO管理是由BitGo提供的一种服务:「通过在高费率减少交易大小,同时在低交易费时自动清理和处理币的小片段,来降低总体成本。」这种技术的具体实现是专有的,但它可能类似于DmitryPetuhov所描述的有机UTXO合并。

此类技术消除了合并交易使用的额外区块链空间,从而使其可能更有效率并节省更多交易费。它可能更容易实现某些服务,因为不需要等待数小时或数天即可确认合并交易。此外,BitGo的预测性UTXO管理系统尤其似乎可以使用上一节中所述的不找零的交易实现部分节省,以及其中描述的额外的节省和隐私好处。

但是,在节省费用方面,对于希望在接下来的几个区块里确认其支出交易的支出者,UTXO合并通常会比预测性/有机技术节省更多的钱。这是因为,利用预测性/有机交易在区块链空间上省下的几十个字节,与能够通过在较低费率支出UTXO来节省很大比例的UTXO支出成本并不匹配。实际上,在前面的插图中对此进行了量化:

对于平均每笔交易花费两个或更多UTXO且可以按正常费率的50%或更少的价格进行合并的人,合并至少可以使成本达到收支平衡,并且可以轻松地比发送普通交易节省更多的钱。本章附录中包含的费率数据显示,在我们分析的2019年11月和12月期间,有99.85%的可能性为名义上的2个区块确认目标节省至少50%的费率。

同样,预测性/有机方法的确具有以下优势:与现有服务的合并相比,它的实现可能要容易得多,并且与不找零的交易相结合,可以实现适度的额外节省并增强隐私性。不过,专注于最大程度地节省费用的支出者可能会希望专注于UTXO合并。

增加交易费

节省最大的合并交易,应该以你认为允许交易在需要之前确认的最低费率发送。例如,如果你可以等待一周的时间来确认交易,那么你应该使用交易费估算工具的目标费率在1008个区块内进行确认。

但是,来让一笔先前发送的合并交易更快地确认,或者因为费率意外上涨,有时你可能需要增加其手续费。在这种情况下,你有几种选择:

对于从热钱包到热钱包的合并,你应发出BIP125信号,这样你可以使用费用替代来增加交易费,这是最有效的增加交易费类型。

对于从冷钱包发送到热钱包的合并,你可以轻松地使用「为父辈付费的子辈」来增加交易费。

对于从冷钱包发送到冷钱包的合并,你可能需要设计你的交易,以便它们始终包含支付给热钱包的少量输出。这样,你就可以通过热钱包使用CPFP收费功能,而无需重新打开冷钱包。但是,除非你打算把钱转到你的热钱包里,否则这种额外的输出可能会稍微降低合并效率。

结论

对于既频繁接收又频繁发送付款的组织来说,合并是省钱的最有效方法之一。它相对容易实现,如果做得好,收到你付款的人将永远不会注意到你正在这样做。

另见

AnthonyTowns的《田野报告:在Xapo合并了400万个UTXO》

MarkErhardt的《演讲:unspent管理与币的选择》

附录A:

下图显示了使用BitcoinCore的交易费估算的2个区块确认目标和1008个区块确认的目标,在一段时间内可用的预计节省。

下表总结了达到一定节省率的频率。我们看到,几乎总是可以通过等待一周来节省50%的费率,并且通常可以节省90%或更多。

我们使用上述的一周目标是因为,这是BitcoinCore的评估器所提供的最长期限,并且对于许多组织而言,等待一笔合并交易一周的时间来确认是很容易的。后续的有关费率估算和紧急权衡的章节将更详细地分析不同确认目标之间的费率差异。

-TheEnd-

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

链链资讯

[0:0ms0-3:3ms