区块链 | 比特币的账户模型----UTXO

在比特币中,是不存在一个中心化的机构对比特币的交易进行结算清算的,自然也就没有中心化的数据库对用户的账户进行管理。事实上,在比特币系统中是没有账户这个概念的,取而代之的是UTXO(Unspent Transaction Output)即未消费的交易输出。这是中本聪的一个极其天才的设计。通过UTXO方案,比特币的交易得以在一个无第三方的系统中完成。

在了解比特币的UTXO模式之前,我们先来看一下基于账户模式的银行、证券等系统是如何处理用户交易的。

假设A、B在某银行各拥有一个账户,现在A需要转账100元给B。那么银行将执行:

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

2. 如果余额充足,那么在A的账户里减去100元

3. 在B账户里增加100元

这一切都是在银行的中心数据库中完成的。

现在我们就来看看没有中心化数据库的比特币,是如何通过UTXO,取代账户模式进行交易记录的。

我们先抛出UTXO模型的三个原则:

1.所有交易始于coinbase交易(即始于挖矿奖励所得)

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

3.每一笔的交易支出总额等于交易收入总额。

这里只需要有一个简单的概念,然后我们结合实例,具体来体会这一过程。

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

下面我们看一下,这几个交易是怎么通过UTXO实现的:

区块链 | 比特币的账户模型----UTXO

 

我们先回顾一下区块链的区块结构:

 

区块链 | 比特币的账户模型----UTXO

图一中的交易信息,就是记录在图二区块结构中的交易字段

然后我们结合UTXO的三个原则和图片,继续进行解读。

1.我们之前已经学过,挖矿是比特币产生的唯一途径。每个区块的第一个交易叫做Coinbase交易。每一个区块的奖励就在这里产生,指向矿工(张三)的地址,即矿工挖矿的收入为12.5BTC。

2.现在张三想把自己的12.5枚比特币转账2.5枚给李四。注意,在传统账户模式中,只需要在各自的账户进行增减就可以了,而UTXO的机制是不同的。每一个UTXO都是一个整体,是不能分割的(类比一个UTXO就是一个硬币,不管面值多少,必须全部花出去),也就是系统默认的一个找零机制。

即张三地址中的12.5枚比特币全部转出,其中2.5枚转到李四的地址,剩余10枚比特币转到张三的地址。(这个地址可以是新地址,也可以是原地址,需要你的转账的时候备注,如果不填写的话,剩余的比特币可就全部成为矿工的手续费了)。

有人会问,为什么要多此一举,直接转2.5枚出来剩下的不动不就行了吗?这就是UTXO和账户模式的区别,除了coinbase交易之外,所有的交易输入都必须来自于前面一个或者几个交易的UTXO输出,且每一笔的交易支出总额等于交易收入总额。

注意观察:每一笔转账前面都是有资金来源标注的。也就是说,在比特币系统中是没有余额的概念的,获取一个用户余额的方法就是把当前用户地址全部的UTXO加起来。这样做的目的,有很多优点,比如安全性、隐私性更高,而且也有效防止了双花攻击等等。

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

截止到这里,我们就明白了UTXO究竟为何物,一枚BTC从挖矿产生,到不停地被交易,其实整个体系中存在的就是很多个UTXO。也有这么一句话:其实就没有什么比特币,有的就是UTXO。这么说其实是对的,因为这就是比特币交易的方式。比特币没有实物,只有数据,UTXO就是它的存在形态。

自己的12.5枚比特币转账2.5枚给李四。注意,在传统账户模式中,只需要在各自的账户进行增减就可以了,而UTXO的机制是不同的。每一个UTXO都是一个整体,是不能分割的(类比一个UTXO就是一个硬币,不管面值多少,必须全部花出去),也就是系统默认的一个找零机制。

即张三地址中的12.5枚比特币全部转出,其中2.5枚转到李四的地址,剩余10枚比特币转到张三的地址。(这个地址可以是新地址,也可以是原地址,需要你的转账的时候备注,如果不填写的话,剩余的比特币可就全部成为矿工的手续费了)。

有人会问,为什么要多此一举,直接转2.5枚出来剩下的不动不就行了吗?这就是UTXO和账户模式的区别,除了coinbase交易之外,所有的交易输入都必须来自于前面一个或者几个交易的UTXO输出,且每一笔的交易支出总额等于交易收入总额。

注意观察:每一笔转账前面都是有资金来源标注的。也就是说,在比特币系统中是没有余额的概念的,获取一个用户余额的方法就是把当前用户地址全部的UTXO加起来。这样做的目的,有很多优点,比如安全性、隐私性更高,而且也有效防止了双花攻击等等。

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

截止到这里,我们就明白了UTXO究竟为何物,一枚BTC从挖矿产生,到不停地被交易,其实整个体系中存在的就是很多个UTXO。也有这么一句话:其实就没有什么比特币,有的就是UTXO。这么说其实是对的,因为这就是比特币交易的方式。比特币没有实物,只有数据,UTXO就是它的存在形态。

 

总结一下,UTXO的三个原则

  1)所有交易始于coinbase(即始于挖矿奖励所得);

  2)除了coinbase交易之外,所有的交易输入都必须来自于前面一个或者几个交易的UTXO输出。

  3)每一笔的交易支出总额等于交易收入总额;

  UTXO与支付系统账户模型的区别是什么?

  1)在比特币系统中,没有账户的概念,所以也就没有余额的概念,有的只是UTXO,比特币交易系统中,用一连串的关联交易来计算,某地址(类比于账户系统中的账户概念)下究竟有多少UTXO,通过这个UTXO计算值来确定,一个地址是否具有转移出一笔交易的能力。

  2)区别

  在支付系统账户模型中,一个账户具有账户名(账户唯一ID)和密码,通过账户ID和密码认证,即获得了对该账户的使用权和支配权。也就是说,该账户内的所有资产归经过密码安全认证的人所有。

  在比特币交易系统中,没有账户iD和账户密码一说,也没有账户余额计算一说。但是 有公钥(钱包地址)和秘钥,可以浅显的类比理解为:公钥就是账户ID,私钥就是账户密码。在比特币交易系统中,知道对方公钥,就可以给对方转账进行交易。拥有了私钥,就代表着拥有了该地址下所有UTXO的使用权和控制权。

  PS:上文说到,在支付系统账户模型中,会遇到常见的“双花攻击”,在比特币交易系统中,没有账户余额概念,但是有某地址的净未花费交易输出个数,这个数值计算,从上到下扫描一遍同一地址所有的进进出出,立等可取。你只要等上6个区块的确认时间,就能确保不被双重支付,因为这笔交易得到了全网的确认;