资深程序员告诉你,什么是UTXO?为什么没有比特币余额只有UTXO?

96
jerry区块链技术与思维
2018.07.20 20:39* 字数 2660

在没有比特币,区块链之前是没有UTXO这个词语的。
要说清楚UTXO是什么?先给大家介绍两个知识点,一是什么是交易,二是什么是账号模型

1、 什么是交易

交易比较好理解,英文是Transaction 被简称为 TX。以我们平时对交易的理解,李四给张三转账了一笔50块钱,那就是李四的账上的钱少了50块,张三账上的钱多了50块;张三再想王五转账50元,这样的过程就叫做交易,那么在计算机中怎么来记录和保存这笔交易呢?

2、 什么是账号模型

现在的银行系统、证券交易系统、互联网第三方支付系统等,其核心都是基于账户的设计,由关系数据库比如MySQL,Oracle来支撑的。这是最直接最直观符合人类思维的方式。
为了照顾没有计算机和数据库基础知识的读者,简单介绍下数据库知识。

数据库指的是以一定方式储存起来,能为多个用户共享,与应用程序彼此独立的数据集合。简单来说可视为电子化的表格,用户可以对表格中的数据运行新增、更新、删除等操作。

可以看出,关系数据库可以简单理解成一张表格。那么对于账户模型的数据库,简单来讲可以设计成两个张表格:

  1. 账户表
  2. 交易记录表

1 简化的账户表格如下,用来记录所有人的银行卡号及余额信息,实际情况会复杂很多:

编号 开户人 开户卡号 余额
1 张三 62xxx001 100
2 李四 62xxx002 100
3 王五 62xxx003 100
... ... ... ...

2 交易记录表如下,用来记录所有的转账记录

编号 转账人 接收人 转账金额
... ... ... ...

以上面李四给张三转账50元为例,交易记录表格,新增一条转账记录如下:

编号 转账人 接收人 转账金额
1 李四 张三 50

同时需要在账号表格中做下余额修改,修改后的账户表格为

编号 开户人 开户卡号 余额
1 张三 62xxx001 150
2 李四 62xxx002 50
3 王五 62xxx003 100
... ... ... ...

张三给王五转账50元后,两张表格的编号如下:

编号 转账人 接收人 转账金额
1 李四 张三 50
2 张三 王五 50

修改后的账户表格为

编号 开户人 开户卡号 余额
1 张三 62xxx001 100
2 李四 62xxx002 50
3 王五 62xxx003 150
... ... ... ...

3、什么是UTXO模型

上面的账户模型其实是人最直观、直接,容易理解的。那么还有其他的方式来表示交易?中本聪设计的UTXO就是一种表示交易的方式。

UTXO是Unspent Transaction Output(未花费交易输出)的简写,transaction 被简称为 TX,所以上面这个短语缩写为 UTXO。上面的账户模型是两张表格组成,UTXO经过巧妙的设计不需要传统的关系数据库来支撑,UTXO被翻译成未消费交易输出,由点拗口,怎么理解呢?
我们知道比特币是挖出来的,假设张三、李四、王五都挖出了100个比特币


张三.png
李四.png
王五.png

同样,以上面李四给张三转账50元为例


李四给张三转账50元.png

张三给王五转账50元后


张三给王五转账50元.png

解释下上面的几个图的意思。
比特币的区块链账本里记录的是一笔又一笔的交易。每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费交易输出”,也就是 UTXO。
挖矿所得的奖励叫做coinbase,没有输入来源,所以张三、李四、王五的100个币(为方便说明为100个,实际上根据减半机制,比特币在2018每个区块奖励是12.5个)均来自于挖矿,假设TX hash编号分别为0x001,0x002,0x003。

李四给张三转50个币,转账交易的hash编号为0x004,输入的TX编号为0x001和0x002,输出为张三150个币,李四为50个币。注意这里忽略了交易打包费。

在后来,张三要给王五转50个币,转账交易的hash编号为0x005,聪明如你应该能猜出来,输入是0x003和0x004,输出为张三100币,王五150个币。同样这里忽略了交易打包费。

由此,可以看出UTXO交易遵守下面规则:

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

至此你应该能明白为什么有人说:比特币网络中没有账户,只有地址;比特币不是余额,而是UTXO。
你也能理解为什么你想看到比特币钱包的最新余额,必须要同步到最高的区块高度才能正确显示。

4、为什么要设计UTXO模型?

4.1 账户模型的缺点

讲点题外话:其实人的认知对于大与小的概念是不够的。0.001秒对于人来讲是一个很短很短的时间,但是对于计算机来讲是一个很长的时间,在计算机世界可能相当于人类的1天。当我们嘲笑鱼的记忆只用7秒的时候,如果计算机有意识的话,可能也会嘲笑人类的记忆最长也只有几十年,因为计算机的存储时间理论上来讲是无限长的。

先给大家解释下计算机基础知识。
笔者前面的文章解释了图灵机(https://www.jianshu.com/p/c07d83c4f3a1),其实我们现在的所有计算机都是图灵机,从图灵机的模型我们知道要修改一个数据,比如银行卡余额增加100元,需要做三步:
1,先从账户中读出余额
2,把余额值增加100元得出新的余额值
3,把新的余额写到账户中
在三步计算机操作在我们人看来是瞬间(比如0.0001秒)完成,但是在计算机内部其实要花一定时间的,它是一个分步骤完成,在多个CPU时钟内完成的。

对于账户模型,我们在上面已经了解到,需要有两张表格,转账过程中,要保证等式两边必须配平。所以发出去的交易是给某个帐户加钱,同时要给另外一个账户减钱,即要对两个账户的数据进行修改,如果交易因为网络等原因重新发送,变成两笔交易重复扣钱,这是在区块链里面著名的“重放攻击”。
在分布式系统中,要保证加钱,减钱两个同时完成,就需要实现分布式事务,相信做个编程的同学就知道这是一个非常非常难,非常消耗资源的一个事情,也是非常容易出现漏洞的地方,以太坊采用就是账户模型,所以以太坊智能合约经常由于编程不当引起被盗币的事情发生

4.2 比特币是没有开户的过程的,只有地址。

去中心化系统没有专门的机构去让人申请每个账户的生成和销毁,这样的系统也无需记录和跟踪所有账户的信息,以UTXO来替代跟踪帐户交易的方式,消耗的系统资源会比较少 ,只要跟踪UTXO即可,且不可篡改。

4.3 更好匿名性

比特币有个比较好的特性是匿名性,可以每次交易就换一对公私钥,交易输出的给自己的找零往往输出到一个另外的帐户下去,UTXO迎合了这种需求,如门罗币就是采用混币的方式实现隐私的。而使用帐户模型就没那么灵活了。

4.4 更好的并行处理

UTXO是独立的数据结构,理论上来说可以并行地利用不同的 UTXO 签发多笔交易,并广播到网络中,而不用考虑事务问题;

4.5 占用空间小

去中心化系统考虑是全世界人民可以使用,开多个地址,长期来看,UTXO不会因为地址的增多而增加额外的空间,所以数据占用更小,而账户模型会越来越臃肿。

5、从UTXO得到的启发

5.1 跳出大众思维。比特币作为一种点对点的电子货币系统,跳出传统货币系统的账户模型设计,采用了一种全新的方式,用最低的成本,解决很多分布式问题。

5.2 找出等价性,越简单越美。 等价性是一种很厉害的解决问题的方式,在计算机领域有很多等价性的例子,比如用二进制来等价十进制,解决机械运动直接计算10进制非常复杂的情况;又比如把人工智能问题等价成数学问题。UTXO把账户交易用一种简单的模型进行等价,虽然不符合人常规思考方式,但非常简单,非常具有美感。

5.3 要学会某些妥协。 比特币设计之初就是给全世界人民使用的,并且要具有去中心化、可溯源、不可篡改、匿名等特效,就必须要所妥协,比如UTXO设计要实现EVM功能就非常困难,即实现图灵完备的智能合约非常难。这也是以太坊没有采用UTXO模型的主要原因。

区块链
Web note ad 1