比特币,及其很多的继任者,将用户的余额存储在一个基于 UTXO(unspent transaction output)的数据结构中,系统的整个状态由一个“未花费输出,unspent output” 的集合构成。那么 UTXO 到底是什么呢?简单来说,UTXO 就是人民币,就是 “coin”。有多少 UTXO,就有多少人民币。跟人民币的区别在于:
- “面值”,人民币的面值有 1 元,5 元,20 元,100 元等等是固定的,但是理论上,UTXO 的“面值”可以使任意正数。
- 新的人民币由政府的印钞机产生,新的 UTXO 由交易产生。
每个 UTXO 都有一个所有者和一个值,一笔交易会花费一些 UTXO,并创造出一些新的 UTXO,使用 UTXO 模型的交易在验证上有限制:
- 引用的每个输入必须是有效的,而且还没有被花费
- 对于每个输入,交易必须有一个跟输入所有者匹配的签名
- 总输入必须大于或等于总输出
在 UTXO 系统中,一个用户的“余额”实际上并不直接存在,而是通过计算得来。一个用户有一个私钥,这个私钥生成一个有效的签名,这个签名能够解锁的所有币的总和就是“余额”。
以太坊摒弃了 UTXO 模型,采用了一种更简单的方式:账户模型。
https://github.com/ethereum/wiki/wiki/Design-Rationale/37be78fa7b726d36156c537b757c874b7aa5705