在 BSV 中,花钱就是消耗旧 UTXO、创造新 UTXO

在 BSV 中,花钱不是修改余额,而是消耗旧 UTXO、创建新 UTXO。理解这一点,有助于掌握付款、找零、交易链以及 token 和应用状态转移的基本逻辑。

林知衡

林知衡

technical_editor

发布于 2026年5月26日12 分钟阅读

在 BSV 中,花钱并不是“修改账户余额”,而是通过一笔交易消耗旧的 UTXO,并创建新的 UTXO

这句话是理解 UTXO 模型的核心。无论是普通付款、找零、交易链,还是 token 与应用状态转移,都可以从这个动作展开理解。

UTXO 不是账户余额

在账户模型中,转账通常可以理解为修改余额:

TEXT
1Alice: 100 -> 70
2Bob: 0 -> 30

但 UTXO 模型不是这样工作。

如果 Alice 有一个 100 satoshis 的 UTXO,想给 Bob 支付 30 satoshis,那么系统不会把这个 UTXO 的金额从 100 改成 70。相反,交易会:

  • 把 Alice 的 100 satoshis UTXO 作为 input 消耗;
  • 创建一个给 Bob 的 30 satoshis output;
  • 创建一个给 Alice 自己的找零 output;
  • 留出手续费。

交易确认后,原来的 UTXO 会被标记为已花费。Alice 以后能继续使用的,不是“被改小的旧 UTXO”,而是新创建的找零 UTXO。

一个具体例子

假设 Alice 当前有一个 UTXO:

TEXT
1UTXO A: 100 satoshis

Alice 要给 Bob 30 satoshis,交易手续费为 1 satoshi。交易结构可以简化为:

YAML
1input:
2 - UTXO A: 100
3
4outputs:
5 - Bob: 30
6 - Alice change: 69
7
8fee:
9 - 1

交易确认后,结果是:

  • UTXO A: 100 被花费,不能再次使用;
  • Bob 得到一个新的 30 satoshis UTXO;
  • Alice 得到一个新的 69 satoshis 找零 UTXO;
  • 矿工获得 1 satoshi 手续费。

因此,整个过程不是“把 Alice 的余额从 100 改为 69”,而是“消耗一个旧 UTXO,创建两个新 UTXO,并留下手续费”。

为什么旧 UTXO 必须整体消耗

可以把 UTXO 理解为一张纸币。你不能直接把纸币上的面额改小,只能把这张纸币交出去,再拿回找零。

UTXO 模型也是类似逻辑:一个 UTXO 要么未花费,要么已花费,不会被部分修改。

这种设计带来几个重要特性:

  • 交易历史清晰;
  • 每个 UTXO 的来源可以追溯;
  • 双花检查更明确;
  • 更容易进行并行验证;
  • 状态转移可以通过交易链表达。

同时,它也要求开发者和钱包处理更多细节,例如找零、UTXO 选择和 UTXO 碎片化。

一笔交易可以消耗多个旧 UTXO

交易不一定只有一个 input,也不一定只有一个 output。它可以同时消耗多个旧 UTXO,并创建多个新 UTXO。

例如,Alice 的钱包里有三个 UTXO:

TEXT
1UTXO A: 20
2UTXO B: 40
3UTXO C: 50

现在需要支付 90 satoshis,手续费为 2 satoshis。钱包可以选择消耗 A、B、C,总输入为 110 satoshis,然后创建:

TEXT
1收款人: 90
2找零: 18
3手续费: 2

交易完成后,A、B、C 三个旧 UTXO 都会被花掉。收款人的 90 satoshis output 和 Alice 的 18 satoshis 找零 output 会成为新的 UTXO。

找零不是实现细节,而是模型的一部分

很多新手会把找零看成钱包的实现细节。但在 UTXO 模型中,只要 input 总额大于目标付款和手续费,剩余金额就必须通过新的 output 找回。

如果没有创建找零 output,input 和 output 之间的差额就会变成手续费。

因此,手动构造交易时必须明确这个等式:

TEXT
1input 总额 = 收款 output + 找零 output + fee

这也是开发 BSV 应用时必须理解的基础规则。

新 UTXO 可以继续形成交易链

一笔交易创建的新 UTXO,可以继续被下一笔交易花费。

例如:

TEXT
1交易 A 创建 UTXO X
2交易 B 花费 UTXO X,创建 UTXO Y
3交易 C 花费 UTXO Y,创建 UTXO Z

这就形成了一条交易链。

在 BSV 应用中,许多状态更新都可以用这种链式结构表达。例如,一个凭证、token 或业务状态,每次更新时都消耗旧状态 UTXO,并创建新状态 UTXO。

BSV 应用中的状态转移

BSV 不只是支付系统,也常被设计为数据和应用状态网络。UTXO 的“消耗旧状态、创造新状态”模式,适合表达多种业务过程,例如:

  • token 转移;
  • 数字凭证更新;
  • 合约状态推进;
  • 供应链事件变更;
  • 应用记录版本更新。

每次状态变化都可以由一笔交易表达,历史天然可追溯。

不过,这并不意味着只要把数据写入链上就自动具备良好的应用体验。实际应用通常还需要配套的协议设计和 Overlay 索引,否则链上记录会很难被应用高效查询和使用。

新手常见误解

理解 UTXO 模型时,可以重点避免以下误解:

  • 花钱不是修改旧 UTXO 的金额;
  • 旧 UTXO 被花后不能再次使用;
  • 找零必须作为新的 output 创建;
  • input 总额和 output 总额之间的差额是手续费;
  • 交易可以同时消耗多个旧 UTXO,也可以创建多个新 UTXO;
  • 状态转移可以用 UTXO 链表达,但需要清晰的协议规则。

参考资料

推荐文章