UTXO 的英文是 Unspent Transaction Output ,翻译过来叫“未消费的交易输出”。应该这么说,比特币的核心概念交易,交易的核心知识点就是 UTXO ,所以这篇中咱们好好聊聊这个 UTXO。
比特币中是没有账户这个概念的,所谓一个地址的余额,其实就是统计这个地址相关的所有交易,然后运算出来的。所以我们把显微镜调调焦距,先看看一个交易中都包含哪些要素。
第一个要素是输入,也就是 Input。首先,并不是所有的交易都有这一项。比如每个区块里面都有一个矿工自治的特殊交易,也就是所谓的 coinbase 交易,它就是一个没有 Input 的交易。这个交易中直接把一定数量的比特币转出给制作这个区块的矿工。除了这个特例之外,其他的交易都是有输入的。比如小明想给小刚转账1个比特币,这个交易的 Input 应该是啥呢?是和小明的地址相关的一些交易,更准确的说,就是这些交易中包含的属于小明地址的未消费的交易输出,也就是 UTXO 。
于是我们就很自然的进入了第二个要素,也就是交易中应该包含输出。“输出”是个术语,英文叫 Output。在小明给小刚转账一个比特币的交易中,交易的 Output 就是指向小张的地址的这一个比特币。这样,UTXO 中的后三个字母 TXO ,其中 TX 代表交易,O 代表 Output,我们就理解了。最后一个 U 指的是 Unspent,也就是未消费。小张如果从来没有用这个 Output 做过其他交易的输入,那么这个 Output 就是没有被消费过的,就是 UTXO。
最后一个要素就是手续费,一个非 coinbase 交易中输入要等于输出加上手续费,手续费是要转账给矿工的。讨论中为了简便,我们忽略手续费这一项。
理解的比特币交易的基本组成其实也就理解了 UTXO。到 http://blockchain.com 点开一个具体的交易,详情中可以看到咱们刚刚说的这几个要素。
UTXO 有个特点,就是跟硬币一样,不能掰开用,那么交易过程中如何凑够输入金额,又如何找零的呢?
小明给小刚转账1比特币。整个过程是这样的,小明要收集足够的输入,比如小明的地址对应的以往交易中,找到了一个面值为0.9的 UTXO,不够1比特币,好在交易中是允许有多个输入的,所以小明又找到了一个面值0.2的 UTXO,这样在这次转账的交易中,就会有两个输入。同时输出也会有两个,一个是指向小刚地址,面值是1比特币。另一个指向小明的地址,面值是0.1比特币,这个输出就是找零了。
梳理一下,整个流程是这样的:小明首先要凑够足够面额的 Input**,这里他找到了两个 Input,而这两个 Input 本身都是以往交易的 Output。这两个 Output 在未消费之前,就是 UTXO,但是当前交易一旦生效,它们两个就会被消耗掉,而本交易中又会生成两个新的 UTXO,一个指向小明,一个指向小刚。相当于小明和小刚各种领到手一个硬币,未来可以在其他交易中去消费。而小明和小刚各自地址的余额,其实就是各自对应的所有 UTXO 的总和。
这样,交易中如何去凑够输入,如何生成输出,并进行找零,我们就清楚了。
到这里我们就有一个疑问了,比特币不就是个大账本吗?为何不采用账户模型,而要采用 UTXO 模型呢?
账户模型是传统银行或者类似于支付宝这种服务的基本模型,这个模型下,我有一个自己对应的账户,上面记录我有13块钱,那么13这个数字是明明白白记录到系统中的。账户模型的确是非常简单,也非常灵活,以太坊以及一些其他区块链项目中采用的就是账户模型。再看看比特币,小明有13个币,其实区块链上是根本没有13这个数字的,因为区块链上只有交易。但是我们打开 http://blockchain.com 这样的区块链浏览器,是可以看到一个地址对应的余额的,这是区块链浏览器自己运算出来的,不是区块链上本来就有的。
但是很多高手会说 UTXO 是一个非常棒的模型,主要是因为 UTXO 非常适合并行运算,这个特点在分布式的计算机网络中显得非常的巧妙。具体细节不是本文要关心的,推荐微信公众号 NervosNetwork 的文章《 UTXO 和 Account 模型对比》,里面有更详细的论述。
UTXO 咱们就聊到这里,来总结几句。UTXO 是理解比特币交易的枢纽性概念,想要理解比特币底层原理的同学,这是一个绕不过去的坑。每个交易中,可以包含多个输入,并且通常包含两个输出,输出总额加上手续费正好等于输入总额。每个输出都跟硬币一样,有自己的一个面值,而且属于某个特定地址。还没有被当做其他交易的输入使用的输出,就是“未消费交易输出”,就是 UTXO。UTXO 模型中没有账户的概念,所以对比账户模型显得稍微绕一些,但是它本身其实也是有巨大优点的,例如非常有利于在分布式系统中进行并行计算处理。