*本文首发于公众号“孟岩谈读书”,其下篇为《UTXO高在哪里?》

UTXO 代表 Unspent Transaction Output。在比特币社区里,Transaction 被简称为 TX,所以上面这个短语缩写为 UTXO。一般会认为 UTXO 是比特币区块链设计当中的一部分,但事实上 UTXO 和区块链没有必然的联系,你可以完全照搬比特币区块链,但不使用 UTXO。HyperLedger 和Ethereum 一开始并没有采用 UTXO,现在前者已经切换回 UTXO,后者打算增加这个选项。我觉得这也是中本聪的过人之处——后来者照着临摹,中间想搞点小改进,结果做到后面,发现还是人家原版的水平高,纷纷又改回来…..

那么到底什么是 UTXO 呢?

前不久我听“卓老板谈科技”里“比特币”那一集,里面讲到比特币的付款过程,说他要给付给奶茶妹妹5个比特币,于是系统在他的账户里减掉5,在奶茶妹妹的账户里增加5,然后把这笔交易记入区块链总账,完成。虽然这个节目做得不错,不过在这一点上卓老板完全搞错了,他描述的是基于账户的方案,而不是比特币实际采用的 UTXO 方案。

如果让我们设计一个支付系统,一定会跟卓老板想到一起去,给张三一个账户,里面有余额 100 元,李四有一个账户,里面有余额50元。当张三要付给李四20元时,做以下操作:

1. 检查张三账户余额是否充足,如果不足20元就终止交易,向张三报“余额不足”

2. 在张三账户里减去20元(假设零手续费)

3. 在李四账户里增加20元

现在的银行也好、信用卡也好、证券交易系统也好,互联网第三方支付系统也好,其核心都是基于账户(account based)的设计,由关系数据库支撑。数据库要确保两点,第一是你要确保业务规则得到遵守,张三的余额充足。第二是确保事务性,也就是原子性、一致性、隔离性、持久性(ACID)。这些都是数据库的常识性知识,这里不赘述。这种基于账户的设计,简单直观,而且在 IT 系统设计里用了几十年,应该说没有什么问题。

但比特币没有设计成基于账户的系统,而是发明了 UTXO 方案。

要理解UTXO,最简单的办法就是把一枚比特币从诞生到在商海中沉浮的经历描述一下。我们假设一个这样的场景:张三挖到12.5 枚比特币。过了几天,他把其中 2.5 枚支付给李四。又过了几天,他和李四各出资 2.5 比特币凑成 5 比特币付给王五。

如果是基于账户的设计,张、李、王三人在数据库中各有一个账户,则他们三人的账户变化如下图所示:

但在比特币中,这个过程是通过 UTXO 实现的,图示如下:

比特币的区块链账本里记录的是一笔又一笔的交易。每笔交易都有若干交易输入,也就是资金来源,也都有若干比交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费过的交易输出”,也就是 UTXO。比特币交易遵守几个规则。第一,除了 coinbase 交易之外,所有的资金来源都必须来自前面某一个或者几个交易的 UTXO,就像接水管一样,一个接一个,此出彼入,此入彼出,生生不息,钱就在交易之间流动起来了。第二,任何一笔交易的交易输入总量必须等于交易输出总量,等式两边必须配平。

上图第一个交易 #1001 号交易是 coinbase 交易。比特币是矿工挖出来的。当一个矿机费尽九牛二虎之力找到一个合格的区块之后,它就获得一个特权,能够创造一个 coinbase 交易,在其中放入一笔新钱,并且在交易输出的收款人地址一栏,堂堂正正的写上自己的地址。在我写文章的这一天(2016年8月9日),这笔比特币的数额规定为 12.5 枚,市价 48,576元人民币。这个 coinbase 交易随着张三挖出来的区块被各个节点接受,经过六个确认以后永远的烙印在历史中。

过了几天,张三打算付 2.5 个比特币给李四,张三就发起一#2001号交易,这个交易的资金来源项写着“#1001(1)”,也就是 #1001 号交易——张三挖出矿的那个 coinbase 交易——的第一项 UTXO。然后在本交易的交易输出 UTXO 项中,把2.5个比特币的收款人地址设为李四的地址。

请注意,这一笔交易必须将前面产生那一项 12.5 个比特币的输出项全部消耗,而由于张三只打算付给李四 2.5 个比特币,为了要消耗剩下的10比特币,他只好把剩余的那 10 个比特币支付给自己,这样才能符合输入与输出配平的规则。

再过几天,张三和李四打算AA制合起来给王五付 5 枚比特币。那么张三或李四发起 #3001 号交易,在交易输入部分,有两个资金来源,分别是#2001(1) 和 #2001(2),代表第 #2001 号交易的第 (1) 和第 (2) 项 UTXO。然后在这个交易的输出部分里如法炮制,给王五5比特币,把张三剩下的 7.5 比特币发还给自己。以后王五若要再花他这5比特币,就必须在他的交易里注明资金的来源是 #3001(1)。

所以,其实并没有什么比特币,只有 UTXO。当我们说张三拥有 10 枚比特币的时候,我实际上是说,当前区块链账本中,有若干笔交易的 UTXO 项收款人写的是张三的地址,而这些 UTXO 项的数额总和是 10。因为在比特币系统里,一个人可以拥有的地址资源,可谓取之不尽用之不竭。要知道自己的一大堆地址里一共收了多少 UTXO,人是算不过来的,需要由比特币钱包代为跟踪计算。

以上即为 UTXO 的一个简要的介绍。

孟岩

孟岩

“通证经济”概念提出者; 通证思维实验室发起人; 数字资产研究院副院长; CSDN 副总裁;

Leave a Reply

6 + 7 =