经常看到区块链技术中提及UTXO,究竟什么是UTXO呢?
————————
个人技术公众号:解决方案工程师
欢迎同领域的朋友关注、相互交流。
————————
搜索了半天,讲的都不太好理解,尤其是不明白UTXO比现在的记账方式有哪些优势。
集百家之长,成一家之言。我来通俗地讲一讲吧。争取看了这篇讲解,就不用像我一样,搜这个问题搜了十几个网页。
比较统一的解释:
UTXO(Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。
读完这段话,似懂非懂,但仍然不明白这样设计的目的是什么。
我就以自问自答的方式来讲讲,中本聪为什么设计UTXO这个机制吧。
区块链是怎么记录比特币交易的?——记账。
怎么记账?——每个区块是由区块头和区块体组成,区块体中有账本,在账本上记就行了。
那如果交易特别多的话,记录的信息会不会很占内存?——如果像支付宝的账单、微信支付的账单那样,是很占内存的。比如,你有10元钱,花了5块钱,出来一个“-5元”的账单;然后收到3元钱,又出来一个“+3元”的账单;... ... 以此类推。那么计算余额时是这样计算的:“10-5+3=8(元)”。不但计算过程比较复杂,还很占内存。
有多占内存?——假设比特币和传统货币一样,使用账户余额系统,首先需要一个数据库,记录所有人的余额。这里假设全世界使用比特币的用户有10亿人,每个人每天交易10次,那么平均每秒余额变动将达11万次,如果按照这个频次继续下去,用不了多久相关数据就会撑爆线上的服务器。
那怎么办呢?——所以,中本聪提出了UTXO,一种基于交易的记账方式。刚才讲的,支付宝、微信那种记账方式,是基于账户的记账方式。仍然举这个例子,通过使用UTXO记账方式。比如,你有10元钱,花了5块钱,出来一个“之前剩余10元,现在剩余5元”的UTXO账单;然后收到3元钱,又出来一个“上次剩余5元,现在剩余8元”;... ... 以此类推。那么这种模式下,即使你之前的账单丢失了,也能知道当前的余额。并且与基于账户的记账方式相比,在计算复杂度、存储空间等方面,都很占优势。
哦,大体明白了,那我支付宝里钱,每花一笔钱,余额会减少相应的钱数啊,感觉也很方便啊?——是的,那是因为第三方中心化机构在你历史的交易账单基础上计算出来的。但是去中心化的系统中,你的余额没有第三方中心化机构给你计算余额,所以每次都得通过历史账单自己计算余额。这就回到了开篇提出的“占内存大”的问题了。
附上一个 UTXO账单解释图。(图片来源于知乎作者:悦诗LY)
相信大家应该能明白UTXO的概念和工作方式了吧,UTXO的方案简单到极致,只确认交易本身。总结一下UTXO的优点:
(1) UTXO不能分割,只能被消耗,独立的数据结构大大减少了计算量。
(2) UTXO配合地址使用,具备天然的匿名性,保证了账户的安全。
(3) 因为地址的存在,UTXO的销毁和产生,都可追溯,很难伪造。
(4)长期来看,UTXO的数据占用更小,而余额系统会越来越臃肿。
所以大家看明白了吧,比特币不是具体的钱币,只是UTXO账单上的一个数。
最后,附上一段话。正如,中本聪在比特币白皮书上说:
It should be noted that fan-out, where a transaction depends on several transactions, and those transactions depend on many more, is not a problem here. There is never the need to extract a complete standalone copy of a transaction’s history.
当一笔交易基于之前的多笔交易时,这些交易又各自基于多笔交易,但这并不存在任何问题。因为这个系统永远不需要提取一份所有历史交易的完整记录。