UTXO 是之前的交易创建、但还没有花费的一笔金额,名称是 Unspent Transaction Output 的缩写。钱包可能只显示一个总余额,但背后其实有多个独立 UTXO,就像口袋里的现金由几张纸币组成。付款时,钱包会选择使用哪些 UTXO。同一个地址可以接收多笔付款,因此也可以有多个不同的 UTXO。
你有两个 UTXO:70 000 sat 和 50 000 sat,总计 120 000 sat。Sat 是比特币的最小单位。要支付 90 000 sat,并付出 1 000 sat 手续费,钱包可以同时使用这两个 UTXO。它会创建一个给收款人的 90 000 sat 输出,以及一个返还给你的 29 000 sat 输出。两个旧 UTXO 都会被完整消耗,里面不会留下零头。这类似于用纸币付款后收到找零,只是金额不局限于固定面额。即使两个新输出发到同一个地址,它们也仍然是两个独立 UTXO,不会自动合并。 [2]
钱包把它跟踪的输出加总,但不一定能立即花费每一个。Watch-only Wallet 只观察付款,本身不持有签名所需的私钥。另一个输出可能被锁定到某个时间。区块中第一笔交易 Coinbase Transaction 产生的奖励,需要先达到规定的成熟度。还有一些很小的金额,技术上虽然能花,在高手续费时却可能花费成本超过本身价值。资金是否可用、是否有权花费,以及花费是否划算,是三个不同的问题。 [1]
每使用一个 UTXO,交易就增加一个输入,通常也增加数据量。在相同费率、相近输入类型下,花费很多小额 UTXO 比花费一个大额 UTXO 更贵。Coin Control 可以让你手动挑选具体的 UTXO。整合,也就是把它们合成数量更少、金额更大的 UTXO,可以缩小未来交易,但今天需要支付手续费。它也影响隐私:合并输入可能让观察者推测它们由同一个人控制。这不是绝对可靠的证据,但仍意味着,不应自动合并那些你希望保留独立历史的资金。 [2] [4]
只有地址还不够。每个输出由一对信息确定:交易标识符 txid,以及输出在这笔交易中的序号。这一引用称为 outpoint。输出记录包含以 satoshi 为单位的金额和 scriptPubKey,也就是花费条件。对于已确认输出,节点还保留创建它的区块高度,以及它是否来自 Coinbase Transaction,以检查成熟度和时间限制。知道地址或 outpoint,只是能指出一条记录,并不代表有权花费其中的资金;仍然必须满足花费条件。 [1] [2]
已确认的 UTXO 集对应一段结束于某个具体区块的历史。节点也可以考虑自己的 mempool,即未确认交易的等候区:一些已知输出在那里已经被花费,同时又有新输出产生。网络接受另一条有效历史分支的重组,也可能改变状态。Bitcoin Core 提供 gettxout 命令用于技术检查,选项 include_mempool 决定是否计入待处理交易。返回 null 只表示在这个视角下,输出不能作为 UTXO 使用;它本身无法区分从未存在的输出与已经花费的输出。因此,比较结果时,要同时考虑节点状态和查询方式。 [3]
完整花费一个输出
钱包选择一个价值 1 000 000 sat 的 UTXO 来支付 600 000 sat。手续费为 1 500 sat 时,交易创建一个 600 000 sat 的付款输出和一个 398 500 sat 的找零输出。原 UTXO 被完整花费。
要获得更完整的理解,请将本词条与以下词条结合阅读: 交易, Full Node, Private Key, 钱包, Mempool. 反向关联还来自: Full Node, 交易, Private Key, 钱包.
01UTXO 与钱包余额相同吗?+
不同。UTXO 是一个具体输出;钱包根据所跟踪输出的状态计算余额。显示的总额不一定都能立即花费。网络跟踪的是输出及其花费条件,而不是一个可变的账户余额。
02为什么许多小额 UTXO 会增加手续费?+
每个选中的输入都会增加数据。在输入类型和其他输出相近的情况下,花费许多小额 UTXO 比花费一个较大的 UTXO 占用更多虚拟字节。因此,在相同 sat/vB 费率下,总手续费通常更高。