29

金色荐读丨一文读懂UTXO合并

 4 years ago
source link: https://www.jinse.com/blockchain/576951.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

David A. Harding 文

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

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

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

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

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

合并示例

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

BfaArei.jpg!web

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

UrEFJ3i.jpg!web

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

fMfARbb.jpg!web

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

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

平均花费的 UTXO

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

  • 转入(incoming) ——你的钱包从其他人处获得的 输出数量

  • 转出(outgoing) ——钱包创建的将比特币发送给其他人的 交易数量 。如果你使用批量付款(payment batching, https://github.com/bitcoinops/scaling-book/blob/master/x.payment_batching/payment_batching.md),请注意,这是交易数量,而不是付款数量。为了提高精度,你可以在此总数中包括你期望在钱包为空之前进行的交易数量(即,你当前的钱包余额除以交易的平均转出)。 

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

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

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

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

预计节省

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

UFZBbmu.jpg!web

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

6vyeayI.jpg!web

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

26JFRnR.jpg!web

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

feyiiqA.jpg!web

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

by2iAv6.jpg!web

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

UTXO 池

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

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

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

tx0                             tx1

---                             ---

钱包UTXO → 客户 Alice UTXO

客户 Bob UTXO

钱包UTXO(找零) → 客户 Charlie UTXO

钱包UTXO(找零)

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

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

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

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

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

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

最佳合并大小

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

riiuu27.jpg!web

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

冷钱包合并

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

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

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

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

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

隐私问题

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

1(Alice) \

\

2(???)  -----> 6(Alice)

/

3(???) - -/

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

有可能在混币期间执行一种限量的合并,例如,在 Joinmarket 或 Wasabi 中的实现。此外,未来协议开发的构想,例如通道工厂(channel factories, http://devbcop/en/topics/channel-factories/)或混合池(joinpools, https://freenode.irclog.whitequark.org/bitcoin-wizards/2019-05-21#24639483;),可能会使由多个人拥有的多个 UTXO 合并为一个 UTXO,然后用于定期支出的情况变得更为普遍,使得分析者更不清楚谁拥有来自合并的币。

选择 UTXO 进行合并

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

出口点

接收地址

价值(BTC)

abcdef:0

bc1qfoo

0.1

bcdefa:0

bc1qbar

0.2

cdefab:0

bc1qfoo

0.3

defabc:0

bc1qbaz

0.4

efabcd:0

bc1qquux

0.5

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

关于选择相关 UTXO 的更多信息,请参阅(https://bitcoinops.org/en/newsletters/2018/07/31/#bitcoin-core-12257)Bitcoin Core 里的 -avoidpartialspend 配置选项。    

合并与竞争技术

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

不找零的交易

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

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

类型

输入 vbytes

输出 vbytes

比率

P2PKH

148

34

23%

P2WPKH

68

31

46%

2-3 P2SH

294

32

11%

2-3 P2WSH

104

43

40%

P2TR(建议)

57

43

75%

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

eIFnaqn.jpg!web

Alice 的合并交易(十个输入和一个输出)为 679.25 vbytes;她随后的五笔付款交易(每笔一个输入和两个输出)是 136.50 vbytes。Bob 的五笔不找零的交易(每笔两个输入和一个输出)大小为 169.25 vbytes 。

如果 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 提供的一种服务:“通过在高费率减少交易大小,同时在低交易费时自动清理和处理币的小片段,来降低总体成本。” https://www.businesswire.com/news/home/20180726005483/en/BitGo-Introduces-Predictive-UTXO-Management-Delivering-30 这种技术的具体实现是专有的,但它可能类似于 Dmitry Petuhov 所描述的有机 UTXO 合并(https://www.reddit.com/r/Bitcoin/comments/9kxn01/organic_utxo_consolidation_in_the_course_of/)。

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

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

feyiiqA.jpg!web

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

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

增加交易费

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

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

  • 对于从热钱包到热钱包的合并(或从热钱包到冷钱包的合并),你应发出 BIP125 (https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki)信号,这样你可以使用 费用替代 (Replace-by-Fee, RBF)来增加交易费,这是最有效的增加交易费类型。  

  • 对于从冷钱包发送到热钱包的合并,你可以轻松地使用“为父辈付费的子辈”(Child-Pays-For-Parent, CPFP)来增加交易费。

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

结论

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

另见

  • Anthony Towns 的《田野报告:在 Xapo 合并了 400 万个 UTXO》(https://bitcoinops.org/en/xapo-utxo-consolidation/)

  • Mark Erhardt 的《演讲:unspent 管理与币的选择》(https://www.youtube.com/watch?v=hrlNN3BSB6w&feature=emb_logo)

附录 A:

下图显示了使用 Bitcoin Core 的交易费估算的 2 个区块确认目标(约20分钟)和 1008 个区块确认的目标(约 1 周),在一段时间内可用的预计节省。

jmUZzyy.jpg!web

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

|    节省   | 可能时间的百分比 |

| 50.00%| 99.85 |

| 75.00%| 96.25 |

| 90.00%| 87.35 |

| 96.00%| 35.80 |

| 98.00%| 1.45 |

| 99.00%| 0 |

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

- The End -


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK