中本聪有三个天才般的创举,一个是区块链的设计,一个是UTXO,一个是智能合约。而这三个设计是极为天才的,被斯坦福大学密码学和计算机安全教授 Dan Boneh 评价为“extremely brilliant”,“必将激发无穷的创新”。
UTXO (Unspent Transaction Output)
那么到底什么是 UTXO 呢?
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 方案。
我们假设一个这样的场景:张三挖到12.5 枚比特币。过了几天,他把其中 2.5 枚支付给李四。又过了几天,他和李四各出资 2.5 比特币凑成 5 比特币付给王五。
如果是基于账户的设计,张、李、王三人在数据库中各有一个账户,则他们三人的账户变化如下图所示:
但在比特币中,这个过程是通过 UTXO 实现的,图示如下:
每一笔交易的输出作为下一笔交易的输入。
理解上面这句话,看懂上面交易的图,你才能理解UTXO(多看几遍,注意交易号,第几项,线的连接)
你可能会疑惑,一个接一个,那么第一个怎么来的,当然是挖矿来的。
比特币交易遵守几个规则。
第一,除了 coinbase 交易之外(其他数字货币与比特币进行交易),所有的资金来源都必须来自前面某一个或者几个交易的 UTXO,就像接水管一样,一个接一个,此出彼入,此入彼出,生生不息,钱就在交易之间流动起来了。
第二,任何一笔交易的交易输入总量必须等于交易输出总量,等式两边必须配平。
那么,在UTXO方案中,是怎么知道一个钱包地址有多少钱呢?
注意我上面说的是一个地址而不是一个人,因为一个人可以有多个地址,而区块链的匿名性决定不知道地址对应的人是谁。所以当查一个账户余额时,UTXO 方案当然也需要一个数据库,这个数据库记录着当前系统里每一笔“没有花出去的交易输出”,也是就比特币。
UTXO有什么优点呢?传统关系型账户数据库,随着交易量的增加会无限膨胀,而UTXO 数据库体积会小很多。
共同学习,写下你的评论
评论加载中...
作者其他优质文章