账户模型与 UTXO

比特币,及其很多的继任者,将用户的余额存储在一个基于 UTXO(unspent transaction output)的数据结构中,系统的整个状态由一个“未花费输出,unspent output” 的集合构成。那么 UTXO 到底是什么呢?简单来说,UTXO 就是人民币,就是 “coin”。有多少 UTXO,就有多少人民币。跟人民币的区别在于:

  • “面值”,人民币的面值有 1 元,5 元,20 元,100 元等等是固定的,但是理论上,UTXO 的“面值”可以使任意正数。
  • 新的人民币由政府的印钞机产生,新的 UTXO 由交易产生。

每个 UTXO 都有一个所有者和一个值,一笔交易会花费一些 UTXO,并创造出一些新的 UTXO,使用 UTXO 模型的交易在验证上有限制:

  1. 引用的每个输入必须是有效的,而且还没有被花费
  2. 对于每个输入,交易必须有一个跟输入所有者匹配的签名
  3. 总输入必须大于或等于总输出

在 UTXO 系统中,一个用户的“余额”实际上并不直接存在,而是通过计算得来。一个用户有一个私钥,这个私钥生成一个有效的签名,这个签名能够解锁的所有币的总和就是“余额”。

以太坊摒弃了 UTXO 模型,采用了一种更简单的方式:账户模型。

https://github.com/ethereum/wiki/wiki/Design-Rationale/37be78fa7b726d36156c537b757c874b7aa5705