Skip to content

UTXO模型

目录

  1. 什么是UTXO
  2. UTXO的基本概念
  3. UTXO模型 vs 账户模型
  4. 交易结构
  5. UTXO的生命周期
  6. 实际例子
  7. UTXO模型的优势
  8. 常见问题

什么是UTXO

UTXOUnspent Transaction Output(未花费的交易输出)的缩写。它是比特币账本系统的核心概念,用于追踪和管理资金所有权。

UTXO 是比特币区块链上的"硬币"——每一个 UTXO 代表一定数量的比特币,处于可被花费的状态。当你拥有比特币时,实际上你拥有的是一个或多个 UTXO,以及花费这些 UTXO 的私钥。

UTXO的关键特性

  • 离散化:每个 UTXO 是独立的、具体的价值单位
  • 原子性:UTXO 要么被完全花费,要么保持未花费状态,不存在中间状态
  • 不可分割性:UTXO 必须作为一个整体被花费(如需部分花费,需要创建新的 UTXO)
  • 可追踪性:每个 UTXO 的来源和历史都可以通过区块链追踪

UTXO的基本概念

交易输入(Input)

交易输入是指向前一个交易输出的引用。当你花费一个 UTXO 时,你需要:

  1. 引用前一个交易:指定该 UTXO 来自哪个交易
  2. 指定输出索引:如果该交易有多个输出,要指定是哪一个
  3. 提供解锁脚本:通常包含数字签名和公钥,证明你有权花费这个 UTXO

交易输出(Output)

交易输出定义了新的 UTXO。每个输出包含:

  1. 金额:该输出代表的比特币数量(以聪为单位,1 BTC = 100,000,000 聪)
  2. 锁定脚本:定义谁能花费这个输出。最常见的是 Pay-to-Public-Key-Hash (P2PKH),指定接收方的比特币地址
  3. 输出索引:在该交易中的位置编号(从 0 开始)

比特币地址与UTXO的关系

  • 比特币地址是公钥的哈希值
  • 当有人发送比特币到你的地址时,实际上是创建了一个锁定到你的公钥哈希的 UTXO
  • 只有持有对应私钥的人才能花费这个 UTXO

UTXO模型 vs 账户模型

UTXO模型(比特币使用)

特性UTXO模型
账本类型基于交易输出的模型
状态管理记录所有 UTXO 的状态
余额通过扫描所有 UTXO 计算
交易验证验证输入的 UTXO 是否存在且有效
隐私性更好的隐私性(难以追踪关联地址)
并行处理支持更好的并行交易

账户模型(以太坊使用)

特性账户模型
账本类型基于账户余额的模型
状态管理直接记录每个账户的余额
余额直接查询账户余额字段
交易验证验证账户是否有足够余额
隐私性隐私性较差(容易追踪账户活动)
并行处理涉及同一账户的交易无法并行

对比示例

UTXO模型示例:

Alice 拥有:
  - UTXO1: 3 BTC(来自交易 TX_A)
  - UTXO2: 2 BTC(来自交易 TX_B)
总余额 = 5 BTC

Alice 要发送 4 BTC 给 Bob:
1. 输入:UTXO1 (3 BTC) + UTXO2 (2 BTC) = 5 BTC
2. 输出:
   - 4 BTC 给 Bob(新的 UTXO)
   - 1 BTC 找零给 Alice(新的 UTXO)

账户模型示例:

Alice 账户:余额 5 BTC

Alice 要发送 4 BTC 给 Bob:
1. Alice 余额 - 4 BTC = 1 BTC
2. Bob 余额 + 4 BTC = 4 BTC

交易结构

基本交易结构

交易(Transaction)
├── 版本(Version)
├── 输入列表(Inputs)
│   ├── Input 1
│   │   ├── 前一个交易哈希(Previous Tx Hash)
│   │   ├── 输出索引(Output Index)
│   │   ├── 解锁脚本长度(Script Length)
│   │   └── 解锁脚本(Unlock Script / ScriptSig)
│   ├── Input 2
│   └── ...
├── 输出列表(Outputs)
│   ├── Output 1
│   │   ├── 金额(Amount)
│   │   ├── 锁定脚本长度(Script Length)
│   │   └── 锁定脚本(Lock Script / ScriptPubKey)
│   ├── Output 2
│   └── ...
└── 锁定时间(Locktime)

脚本机制

比特币使用一种叫做 Script 的栈式编程语言来验证交易。

锁定脚本(ScriptPubKey) - 创建 UTXO 时设置:

OP_DUP OP_HASH160 <公钥哈希> OP_EQUALVERIFY OP_CHECKSIG

这表示:"验证这个公钥的哈希等于指定的值,然后验证签名"

解锁脚本(ScriptSig) - 花费 UTXO 时提供:

<签名> <公钥>

这提供了满足锁定脚本要求的数据。


UTXO的生命周期

1. 创建阶段

  • 当一个交易被包含在区块中时,其输出成为 UTXO
  • 该 UTXO 处于"未花费"状态
  • 拥有对应私钥的人可以花费它

2. 存在阶段

  • UTXO 存储在完整节点的 UTXO 集中
  • 节点维护 UTXO 数据库以快速验证交易
  • UTXO 可以被引用多次以创建新交易(但只能被花费一次)

3. 花费阶段

  • 当一个新交易将 UTXO 作为输入时
  • 该 UTXO 被花费,状态从"未花费"变为"已花费"
  • 同时,新交易的输出创建新的 UTXO

4. 消亡阶段

  • UTXO 不再存在于 UTXO 集中
  • 它的历史仍然记录在区块链中
  • 无法再被花费

实际例子

例子 1:简单的单笔转账

场景: Alice 有 10 BTC,要发送 7 BTC 给 Bob

初始状态:

Alice 拥有:UTXO_A (10 BTC)

交易过程:

交易 TX_1
├── 输入:
│   └── UTXO_A (10 BTC) - 来自之前的交易
├── 输出:
│   ├── Output 1: 7 BTC 给 Bob(Bob的地址对应的公钥哈希)
│   └── Output 2: 3 BTC 找零给 Alice(Alice的地址对应的公钥哈希)
└── 费用:0 BTC(在输入和输出之差中隐含)

结果:

交易前 UTXO 集:
  UTXO_A (10 BTC, 状态:未花费)

交易后 UTXO 集:
  UTXO_A (状态:已花费 - 已从集合中移除)
  UTXO_B1 (7 BTC, 属于 Bob)
  UTXO_B2 (3 BTC, 属于 Alice)

例子 2:多输入交易(硬币合并)

场景: Alice 有多个小额 UTXO,需要合并

初始状态:

Alice 拥有:
  UTXO_1 (2 BTC)
  UTXO_2 (3 BTC)
  UTXO_3 (1.5 BTC)
总计:6.5 BTC

交易过程:

交易 TX_2
├── 输入:
│   ├── UTXO_1 (2 BTC)
│   ├── UTXO_2 (3 BTC)
│   └── UTXO_3 (1.5 BTC)
│   ├── 总输入:6.5 BTC
├── 输出:
│   └── 6.4 BTC 给 Alice(新地址)
└── 费用:0.1 BTC

结果:

多个小额 UTXO → 一个大额 UTXO
便于后续交易

例子 3:多输出交易(批量支付)

场景: Alice 要同时支付给多个接收方

交易过程:

交易 TX_3
├── 输入:
│   └── UTXO_X (10 BTC)
├── 输出:
│   ├── Output 1: 3 BTC 给 Bob
│   ├── Output 2: 4 BTC 给 Carol
│   ├── Output 3: 2.8 BTC 找零给 Alice
└── 费用:0.2 BTC

UTXO模型的优势

1. 更好的隐私性

  • 每个地址通常用于单次接收,降低地址关联风险
  • 难以追踪同一个体的多笔交易
  • 相比之下,账户模型中账户的所有交易都关联在一起

2. 更简洁的数据结构

  • 不需要维护全局账户余额映射
  • 交易的输入输出关系清晰
  • 易于验证和审计

3. 更好的并行性

  • 不同的 UTXO 可以被独立并行处理
  • 账户模型中涉及同一账户的交易必须串行
  • 这对区块链的可扩展性很重要

4. 防重放攻击

  • 每个 UTXO 只能被花费一次
  • 硬分叉时,旧链上的交易难以在新链上重放
  • 提供了更好的安全性

5. 更灵活的脚本系统

  • UTXO 模型支持丰富的脚本语言
  • 可以实现复杂的支付条件(多签名、时间锁等)
  • 比账户模型提供更多的可编程性

常见问题

Q1: 我的比特币钱包里的余额是如何计算的?

A: 钱包通过扫描区块链中的所有交易,找出锁定到你的地址的所有 UTXO,然后将它们的金额相加。这就是你的总余额。

Q2: 如果我发送 10 BTC 但只需要花费 7 BTC,剩余的 3 BTC 去哪了?

A: 剩余的 3 BTC(减去交易费)会作为"找零"返回到你指定的一个地址。这会创建一个新的 UTXO。重要的是,要么完整花费 UTXO,要么不花费——不存在"部分花费"的概念。

Q3: UTXO 和钱币的类比是什么?

A: UTXO 就像实物钱币一样。如果你有一张 10 元纸币,想买 7 元的东西,你必须给出整张纸币,然后收取 3 元找零。你不能只用纸币的一部分。

Q4: 为什么有的交易有很多输入?

A: 通常是因为发送方之前收到过多个 UTXO(也许来自多个来源),现在需要合并它们来进行一笔大额转账。

Q5: UTXO 越多越好吗?

A: 不一定。虽然隐私性好,但 UTXO 过多会导致:

  • 交易体积更大(多个输入)
  • 交易费用更高
  • 钱包维护成本增加

这被称为"UTXO 碎片化"问题。

Q6: 未确认的交易产生的 UTXO 能使用吗?

A: 可以,但有风险。比特币支持"未确认交易链"(transaction chains),即在未确认交易的输出上构建新交易。但如果原交易失败,后续交易也会失败。