澄清一个普遍误解,以太坊并未采用UTXO模型
在区块链技术的世界里,两种主要的账户模型——UTXO(未花费的交易输出)模型和账户余额模型——常常被拿来讨论,很多人想当然地认为,作为智能合约平台的先驱,以太坊和比特币一样,也采用了UTXO模型,这是一个相当普遍的误解。事实是,以太坊采用的是账户余额模型,而非UTXO模型。
为了彻底厘清这一点,我们首先需要理解什么是UTXO模型,然后再看

什么是UTXO模型?—— 比特币的底层逻辑
UTXO模型,全称为“Unspent Transaction Output”,即“未花费的交易输出”,你可以把它想象成一叠不同面额的现金,你钱包里的每一块钱,都是某次交易找零或收款后留下的“未花费的输出”。
UTXO模型的工作原理如下:
- 交易是输入和输出的集合: 每一笔交易都由“输入”(Inputs)和“输出”(Outputs)构成。
- 输入是已花费的输出: 当你想发起一笔交易时,你需要提供足够的“输入”,这些输入本质上是你之前收到的、尚未花费的UTXO,就像你支付100元账单时,可能会拿出两张50元的钞票(两个UTXO)。
- 输出是新的UTXO: 交易执行后,会生成新的“输出”,一部分是支付给收款人的UTXO,另一部分是找零,返回给你自己的、成为新的UTXO,等待未来的使用。
- 所有权证明: 要花费一个UTXO,你必须提供与该UTXO创建时相对应的“解锁脚本”(通常是私钥签名),以证明你对这笔资金的所有权。
UTXO模型的特点:
- 并行处理潜力高: 由于交易只涉及特定的UTXO,只要两个交易的输入UTXO集合不重叠,它们就可以被并行处理,这在理论上有助于提高交易吞吐量。
- 隐私性较好: 你不需要公开账户余额,只需证明你拥有足够支付本次交易的UTXO即可。
- 状态复杂: 整个系统的状态(即所有人的总余额)是由无数个分散的UTXO构成的,要查询一个账户的余额,需要遍历所有属于该账户的UTXO。
以太坊采用的账户模型—— 一本更直观的账本
与UTXO模型不同,以太坊采用的是账户余额模型,这个模型更贴近我们日常使用的银行账户系统。
账户模型的工作原理如下:
- 账户是状态的基本单位: 以太坊的世界里,所有实体(无论是普通用户还是智能合约)都是一个“账户”,每个账户都有一个唯一的地址。
- 账户包含状态数据: 每个账户都存储了特定的状态信息,主要包括:
- 账户余额: 账户中拥有的ETH数量。
- nonce: 一个递增的数字,用于防止重放攻击,确保交易的顺序性。
- 合约代码(仅智能合约账户): 存储智能合约的代码逻辑。
- 存储(仅智能合约账户): 智能合约的持久化数据存储空间。
- 交易直接改变账户状态: 当一笔交易发生时(从地址A向地址B转账10个ETH),它不会像UTXO那样去“花费”输入,而是直接在以太坊的全球状态数据库中执行一次“状态变更”:
- 地址A的余额减少10个ETH。
- 地址B的余额增加10个ETH。
- 地址A和地址B的nonce值都会相应增加。
账户模型的特点:
- 状态直观: 每个账户都有一个明确的余额,查询起来非常简单直接。
- 交易逻辑清晰: 交易就是从一个账户向另一个账户转移价值或调用智能合约函数,逻辑更符合编程思维。
- 状态同步复杂: 由于所有交易都直接修改全局状态,为了保持网络同步,每个节点都需要维护一个完整且不断变化的状态数据库,这对节点的存储和计算能力要求较高。
为什么会有以太坊采用UTXO的误解?
这种误解主要源于以太坊创始人 Vitalik Buterin 早期的一些思考和探索,在以太坊发展的最初阶段,Vitalik 曾认真研究过将UTXO模型与智能合约结合的可能性,甚至提出了“账户抽象化UTXO”的概念,他希望通过UTXO模型实现更高效的并行处理和更灵活的隐私保护。
在权衡了UTXO模型的复杂性与账户模型的简洁性后,以太坊团队最终选择了账户模型,他们认为,账户模型对于构建一个像以太坊这样需要支持复杂状态交互和通用图灵完备智能合约的平台来说,更为自然和强大,智能合约本身就是一个拥有状态和代码的“超级账户”,这与账户模型的哲学高度契合。
UTXO vs. 账户模型,没有绝对优劣
回到最初的问题:“以太坊采用了UTXO模型是什么?”—— 答案是:以太坊并没有采用UTXO模型,它采用的是账户余额模型。
- 比特币是UTXO模型的忠实代表,它专注于点对点的价值转移,模型简单、安全且高效。
- 以太坊是账户模型的典范,它专注于构建一个去中心化的、可编程的世界计算机,其账户模型更适合管理复杂的应用状态和执行智能合约。
这两种模型代表了两种不同的哲学设计,各有优劣,适用于不同的应用场景,理解它们之间的根本区别,是深入掌握区块链技术底层原理的关键一步。