作者:CoinKite Team
来源:https://coldcard.com/learn/transaction-security/bitcoin-utxo-management
银行账户会记录一个不断变化的余额,但比特币的工作原理更像你的皮夹子中的纸币。区块链记录的是一个又一个单独的未花费的交易输出(UTXO),(可以理解成一个又一个钱币),每一个都表示一些比特币锁定在一个地址中。
在你的钱包软件上显示的余额,时机上是你的各个 UTXO 的面值之和。在你花费资金的时候,你要挑选出其中一些,作为要发送的交易的输入。然后,交易会产生一些输出:把比特币发送给收款方,可能也会产生找零,回到你自己控制的地址中。
在发送交易时,该怎么挑选 UTXO 呢?每一种挑选策略,都对手续费和隐私性有不同的影响;理解整个模式,可以让你的决策更精准。
什么是 “UTXO”?
一个 UTXO 就是一笔以往的交易产生的一个单独的输出,它的价值以 “聪” 为单位,并且带有一个锁定脚本,指明了满足什么条件才能花费这个钱币。它不是一个账户,也不是一个余额调整项。
在花费一个 UTXO 的时候,它会完全销毁掉。如果你持有一个面值为 0.05 BTC 的 UTXO,希望给别人支付 0.03 BTC,那么钱包软件所构造的交易会完全花掉这 0.05 UTXO 。它会产生一个价值 0.03 BTC 的支付输出,交给收款方;还有一个找零输出,将剩余的价值(减去手续费)发回你自己的一个地址。两个新输出本身都成为 UTXO 。
一个地址可以积累多个 UTXO —— 如果它收到了多笔支付,但如果你养成了不重复使用地址的好习惯,那么每个地址都只持有一个 UTXO 。(译者注:或者说,你的所有 UTXO 都将使用不同的锁定脚本,而不会出现多个 UTXO 使用相同锁定脚本的情形。)
在整个比特币的历史中形成的所有未花费输出的集合,叫做 “UTXO 集”。一个装有 10 个小面额 UTXO 的钱包,跟一个装有 1 个大面额 UTXO 的钱包,即使总的价值完全一样,也是不同的。花费 10 个 UTXO 需要给交易使用 10 个输入、需要 10 个签名,因为数据量更大,交易的体积就会更大,然后需要支付的手续费也会更多。
UTXO 的管理有何意义?
积累 UTXO 的方式,以及选择它们来花费的方式,会影响交易手续费、链上隐私性和钱包卫生。
- 手续费后果:交易每多一个输入(假定是原生隔离见证 P2WPKH 类型),就要多占用大约 68 虚拟字节(vBytes)。同样的支付数额,花费 10 个输入,相比只花费 1 个输入,要多占用 670 虚拟字节。如果这时候网络的手续费率是 50 聪/虚拟字节,就要多花 33,500 聪在手续费上。输入的数量是发送者最直接能控制的部分。
- 隐私性后果: 当一笔交易中出现两个 UTXO 作为输入时,观察比特币区块链的人,包括区块链分析公司,可以假设这两个地址是由同一个人控制的。也许其中一个 UTXO 是从某个 KYC 交易所取出的、另一个 UTXO 则来自未知的来源,但因为这一笔交易,这两个 UTXO 留下了永久的关联记录。这种联系的信息,一旦交易被广播就无法抹去。
- 粉尘:UTXO 可以用作交易的输入,但因为它们本身要占用数据空间,因此本身就要支付一些手续费。当花费一个 UTXO 的手续费 超过 了这个 UTXO 的价值,那么花费它就不值当了。花费起来不值当的 UTXO ,就被叫做 “粉尘”。
比如说,一个 UTXO 价值 200 聪,但当网络的手续费率了来到 10 聪/虚拟字节,那么添加它(一个 P2WPKH 输出)作为输入就要多支出 680 聪的手续费。为了花费它而需支出的手续费,是它本身的价值的三倍,所以它在这一刻实际上是没有价值的。
一个价值 5,000 聪的 UTXO,在今天,在较低费率的环境下,是有价值的,但如果手续费率一直升高而不回落,它也有可能变成粉尘。随着比特币采用率的增加,而区块空间一直这么稀缺,那么手续费率可能会高居不下。今天看来可以花费的小额 UTXO,也许未来会变成粉尘,其中的聪会永久锁定。
粉尘有时候也被用作一种故意的监视手段。第三方可能会发送少量价值到你的地址中,专门看你会跟哪些别的 UTXO 一起花费这个 UTXO,从而了解你的钱币之间的联系,并破解你的匿名性。
UTXO 管理的最佳习惯?
一些习惯会显著影响你要支付的手续费、隐私性和长期可花费能力。在 Sparrow 这样的钱包软件中,这些习惯可以通过一项叫做 “钱币控制(coin control)” 的特性来执行。
避免粉尘和小额 UTXO
小面额的 UTXO 会在手续费率高企时变得不值得花费。价值 10,000 聪的 UTXO 也许今天是值得花费的,但在手续费率持续升高的环境中,使用它作为输入要额外支出的手续费就已经接近其本身的价值。如果资金用意用于长期存储,那么让 UTXO 的价值高于一个门槛,将确保它在手续费升高时依然可以花费。 许多从业者认为这个门槛是大约 1,000,000(100 万)聪,或者说 0.01 BTC 。如果你收到了意料之外的粉尘,请在你的钱包软件中冻结它,防止自己意外将它用作输入。
避免面额太大的 UTXO
用一个面额巨大的 UTXO 来持有你所有的比特币,会在花费的时候产生隐私性问题。花费交易会把这个 UTXO(以及其价值)暴露给所有观察区块链的人,而返回给你自己的找零输出会被跟踪。把它打散成多个面值不等的 UTXO ,会给你更多的灵活性,并减少单笔交易所暴露的信息。
保留多种 UTXO 面额
在钱包中保留多种面额的 UTXO ,可以在花费的时候给你一些选择。如果每个 UTXO 都是一样的面额,那么用作输入时往往要么不足以支付,要么产生找零。多样的面额更容易匹配支付的需要、减少找零输出,从而交易的体积更小、手续费也更低。
将钱币的来源分清楚
不同来源的 UTXO 有不同的隐私性情形。从需要 KYC 的交易所得到的比特币是跟你的真实身份有关联的,而私密地取得的比特币就没有。将它们结合在同一笔交易中,会在链上产生它们有联系的信息,永久地摧毁两者的区别。
实用技巧是给它们打标签。在收款时,给每一个 UTXO 附带一个简短的描述(“交易所取款”、“私人买卖”、“挖矿收益”),这样你就知道它们的来历。在 Sparrow Wallet 中,UTXO 栏目中的每一个 UTXO 都有自己的标签、面额和年龄。钱币控制功能可以让你在花费时手动挑选输入,在你需要保持隔离时,避免自动挑选算法将它们混在一起。
在低手续费时汇聚钱币
将多个小面额的 UTXO 在一笔交易中花费、支付给自己,就能产生数量更少、面额更大的输出。这可以减少未来需要包含在交易中的输入的数量,并简化钱币挑选的决策。在低手续费率环境下归集钱币是最划算的:汇集 20 个 UTXO,在 5 聪/虚拟字节的环境下,相比 50 聪/虚拟字节的环境下,损耗(手续费)要少得多。周末和非高峰时段的手续费率往往更低。
只汇集同一来源的 UTXO,这样才能保护隐私性!将 KYC 过的 UTXO 跟没有 KYC 的 UTXO 结合在一笔交易中,会让它们永远被当成有联系的,不论你这笔交易是汇集还是做别的。
避免重复使用地址
用同一个地址多次收取支付,会让这些 UTXO 都关联到一个公开可见的标识符(地址)。任何观察区块链的人都能看出这些支付都是发送给同一个地址的,并看到余额的总和。给每一笔入账交易安排一个新地址,就可以避免这种关联。绝大部分当代的钱包软件都会自动生成新地址。
如何避免地址复用,在《避免地址复用》一文中有述(中文译本)。
使用更加高效的地址格式
地址格式会影响一个输入在花费时要占用多少区块空间。较老的地址格式(比如 P2PKH,以数字“1” 开头的地址)会占用很大的空间,因此要支出更多手续费。原生的隔离见证地址(P2WPKH,以字符 “bc1q” 开头的地址)和 Taproot 地址(P2TR,以 “bc1p” 开头)使用更加高效的编码,占据空间更小,花费起来手续费也更低。在建立新钱包时,选择隔离见证或者 Taproot 地址格式,可以减少未来所有交易的手续费开支(相比使用较老的地址格式)。
(完)