比特币交易本质--UTXO(Unspent Transaction Output)

  UTXO 代表 Unspent Transaction Output。
  Transaction 被简称为 TX,所以上面这个短语缩写为 UTXO。

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

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

  我们假设一个这样的场景:张三挖到12.5 枚比特币。过了几天,他把其中 2.5 枚支付给李四。又过了几天,他和李四各出资 2.5 比特币凑成 5 比特币付给王五。
  如果是基于账户的设计,张、李、王三人在数据库中各有一个账户,则他们三人的账户变化如下图所示:
140417wvvqmz48oa4qqwaz
  但在比特币中,这个过程是通过 UTXO 实现的,图示如下:
140447qe7vo3vt7g22slev
  比特币的区块链账本里记录的是一笔又一笔的交易。
  每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费过的交易输出”,也就是 UTXO。
  比特币交易遵守几个规则:

  1. 除了 coinbase 交易之外,所有的资金来源都必须来自前面某一个或者几个交易的 UTXO,就像接水管一样,一个接一个,此出彼入,此入彼出,生生不息,钱就在交易之间流动起来了。
  2. 任何一笔交易的交易输入总量必须等于交易输出总量,等式两边必须配平。

  上图第一个交易#1001号交易是coinbase交易。比特币是矿工挖出来的。当一个矿机费尽九牛二虎之力找到一个合格的区块之后,它就获得一个特权,能够创造一个coinbase交易,在其中放入一笔新钱,并且在交易输出的收款人地址一栏,堂堂正正的写上自己的地址。这个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项收款人写的是张三的地址,而这些UTX 项的数额总和是10。因为在比特币系统里,一个人可以拥有的地址资源,可谓取之不尽用之不竭。要知道自己的一大堆地址里一共收了多少UTXO,人是算不过来的,需要由比特币钱包代为跟踪计算。

  如果采用基于账户的方案,需要一个数据库。这个数据库能够让你很方便的查到张三、李四各自的账户余额。
  而 UTXO 方案当然也需要一个数据库,这个数据库记录着当前系统里每一笔“没有花出去的交易输出”,也是就比特币。当节点接收到一笔交易的时候,它需要去 UTXO 数据库里查,看看这笔交易所引用的 UTXO 是否存在,它的收款人(拥有者)是不是当前新交易的付款者。而交易结束之后,数据库要做相应的更新。
  首先要明确,无论是账户数据库还是 UTXO 数据库,必须是分散的,每结点一个克隆,一定不能是中心化的。如果比特币系统有一个中心数据库,不管你有多少节点,每一笔交易都要跑去中心数据库验证一下、然后再执行“转账”的事务操作,那就完全谈不上“去中心化”,比特币就毫无价值了,不如老老实实用支付宝。
  长期来看,账户数据库会无限膨胀,而UTXO 数据库体积会小很多。
  比特币是个匿名体系,它的账户就是“地址”。每一个比特币用户可以拥有几乎无限多的地址,在比特币系统来看,它完全不知道两个地址背后对应的是不是同一个人。

  在版本控制方面的考虑,svn 是中心化的数据库保持一份账本,这和区块链的设计自然是相违背的,git 是去中心化的数据库,但会保存太多冗余数据,对于分布式性能肯定是要大打折扣。UTXO数据库是抛弃了历史包袱的git, 只存储了最后一个版本。简易实用。

  UTXO具有天然的匿名效果,一个账户所对应的未花费交易是难以发现的。
  在性能方面,由于UTXO是独立的数据记录,那么就存在极大的并行性可以提升区块链交易验证速度。

http://www.frankyang.cn/2017/09/30/utxo/

posted @ 2017-10-02 21:45  紫魔戒  阅读(9827)  评论(0编辑  收藏  举报