术语表 /交易与手续费
UTXO
又称未花费交易输出。
- UTXO 是什么?
- UTXO 是位于某个地址上的一笔未花费比特币,由此前的某笔交易整笔创建,只能整笔花费,不能只花费其中一部分。
比特币没有账户,也没有余额。每个节点转而跟踪一组有效的未花费输出,您钱包的余额就是其持有密钥所对应的那些输出之和。花费会销毁您选定的币,并铸造新的币,因此转移100,000聪的成本可能高于转移10,000,000聪。
运作方式
账本是一组币的集合,而不是账户总额的表格。每个输出记录两项内容:以聪计的金额(存储为8字节数字),以及一段锁定脚本,注明解锁该输出须出示的内容。在被花费之前,该输出始终留在未花费集合中,每个全节点都持有这一集合,并逐区块更新。
一次花费就是先销毁、后创建。您的钱包选取完整的输出作为输入,证明自己能够解锁它们,并写入新的输出。不存在原地扣减,因此用一枚1 BTC 的币支付0.3 BTC,意味着为收款方创建一枚0.3的币,并为您自己创建一枚约0.7的找零币。您最初的那枚币会永久从集合中消失,原先的一个条目变成了两个。
Bitcoin Core 将整个集合保存在名为 chainstate 的 LevelDB 数据库中,并将其中一部分缓存在内存里,-dbcache 默认为1,024 MiB,内存不足4 GiB 的设备上为450。当一笔付款到达时,节点要回答的唯一关键问题是:这个输入所指向的东西是否仍然存在?回答它所依据的是这个集合,而不是区块存档。修剪节点可以丢弃数百 GB 的旧区块,仍能完美地验证,因为未花费集合就是状态。
边缘处有两个奇特之处。2009年1月3日创世区块的 coinbase 所支付的50 BTC 从未写入数据库,因此永远无法花费。在2010年,BIP30 尚未强制执行之前,有两笔 coinbase 交易与此前的交易重复并将其覆盖,从集合中抹去了100 BTC;禁止重复交易标识符的规则正是因这些区块而设。
新挖出的币同样处于锁定状态。coinbase 输出在100个区块内无法花费,约16小时,这是协议自身针对短期链重组设置的防范措施。
为何这对购买比特币很重要
从交易所每提币一次,您的钱包里就恰好新增一枚币,因此您持仓的形态取决于您点击该按钮的频率。每周购买、每周提币,一年后会留下52枚币;同样的购买改为每季度提币,则只留下4枚。Swan 和 River 都围绕这一点安排定期购买,在达到阈值时才触发提币,而不是每笔订单都触发,原因在于算术:日后花费其中每一枚币,约占用68虚拟字节的区块空间。
第二个后果是来源。币不是匿名的现金。它带有创建它的那笔交易的历史,从任何验证身份的平台提币(本站评测的几乎所有交易所都属此类),都会产生一枚在合规数据库中记录为您所有的币。通过 Relai 购买(直接发送到您自己的钱包),同样会留下这样的记录。之所以能把这类币与从其他渠道获得的币分开保管,只是因为它们从一开始就是各自独立的对象。
第三,恢复钱包并不会恢复币。助记词重新生成的是密钥;随后软件还须在链上搜索这些密钥能够解锁的输出。如果使用了不常见的派生路径,或在不检查您地址类型的软件中恢复,币仍安全地留在未花费集合中,而您的余额却显示为零。把输出描述符与助记词一并保管,可避免这样一个惊慌失措的下午。
跟踪一笔0.02 BTC 的购买在集合中的走向
在 Kraken 购买0.02 BTC 并提币。交易所会将您的出款与其他客户的合并成一批,该批次中价值2,000,000聪的一个输出被锁定到您的地址。您的钱包此时持有一枚币。
两个月后,您向某人支付500,000聪,此时下一区块费率为5 sat/vB。花费一个原生 SegWit 输入并创建两个输出约需141虚拟字节,因此手续费为705聪。三件事同时发生:那枚2,000,000聪的币离开未花费集合,为收款方出现一枚500,000聪的币,并在您的钱包控制的新地址上出现一枚1,499,295聪的找零币。
您的余额从2,000,000聪变为1,499,295聪。全局集合增加了一个条目,这是每个人每次付款都要付出的无形成本,也是节点需要数据库而不是电子表格的原因。
UTXO vs 交易输出
每个 UTXO 都是交易输出;而大多数交易输出早已不再是 UTXO。输出是历史中永久的一行记录,十年后仍可在承载它的区块中读取。UTXO 则是对当下的一项权利主张。一个输出一旦被花费,就会从未花费集合中移出,但会永远留在链上,这一差别正是节点可以丢弃旧区块、却永远不能丢弃当前状态的原因。
UTXO vs 粉尘
粉尘是存在经济性问题的 UTXO,并不是另一类对象。属于未花费集合,并不能说明一枚币是否值得移动。一个600聪的输出与一个6 BTC 的输出同样有效,但在30 sat/vB 的费率下,花费它的输入约需2,040聪,是其所含金额的三倍多。这就是钱包可能显示出一个无法完全花费的余额的原因。