本文是选币算法科普系列的第一篇,主要介绍了UTXO的概念,UTXO是“Unspent Transaction Output(未花费的交易输出)”的缩写,可以理解为“一块比特币”,一笔比特币交易有输入和输出,选币算法指的是在发起一笔链上比特币支付时,选出UTXO(或者说Coin)作为输入的过程。文章还介绍了选币算法的目标、著名的选币算法以及Bitcoin Core的选币算法。
作者:Anmol Sharma
本文为 选币算法科普 系列的第一篇。
UTXO 全称为 “Unspent Transaction Output(未花费的交易输出)”,是对 “一块比特币” 的技术描述。比特币被开发成类似现金的东西,所以 UTXO 就像用户用来购买商品和服务的硬币。
用更准确的技术词语来表述,一个 UTXO 是某一笔交易的其中一个结果。每一笔比特币交易都有一些 输入(被花费或者说被 “ 摧毁” 的硬币)和一些输出(被 “ 创建” 出来的新的硬币)。
举个例子,设想你的钱包丽有一个硬币( UTXO),面值为 5 万聪,而你想要买一杯价值 4 万聪的咖啡。你需要创建一笔交易,给咖啡店老板支付 4 万聪,然后给你自己支付 1 万聪(作为零钱)。所以,这笔交易会取得一个 UTXO,花费它( 摧毁它),然后创建出两个新的 UTXO。在这笔交易得到比特币区块链的确认之后,你的钱包将仅余一个面额为 1 万聪的硬币( UTXO)。
- 注意:在一笔交易中,被摧毁的 UTXO 的总价值必须超过或等于被创建的 UTXO 的总价值 -
选币算法指的是在发起一笔链上比特币支付时,选出 UTXO(或者说 硬币)作为输入的决定过程。
比特币钱包管理着用户的私钥。因此,钱包可以将私钥与其对应的 UTXO 相关联,形成一个 UTXO 池。一个 UTXO 池由其用户可以花费的所有 UTXO(硬币)组成。
选币算法是支付流程的重要部分。没有选币算法,用户就无法选出最合适的 UTXO,最终只能在一笔交易中使用所有的 UTXO,然后产生一个很大的 “零钱” 输出,并支付不必要的交易手续费。
选币算法是为经济性、速度和隐私性而优化比特币支付的重要流程。选币算法尝试实现如下一些目标:
因为区块空间是稀缺资源,矿工会在手续费率(聪/字节)基础上选择进入区块的交易,以最大化自己的收益。更高的手续费将提高交易被打包到下一个区块中的概率,因此可以更快确认。
用户也希望手续费代价尽可能低、交易刚好能进入区块就行。好的选币算法不仅要为当前的交易节省手续费,还应该考虑到长期的交易手续费。它应该趁着交易费率较低时花费更多的 UTXO 。
因为比特币区块链是一个公开的分布式账本,每个人都可以看到得到区块链确认的每一笔交易。有时候,这种模式会导致对金融隐私的侵犯。数据矿工和第三方观察者不应该能够获得用户的数据(比如总余额及其经济活动)。好的选币算法应该使用尽可能少的地址。
因为比特币是一个点对点的分不出网络,每个节点都必须维护一个 UTXO 集(包括所有人的 UTXO)。如果交易的输入数量能大于输出的数量,那就更好了。这意味着长期来看 UTXO 集的大小会缩减。随着比特币得到更多采用,跟踪 UTXO 集的大小非常重要。
上面提到的一些目标是有冲突的。例如,像尽可能少给交易费,又想让交易尽快确认,就是天方夜谭。一般来说,支付更多手续费才能缩短确认时间。因此,重要的是在这些目标之间找出平衡点。
以下是一些著名的选币算法:
当前的 Bitcoin Core 使用三种算法:分支界定法、Knapsack 和纯随机选取。这些算法的结果会基于 “ 浪费指标” 来对比,最终选出产生最少浪费的输入集。
“浪费指标” 是 Bitcoin Core 的钱包所用的、对比不同的可能输入集合并选出可以产生最小浪费分数的启发式方法。通常一笔交易都会有多种可行的输入集,浪费指标会基于手续费率、产生找零输出的成本和可选的余量(excess selection amount)选出最理想的输入集。(深入讲解请见本系列文章的 Part-5)。
在下一篇文章中,我们会深入讲解 分支界定选币算法 的机制。
(完)
- 本文转载自: btcstudy.org/2022/08/31/... , 如有侵权请联系管理员删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!