2.1 UTXO模型

UTXO模型的原理

UTXO模型(比特币使用)

想象一下现金交易:

  • 你的钱包里不是"有500元",而是有一张200元和三张100元的钞票

  • 当你要花350元时,你给出200元和两张100元(共400元)

  • 然后收到50元找零

  • 交易后,你钱包里只剩下一张100元和一张50元的新钞票

这就是UTXO模型的工作方式:

  • 你不拥有"账户余额"(即你拥有现金而非银行的存款),而是拥有特定金额的"未花费交易输出"(UTXO)

  • 每次交易都会完全消耗输入的UTXO,并创建新的UTXO

  • 你的"余额"实际上是所有属于你的UTXO的总和

  • 找零必须作为新的UTXO返回给自己

账户余额模型(以太坊使用)

想象一下银行账户:

  • 你的账户显示余额为500元

  • 当你花350元时,系统只需从你的账户中扣除这个金额

  • 交易后,你的账户余额自动更新为150元,对方的金额增加350元

  • 不需要处理"找零"的概念

这就是账户余额模型的工作方式:

  • 每个地址都有一个账户,存储当前余额

  • 交易只需简单地从一个账户扣除金额并添加到另一个账户

  • 不需要跟踪单独的"支付单位"

  • 账户状态直接存储在区块链上

两者之间的关系

实际上,这两种模型可以相互模拟:

  • 在UTXO系统上,索引器(如ElectrumX)通过汇总属于同一地址的所有UTXO,创建一个"账户视图"

  • 理论上,账户系统也可以模拟UTXO行为,但这样做会增加不必要的复杂性

每种模型都有其优势:

  • UTXO模型提供更好的隐私性和并行处理能力

  • 账户模型更直观且更容易开发智能合约

简单来说,UTXO就像是拥有不同面额的纸币,必须完整一张张使用;而账户模型就像银行账户,可以精确扣除任意金额。

如果要更用金融专业的术语解释,比特币的UTXO模型是M0,以太坊的账户余额模型是M1或M2。M0是现金,M1是现金+活期存款,M2是现金+活期存款+定期存款。使用现金时,用户与银行之间没有资产和负债关系。使用银行系统记账的时候,本质是形成用户和银行之间的资产和负债关系。

UTXO模型的举例

理解了UTXO模型后。我们用一个更简单的例子来解释Alice和Bob的UTXO交易:

简单UTXO模型例子:Alice付款给Bob

起始状态:

  • Alice有一个UTXO价值10比特币

  • Bob没有比特币

Alice想给Bob 7比特币:

  1. 创建交易:

    • 输入: Alice的10比特币UTXO

    • 输出:

      • 7比特币给Bob

      • 3比特币找零给Alice

  2. 交易ID: 每个交易会生成一个唯一的ID (假设是TX123)

  3. 结果:

    • Alice的原始10比特币UTXO已被消费(消失了)

    • 创建了两个新的UTXO:

      • Bob现在拥有一个UTXO: (TX123, 输出#0, 7比特币)

      • Alice现在拥有一个UTXO: (TX123, 输出#1, 3比特币)

重要概念:

  • UTXO标识: 每个UTXO由"交易ID+输出索引"唯一标识

  • 全部消费: 交易必须消费整个输入UTXO

  • 新UTXO创建: 每笔交易都创建新的UTXO

这就像Alice给Bob一张10元钞票,Bob给她找回3元 — 原来的10元不再存在,而是产生了新的7元和3元。

注意这跟现实中的现金交易有一些区别,虽然找零机制类似。我们来看看区别:

实际现金交易 vs. UTXO模型

实际现金交易

  • Alice给Bob一张10元钞票

  • Bob从自己钱包拿出3元给Alice

  • 结果:Bob持有原来的那张10元钞票,Alice持有新的3元

  • 钞票本身保持不变,只是改变了所有者

比特币UTXO模型

  • Alice有一个10比特币的UTXO

  • 交易后,这个10比特币UTXO被完全销毁

  • 同时创建两个全新的UTXO:一个7比特币给Bob,一个3比特币返回给Alice

  • 原始的"钞票"不再存在,而是被新的"钞票"替代

记住,比特币不记录"谁拥有什么",而是记录"每笔交易如何变更所有权"。每个UTXO是一次性的,必须完全消费,这样更容易验证没有双重支付。验证者只需检查:输入UTXO是否未被花费 + 签名是否有效,不需要跟踪复杂的账户历史或余额变更。

可以这样想:UTXO不是"钞票",而更像是"收据"(比如支票或地契)。每次交易都会撕毁旧收据,创建新收据。

如果要用计算机专业的术语更深刻理解比特币所记录的UTXO的流转过程,可以想象这是一个“过程数据库”,一个“分布式的、不可修改、只能追加”的数据库,类似MySQL的操作日志数据库。而MySQL本身,是一种强调“状态本身”的数据库。

把MySQL的操作日志完整地记录下来,再进行重放,即可完整地重建整个数据库。在比特币领域,索引器(如ElectrumX),检索了比特币全部的UTXO和记录,也重建了一个地址-余额的数据库。这是很多比特币钱包(如Sparrow、Ledger)给我们显示账目余额的技术基础。

Last updated