Introduction
UTXO是Unspent Transaction Output的缩写,是比特币发明人”中本聪“的天才设计。
本质上,UTXO就是流水账。了解过一点点会计学,见过企业记账的同学都知道,我们现在的会计系统绝大部分采用的是一种叫做”借贷记账法“的方法,账目分成借方和贷方,每发生一笔业务都要登记两个以上的科目。
简单来说,Alice转账给Bob 1美元,使用借贷记账法至少要产生两条账目,Alice账户减少1美元,Bob账户增加1美元。这种记账法在企业经营、企业审计中有无数的好处,这里就不详述了。但是这种记账法也有一个最大的缺点,就是容易产生记账错误和记账误差。一笔交易需要登记两条以上的账目,本质上记录的是“交易的结果”,而不是“交易本身”。
如果让一个程序员来设计基于“借贷记账法”的账本,数据库中记录的就是每一个账户的变动情况和余额。在数据库系统中,需要一系列额外的规则,来确保交易成功地进行。在Alice给Bob转账1美元的操作中,系统首先需要检查Alice账户余额是否大于等于1美元,然后检查Bob的账户地址是否合法,最后才是Alice账户减1,Bob账户加1。
上述过程是不是非常复杂?其实会计的工作之所以那么忙,就是因为他们每天都要把交易拆分成不同的科目去记录。不同的会计对交易理解不同,可能记录的科目就不一样(当然在简单的转账系统中,不存在这个问题),于是产生了记账差异。
“中本聪”没有采用这种复杂的记账方案,而是采用了一种追踪比特币的流水账记录法——UTXO。本质上,就是只记录交易本身,而不记录交易的结果。从金融系统设计角度来说,这种方式有点“交易清算分离”的意思。区块链系统只处理所有的交易,而需要清算、查看余额等信息,由区块链节点自行处理。
UTXO系统遵守两个规则:
- 除了CoinBase(挖矿交易)之外,所有的资金来源都必须来自前面某一个或者几个交易的UTXO;
- 任何一笔交易的输入总量必须等于输出总量,等式两边必须配平。
Example
我们假设一个这样的场景:张三挖到12.5枚比特币。过了几天,他把其中2.5枚支付给李四。又过了几天,他和李四各出资2.5比特币凑成5比特币付给王五。
如果是基于账户的设计,张、李、王三人在数据库中各有一个账户,则他们三人的账户变化如下图所示:
如果基于UTXO的设计,如下图所示: