UTXO 未消费交易输出

UTXO 的英文是 Unspent Transaction Output ,翻译过来叫“未消费的交易输出”。应该这么说,比特币的核心概念交易,交易的核心知识点就是 UTXO ,所以这篇中咱们好好聊聊这个 UTXO。

交易的组成要素

比特币中是没有账户这个概念的,所谓一个地址的余额,其实就是统计这个地址相关的所有交易,然后运算出来的。所以我们把显微镜调调焦距,先看看一个交易中都包含哪些要素。

第一个要素是输入,也就是 input ,通常 input 是由父交易的 output 提供的。首先,并不是所有的交易都有父交易。比如每个区块里面都有一个矿工自己构建的特殊交易,也就是所谓的 coinbase 交易,它就是一个没有父交易的交易,而 coinbase 交易的输入就是 coinbase 。除了这个特例之外,其他的交易都是由父交易的输出来作为输入的。父交易的输出必须是“未消费过”的,也就是从来没有被用于作为其他交易的 input 过。

于是我们就很自然的进入了第二个要素,也就是交易中应该包含 output 。output 是个术语,翻译过来也就是“输出”。在小明给小刚转账一个比特币的交易中,交易的 output 就是指向小张的地址的这一个比特币。这样,UTXO 中的后三个字母 TXO ,其中 TX 代表交易,O 代表 output,我们就理解了。最后一个 U 指的是 unspent,也就是未消费。

最后一个要素就是手续费,一个非 coinbase 交易中输入要等于输出加上手续费,手续费是要转账给矿工的。讨论中为了简便,我们忽略手续费这一项。

理解的比特币交易的基本组成其实也就理解了 UTXO。到 blockchain.com 点开一个具体的交易,详情中可以看到咱们刚刚说的这几个要素。

凑输入和找零

UTXO 有个特点,就是跟硬币一样,不能掰开用,那么交易过程中如何凑够输入金额,又如何找零的呢?

小明给小刚转账1比特币。整个过程是这样的,小明要收集足够的输入,比如小明的地址对应的以往交易中,找到了一个面值为0.9的 UTXO,不够1比特币,好在交易中是允许有多个输入的,所以小明又找到了一个面值0.2的 UTXO,这样在这次转账的交易中,就会有两个输入。同时输出也会有两个,一个是指向小刚地址,面值是1比特币。另一个指向小明的地址,面值是0.1比特币,这个输出就是找零了。

梳理一下,整个流程是这样的:小明首先要凑够足够面额的 input ,这里他找到了两个 input,而这两个 input 本身都是以往交易的 output。这两个 output 在未消费之前,就是 UTXO,但是当前交易一旦生效,它们两个就会被消耗掉,而本交易中又会生成两个新的 UTXO,一个指向小明,一个指向小刚。相当于小明和小刚各种领到手一个硬币,未来可以在其他交易中去消费。而小明和小刚各自地址的余额,其实就是各自对应的所有 UTXO 的总和。

这样,交易中如何去凑够输入,如何生成输出,并进行找零,我们就清楚了。

为何使用 UTXO 模型?

到这里我们就有一个疑问了,比特币不就是个大账本吗?为何不采用账户模型,而要采用 UTXO 模型呢?

账户模型是传统银行或者类似于支付宝这种服务的基本模型,这个模型下,我有一个自己对应的账户,上面记录我有13块钱,那么13这个数字是明明白白记录到系统中的。账户模型的确是非常简单,也非常灵活,以太坊以及一些其他区块链项目中采用的就是账户模型。再看看比特币,小明有13个币,其实区块链上是根本没有13这个数字的,因为区块链上只有交易。但是我们打开 blockchain.com 这样的区块链浏览器,是可以看到一个地址对应的余额的,这是区块链浏览器自己运算出来的,不是区块链上本来就有的。

但是很多高手会说 UTXO 是一个非常棒的模型,主要是因为 UTXO 非常适合并行运算,这个特点在分布式的计算机网络中显得非常的巧妙。具体细节不是本文要关心的,推荐微信公众号 NervosNetwork 的文章《 UTXO 和 Account 模型对比》,里面有更详细的论述。

总结

UTXO 咱们就聊到这里,来总结几句。UTXO 是理解比特币交易的枢纽性概念,想要理解比特币底层原理的同学,这是一个绕不过去的坑。每个交易中,可以包含多个输入,并且通常包含两个输出,输出总额加上手续费正好等于输入总额。每个输出都跟硬币一样,有自己的一个面值,而且属于某个特定地址。还没有被当做其他交易的输入使用的输出,就是“未消费交易输出”,就是 UTXO。UTXO 模型中没有账户的概念,所以对比账户模型显得稍微绕一些,但是它本身其实也是有巨大优点的,例如非常有利于在分布式系统中进行并行计算处理。