天天看点

UTXO

原文地址:http://www.yopai.com/show-2-182646-1.html

UTXO全称Unspent Transaction Output,即未消费的交易输出

现在的银行也好、信用卡也好、证券交易系统也好,互联网第三方支付系统也好,其核心都是基于账户(account based)的设计,由关系数据库支撑。

数据库要确保两点,第一是你要确保业务规则得到遵守,张三的余额充足。第二是确保事务性,也就是原子性、一致性、隔离性、持久性(ACID)。这些都是数据库的常识性知识,这里不赘述。这种基于账户的设计,简单直观,而且在 IT 系统设计里用了几十年,应该说没有什么问题。

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

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

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

UTXO

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

UTXO

比特币的区块链账本里记录的是一笔又一笔的交易。

每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费过的交易输出”,也就是 UTXO。

比特币交易遵守几个规则。

第一,除了 coinbase 交易之外,所有的资金来源都必须来自前面某一个或者几个交易的 UTXO,就像接水管一样,一个接一个,此出彼入,此入彼出,生生不息,钱就在交易之间流动起来了。

第二,任何一笔交易的交易输入总量必须等于交易输出总量,等式两边必须配平。

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

首先要明确,无论是账户数据库还是 UTXO 数据库,必须是分散的,每结点一个克隆,一定不能是中心化的。如果比特币系统有一个中心数据库,不管你有多少节点,每一笔交易都要跑去中心数据库验证一下、然后再执行“转账”的事务操作,那就完全谈不上“去中心化”,比特币就毫无价值了,不如老老实实用支付宝。

既然都是每个节点克隆一个数据库,根据交易过程同步修改,那么一个账户数据库跟一个 UTXO 数据库,又有什么分别呢?

首先,长期来看,账户数据库会无限膨胀,而UTXO 数据库体积会小很多。

其次,UTXO 数据库允许并行事务操作。在账户数据库中,张三要转20元给李四,需要进行一个数据库事务,在张三账户里减20,在李四账户里加20。如果与此同时,王五要转30元给张三,那这个交易就得排队,无法并行。而在 UTXO 中,数据库跟踪的是比特币的所有权转移,而不是账户的状态。不管张三本人正在发生多少收支交易,这些收支交易都是发生在不同的比特币上的,更重要的是这些交易之间并不共享任何状态,因此不会相互干扰,所有这些交易可以并发执行。这带来好处不光是快,更重要的是可扩展,可分布。

继续阅读