到底什么是UTXO?
阿牛哥 Lv4

UTXO,这个简称经常出现在比特币相关的技术文章里,如果我们想对比特币有更深入的了解就绕不开这个概念,那到底什么是UTXO呢?

UTXO的含义

UTXO是英文Unspent Transaction Output的缩写,直译成中文就是“未花费的交易输出”,它是比特币交易的核心概念。了解它会让你更深刻的理解比特币的运作机制。

私钥、公钥和地址

用过比特币的人都知道,比特币似乎是没有账号这一概念的,有的只是收付款的地址,一个人可以有无数个钱包地址。而为了完全控制你的账户,必须保管好你的私钥,从某种意义上说私钥即账户。

比特币地址生成的方式如下:

  • 首先生成一个随机的私钥

实际上就是生成一个随机数,把这个随机数作为私钥使用。

  • 从私钥计算出公钥

公钥和私钥是一一对应的,一个私钥只能生成一个公钥。数学上可以保证,只能以私钥生成公钥,反过来却不行,也即是说这个过程是单向的,你无法从公钥推导出私钥来。

公钥和私钥是非对称加密算法所使用的术语。加密算法有两类,对称加密算法和非对称加密算法。所谓对称加密,就是用什么密码加密,就得用什么密码解密,这个密码就是密钥,加密解密是对称的,用的同一个密钥;而非对称加密就是加密和解密不能用同一个密码,如果加密用私钥,解密就得用公钥,加密用公钥,解密就得用私钥,加解密两侧不是对称的。

比特币为了保证安全性,采用的非对称加密算法叫做椭圆曲线算法,这种算法非常非常的安全,现实世界里不可能被破解。

  • 从公钥生成地址

地址是由公钥生成的,为了隐私性,我们不可能把公钥当地址用,所以中本聪设计出了从公钥生成地址的方法。一个公钥只仅可生成唯一的一个钱包地址。

所以总结起来私钥、公钥、钱包三者是一一对应的。而且是单向的,你无法从公钥推导出私钥,也无法从地址推导出公钥。

之所以要把地址的来历说清楚是为了方便理解接下来UTXO转账的过程。

UTXO与转账

了解了钱包地址之后,我们来看看比特币是如何记账的。

传统的账户模式

账户模式是一种非常直观且简单的模式。我们以银行账户为例说明。

比如张三、李四和王五在银行里都有一个账户,那么在银行那一端的账本里,他们的账户是这么做记录的。

从上图可以看出,银行的账本记录的是每个账户的余额,此时假如张三要转200元给李四,那么银行会做如下处理:

  • 验证张三的账户余额是否大于200
  • 如果张三的余额大于200,则将张三账户的余额减去200,同时给李四的账户余额增加200
  • 如果张三的余额不足200,则不进行转账。

转账完毕后,银行更新了账本里账户的余额:

这是传统的账本记账方式,是以账户为中心的一种很直观的记账方式。

比特币的UTXO模式

比特币没有采用以账户为中心的记账方式。

比特币的创新在于它记账记录的是交易过程,而不是记录余额。

还是以张三、李四和王五举例:假设一开始张三、李四和王五的账户都没有比特币,余额为0。一天张三通过挖矿获取到了12.5BTC,那么反映到比特币账本的数据是这样的:

比特币区块链上产生了一个新区快,区块中记录了张三挖矿的收益,交易在区块的coinbase部分,交易分为输入和输出两部分,输入即挖矿所得12.5BTC,输出即UTXO,记录了交易号,数额和收款地址。因为此矿是张三挖的,所以收款地址就是张三的钱包地址,也就是前文公钥生成的那个地址。

张三挖到12.5BTC后,想给李四转5个,当他在钱包中发起转账操作后。其他比特币矿工会将这笔交易打包上链。不同于挖矿收益所产生的交易,这是一笔普通的转账交易。一旦交易完成,在链上(账本)会记录如下信息:

所以可见,比特币的账本里从来不会记录每个账户(地址)的余额,而是记录着他们之间的交易,而交易的核心就是UTXO。

UTXO的特点

UTXO包含了转账的细节,UTXO的输入是资金的来源,是汇出资金的一方,而输出则是资金的去向,是接受资金的一方。UTXO有如下特点

  • UTXO的输入和输出的金额始终是相等的。
  • 在普通交易里,UTXO的输入可以是一个或多个账户,输出也可以是一个或多个账户。
  • 每一笔交易都是可追溯的,当前地址的UTXO肯定来自之前别人的UTXO的转账,一直追溯下去直到最初挖矿的收益,这样保证了余额不可伪造或者重复支付。
  • 与传统账户模式相比,UTXO账本数据量更小。

UTXO转账的过程

当张三要转5个BTC给李四的时候,张三会创建一个交易,并将该交易提交给矿工,由矿工打包。交易地UTXO部分包含了李四地地址,一旦交易上链,代表资金已经转出,张三将失去对这5个BTC的控制权。

张三失去控制权后,是否意味着李四就立马得到了5个BTC呢?其实不一定,李四需要满足一个条件才能使用这5个BTC。

就是李四要证明他有那个地址对应的公钥和私钥。上文说过,地址是由公钥生成的而且是不可逆的,公钥是由私钥生成的,也是不可逆的。因此,李四要证明自己真的拥有这5个BTC,唯一的办法就是亮出自己的公钥。

亮出公钥后,人们确实相信这5个BTC是他的,但还会有一个问题,任何人只要知道了他的公钥岂不是都可以冒充他把BTC转给其他人?

因此,为了让他人绝对地信任李四就是该交易的发起者,他会用私钥给交易做一个签名,代表该交易的确是他发出的。因为冒充者没有他的私钥,所以不可能伪造出正确地签名的。

流程上一环扣一环,是不是很巧妙?

矿工是这些交易的执行者,负责上述转账过程的验证以及交易上链。

写在最后

UTXO是比特币账本的核心概念,它没有记录账户余额,而是记录了所有的交易,余额多少是根据历史交易计算出来的,这一点和以太坊是不同的,以太坊并没有采用UTXO,而是采用了传统的账户模式。所以并不是所有的数字货币都用UTXO记账的。

原本只想介绍下UTXO,没想到把交易的过程也做了说明。若有任何疑问,欢饮留言。