比特币钱包显示的余额,底层其实是UTXO的总和

比特币钱包告诉你“你有 10,000 聪”,这句话并不对应链上某个写着你的名字、余额为 10,000 的账户。按照比特币开发者文档的口径,它真正的含义是:你有 10,000 聪正躺在某一个或多个 UTXO 里,等待被花费。UTXO 即“未花费交易输出”(Unspent Transaction Output)。比特币开发者文档中关于交易结构的说明指出,钱包余额从来不是一笔存款,而是一组可用“零钱”(比喻)的加总。

钱包余额、UTXO、聪数总和
本文涉及的概念与核对环节。

要理解这一点,得先看一笔交易的构造。每笔比特币交易至少有一个输入和一个输出。输入负责花费此前某笔交易付给某个输出的聪,输出则作为新的 UTXO 存在,直到被后续的输入花掉。开发者文档用一个直观的例子说明:钱包显示 10,000 聪余额时,实际是这 10,000 聪分散在一个或多个 UTXO 中。也就是说,钱包界面上的那个数字,是它对属于你的所有 UTXO 金额做的一次求和展示,而不是链上真实存在的“余额字段”。

每个输出都带有位置索引和以聪计的数量,并附带一个条件化的公钥脚本;谁能满足该脚本的条件,谁就能花费这笔输出所支付的聪。输入则通过交易标识符(txid)和输出索引号(常写作 vout)锁定要花费的那个具体输出,再用签名脚本提供满足条件的参数。这套机制决定了“花钱”在比特币里不是从余额里扣数,而是挑选并消耗已有的 UTXO,同时生成新的输出。

由此可以推出一个常被问到的现象:为什么钱包里明明有余额,一笔转账却可能同时动用多个 UTXO?按交易结构,一笔交易的输入可以引用多个 UTXO,当这些输入金额之和超过支付目标时,剩余部分会作为一个新输出,回到自己控制的脚本下。反过来,如果某个 UTXO 金额较大,花完后剩余部分同样会以新 UTXO 的形式回到你的地址上。理解“UTXO 总和”这个底层模型,就能明白钱包余额的变动,本质上是属于你的可花费 UTXO 集合的增减,而不是某个数字被加减。

需要说明适用范围:以上内容依据比特币开发者文档对交易结构的描述,属于通用原理层面的解释,不涉及具体钱包软件的实现差异,也不涉及钱包安全或备份问题。文档在讲解交易各部分时为简化起见,假定 coinbase 交易不存在;coinbase 交易只能由矿工创建,是许多规则的例外,本文同样不展开。至于 UTXO 的金额如何被脚本条件约束、输入如何精确指向某个输出,上述 txid 与 vout 的对应关系已经给出了答案:钱包的“余额”,始终只是这些待花费聪数的合计。

原始资料

developer.bitcoin.org

上一篇 比特币是什么东西:一笔旧交易为何牵动之后所有区块