Author

Topic: [20150518]优化未使用输出选择的挑战 (Read 435 times)

hero member
Activity: 658
Merit: 500
当我们谈论被存储在块链中的比特币时,大多数人会称之为“比特币地址余额”,从会计的角度上这样说是有意义的,然而事实上这不是硬币在区块链数据结构上的呈现方式。不是一个地址包含了币,“币”实际上是存储为“未交易输出”( UTXOs)。一个UTXO可以与一个比特币地址相关联,尽管你也可以有许多不同的UTXOs与同一个比特币地址相关联。“地址余额”是所有与地址相关的UTXOs值的总和。从非技术的角度了解UTXOs,我推荐你阅读Richard Gendel Brown的“欢迎到比特币岛”。如果想大致了解技术方面的东西,就看看开发者指南。

1-5uICL2T5PLZ4arzHXlA6sQ

(交易由输入和输出组成;未使用输出是实际的比特币)

当比特币钱包软件创建新的交易时,它有安排交易内部数据的同等灵活性。这是因为用户指示钱包:“将 X个比特币发送到地址Y中”,钱包需要梳理用户的UTXOs以便发现足够的输出,即总价值能够达到X个比特币。不幸的是,在选择UTXOs的方式上,没有一个简单而又易懂的方式,因为需要做几种考虑。

天真的方法就是直接寻找最小的输出,数量大于你想花费和使用的量,不然的话,就添加下一个最大的输出,直到你有足够的输出以满足目标的花费。然而,这会导致输出被分裂,并直到钱包里充满了不能再使用的小余额。这可以是一个性能问题,如果用户曾经试图清除只有一笔小小的余额的钱包 ,那么这也可以起到终止用户的作用。这个钱包已被用于许多交易,并且可能已经导致了大量的UTXOs,而把这些UTXOs都花在一个单一的交易中是不可行的。

虽然一笔比特币交易可以包含成百上千个输入和输出数,但这是有代价的。一笔交易拥有的输入和输出越多,这个交易的规模就越大。在写入时,比特币的节点将拒绝超过100KB的交易。同时,由于块的大小是有限的(目前为1 MB)你与其他人共同竞争,去使你的交易得到矿工的确认,矿工会将你的交易加入到一个区块中。如果你广播了一笔无费用或费用微不足道的交易,你将会承担下面两点风险,1.即节点拒绝广播这笔交易 2.矿工选择取消确认它,转而去确认每个字节交易费用更高的数据。供参考,我跟踪了一些交易和费用的指标 -在这里你可以看到,在写入时的平均费用是每个字节 30聪。

1-6YlVIjt5PJAZ7uPOf1niWg

(交易数据的大小和费用支付)

如果我们要优化算法,钱包要通过这个算法来选择UTXOs建立交易,那么我们必须要确定我们的目标是什么,我们想要优化的交易属性是哪些?我可以想象出的优化UTXO选择的三大目标如下:

1.防止区块链膨胀:

A)如果可能的话,尽量避免创造小的找零输出。因为它们会为钱包以及每个摄取区块链的人产生性能成本。他们也可以因为小额规则和市场竞争而产生费用,这样对于终端用户来说,费用变得更高。

B)小UTXOs的整理:自然地,经过一段时间,钱包就会产生许多小的UTXOs。为了降低钱包的UTXO集合的大小,以及整个区块链的UTXO集的大小,最好是在一笔交易中就花掉许多非常小的UTXOs,以便将它们从UTXO集合中删除。

2.隐私:

A)    UTXOs应该进行非确定性选择,并且多用几个不同的公钥。当钱包选择一个UTXO,分配到同一个公钥的其他UTXOs应优先被选择。

B)    小的输入——比找零输出还要更小,并且没有与一个更大的输入共用一个公钥,那么就不要使用它们,因为这些小的输入会增加交易费用,减少隐私。

C)   如果要创建一个找零输出,那么最好是创建一个其价值与支付价值相同的找零输出。这有助于模糊哪一个输出进入了接受者那里,哪一个是返回给了发送者。

D) 应该把找零输出插在一个随机的位置,因为交易有许多的输出,而且并不总是处于第一个位置或最后一个位置上。

3.减少交易费用:

A)当发送所花的费用少时,应首选交易输入集合。这意味着交易的数据大小要尽可能简单,尽可能小,并且几乎没有输入和输出。优先考虑只使用一个单一的UTXO作为交易的输入。

B)以币龄来优先选择UTXOs ,通过发送足够老的金币,足够大的交易将有资格被矿工确定为“高优先级的”,且没有附加费用。

C)如果花费UTXO的成本(通过要求的附加费)比交易输出更高,就不要添加这个UTXO。

真实世界的钱包怎么运行的?比特币核心钱包使用一些相当复杂的逻辑:

1.如果任何一个UTXO与目标(花费价值)匹配时,这个UTXO将被使用。

2.如果所有UTXOs的总和小于目标,但是恰好匹配目标时,这些UTXOs将被使用。(这可以在扫描钱包的时候防止出现错误。)

3.如果所有UTXO的总和小于目标,也不超过目标,那么比目标要大的最小的UTXO将被使用。

4.比特币核心把UTXO进行1000次的随机结合,直到他们的总和大于或等于目标。如果碰巧找到一个精确的匹配,它就较早的停止并使用它。关于这一步的推理,代码中也指出了:“这是随机的,不能起到真正的安全作用,仅仅是用来防止退化行为。”

5. 否则最后落定的要么是大于目标的最小UTXO,要么是步骤4中最小的UTXO组合。

6.当构建最终的交易时,如果任何找零输出足够小,被认为是“灰尘”,而不是创建输出,那么比特币核心会将它们剔除出去,把价值捐给矿工作为交易的一部分费用。

优化比特币核心的逻辑来减少找零输出的大小,即 上面列出的目标1A。这是选择UTXOs 的“最好”或“正确”的方法吗?这取决于你的视角——如果你重视隐私,减少交易费用,或者UTXO整合,那么它就是次优的。

1-pgWIGUYxxRTjRTBcdq-UPg

(UTXO集合的大小相对于未使用输出的数目,比例在增长)

很明显,在解决这一问题上没有一个万能的办法,事实上,上述三大优化目标所走的方向是相反的。鉴于这三大不相容的目标,钱包作者认为终端用户在选择钱包的UTXO的算法上会有更多的控制权。对高级用户来说,它是一种先进的功能,但是当用户在“费用/性能/隐私”之间选择一个来优化时,我可以想象用户会妥协以追求平衡。

这些选择取决于钱包工程师(我称它们为区块链的好管家)。我们将数据写入的是一个共享资源,因此我们最好要谨慎。在写入时,有17.6 UTXOs需要596 MB的数据来存储。如果比特币的人气继续上升,这些数据也一定会上升。但在细心的区块链工程师的监督下,至少可以防止UTXO集的增长速度超过所需。

----
原文:https://medium.com/@lopp/the-challenges-of-optimizing-unspent-output-selection-a3e5d05d13ef
作者:Jameson Lopp
译者:比比特
稿源: http://www.8btc.com/optimizing-unspent-output
Jump to: