区块链/等级 II · 运作机制/2.2 交易/课程 1
UTXO模型
为什么比特币没有账户,以及账本如何知道哪些资金已被使用
材料能够访问区块浏览器(如 mempool.space)的网页浏览器一个拥有多个UTXO的公开比特币地址用于记录输出ID和金额的笔记本
好奇
- 当没有账户可供更新时,余额会怎样?
- 节点如何在不检查所有历史交易的情况下,确认某个输入尚未被花费?
- 为什么一枚币携带完整历史会让人更难保持匿名?
探索
- 比特币并不采用银行账本和以太坊那样的账户模型。在那些系统中,余额存储在地址中并被就地更新;转账就是从一个余额中扣除,再加到另一个余额上。比特币没有这样的存储方式,而是采用类似现金的结构,价值仅以离散的、未花费的单位形式存在。不存在记录“爱丽丝总额”的中央账本,只有一组当前可供花费的独立输出。
- 这些单位被称为未花费交易输出(UTXO)。每个UTXO都包含一定数量的聪,以及规定谁可以花费它的锁定脚本。发生交易时,交易会将整个UTXO作为输入消耗掉,并创建新的UTXO作为输出。被花费的输出会离开可花费币的集合(这些交易仍保留在链的历史记录中),新的输出则加入该集合。钱包的“余额”并不是一个存储的数字,而是其私钥能够满足锁定脚本的所有UTXO之和。
- 这种结构简化了网络节点的验证工作。由于每个输入都引用一个特定的、此前未被花费的输出,节点只需检查该输出在当前状态中存在且未被使用过即可,无需重新计算全局余额,也无需核查复杂的账户历史。每个全节点都维护着“链状态”(chainstate),本质上就是任意时刻所有有效UTXO的完整集合。这使得节点能够快速、确定性地验证双花企图。
- 与以太坊的对比凸显了一个关键的设计选择。以太坊采用账户模型,每个地址都有存储的余额和一个用于防止重放攻击的nonce(交易计数器)。更新一个账户需要全局修改状态树。比特币则是创建新的输出,而非就地修改余额,这意味着币会携带自身的历史,把过去的交易与当前的持有联系起来。
- 这种历史关联对隐私性和可替代性有着重要影响。由于每个输入都指向之前的某个输出,分析人员可以沿着UTXO链追踪资金流向。尽管存在混币服务及其他技术手段,但这种基本结构使得很难完全切断一枚币的来源与其当前持有者之间的联系。在关于比特币是否真正具备可替代性的讨论中,这种透明性常被提及,因为一些市场参与者可能更青睐历史较难追溯的“干净”币。
- 要实际观察这一点,可以打开一个收到过多笔付款的钱包的币控制(coin control,或“UTXO”)视图:它会分别列出每个输出,各自标注金额和交易ID。在区块浏览器上,地址页面以已收到输出列表的形式显示同样的内容,其中一些已花费,一些未花费。这份由单个输出组成的列表才是所有权在链上的真实表示;界面中显示的“余额”只是客户端根据这一集合计算得出的结果。
关键事实
- 比特币在链上不存储任何账户或余额信息;其所有权仅体现为未花费交易输出(UTXO)。
- 每个 UTXO 都包含一定数量的聪,以及用于规定其支出条件的锁定脚本。
- 一笔交易会将整个UTXO作为输入消耗掉,并创建新的UTXO作为输出;被花费的输出会离开UTXO集合。
- 每个全节点都会维护“链状态”,即用于验证的所有当前未花费输出信息的完整集合。
- 钱包显示的余额是在本地对其私钥所控制的UTXO金额求和得出的结果,而非存储在区块链中的数值。
- 与以太坊采用nonce和可变余额的账户模型不同,比特币的UTXO模型将币视为离散的、携带历史的单位,这些单位会被替换而非更新。
练习 九、六、三、一
9收集列出9种不同的数字资产或货币。注明每种资产是采用基于账户的余额系统(如以太坊),还是采用基于UTXO的输出系统(如比特币)。
6归类根据处理状态的方式,将这9项分为6类:可变余额、不可变输出、混合模型、中心化账本或其他。
3提炼将这6组归纳为协议在账本结构上选择UTXO而非账户的3个根本原因。
1凝结用1句话解释:与传统银行相比,不存储余额如何改变了比特币防止双花的方式。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。