Loading

比特币UTXO模型是什么?有什么作用?

2021-02-04 23:05:02 4

首先,比特币系统中,是没有严格意义上的“账户”概念的,取而代之,比特币系统提出了其独特的未消费的交易输出( Unspent Transaction Output, UTXO)模型,我们简称UTXO模型。UTXO是一个包含交易数据和对应的执行代码的数据结构,所有的UTXO条目构成了比特币的“账本”,其中每个传统意义上的“账户”的数据可以通过与它相关的UTXO推断出来。


在一个具有传统“账户”概念的传统支付系统中,每个用户都对应着一个账户,支付系统会对每个账户的余额进行单独地记录和管理。当系统中有用户之间发起了支付的交易,支付系统会分别对参与交易的账户的余额信息进行检查和修改。例如,A向B转账50元,首先需要检查A的账户中有50元的余额,再从A的账户中扣除50元,并向B的账户中添加50元。可以看到,为了保证整个系统的正确性,防止双花等情况的存在,支付系统需要确保对应的业务规则得到遵守(A的账户中至少有50元的余额),同时也需要保证每个交易的“事务性”,即原子性、一.致性、隔离性及持久性( ACID)。简单来说,即保证从A账户扣款和向B账户添加款项这两个动作必须同时执行,不受其他事件影响,且不会丟失。


然而,比特币系统并没有采取如此的设计,而是创新性地提出了UTXO的方案。UTXO方案的核心就在于,通过交易本身来构成系统账本,而不是通过账户信息构成账本。具体地讲,在比特币的每一笔交易(TX)中 ,都有“交易输入”(资产来源)和“交易输出"(资产去向),且每个交易都可以有多个交易输入和多个交易输出,交易之间按照时间截的先后顺序排列,且任何一个交易中的交易输入都是其前序的某个交易中产生的“未花费交易输出”,而所有交易的最初的交易输人都来自于coinbase交易,即矿工得到的挖矿奖励。


我们举出一个例子来说明UTXO模型下的转账过程。首先,矿工A挖到了12.5枚比特币,此后,他进行了两笔交易:首先,他将自己拥有的5枚比特币转账给了B;一段时间后,他又与用户B合资,每人各出2.5枚比特币付给用户C。在UTXO系统中,这样的一系列操作可由三个前后依赖的TX完成,见图1-图3


图1

111.png

图2

222222.png

图3

33333.png

图1-3是这一系列交易的起始交易,交易#1。可以看到,该交易无交易输人,表示来源为coinbase. .即矿工挖出一个区块的奖励,且仅有一个交易输出,对应着接受该区块奖励的矿工的地址。这个交易就提供了一个UTXO,即可以理解为地址A有了相应数额(12.5)的未消费交易输出储备,此后,可以基于该UTXO进行进一步的交易。


图2是举例交易中的第二个交易,在该交易中,交易来源引用了交易#1的未使用交易输出作为交易输入,且有两笔对应该交易输人的交易输出,分别编号为1和2,其中编号为1的交易输出指向了B,即意味着地址B现有了价值5个比特币的UTX0可以在后续交易过程中引用,(相当于A向B转账了5个比特币)。编号为2的交易的交易输出指向了A,意味着作为交易输入的交易#1还剩余的7.5个比特币又(作为找零)流入了A的地址,即A后续仍可以用价值7.5个比特币的UTXO作为交易输人。


图3是示例交易过程的最后一步,即用户A与用户B合资,每人各出2.5枚比特币付给用户C。在该交易中,交易输入引用了交易#2中的两个UTXO,分别是交易#2中的1号交.易输出和2号输出。而对应的交易输出则有三个,其中,编号为1的交易输出流入了C的地址,价值5个比特币,剩下的2号和3号交易相当于对A和B的找零,分别对应着A和B提供的交易输入在该交易中未使用完的部分。


从上述的例子可以看出,比特币系统中,实际上不存在明显的“账户余额”概念,每个账户都对应着某个地址,而某个地址在某个时间点所具有的“余额",是需要通过他具有的UTXO的情况进行计算得出的。在比特币系统中,这种跟踪计算由比特币钱包代为负责。基于如此设计的UTXO系统,比特币如何保证UTXO只能被对应的地址所引用为交易输人呢?答案是比特币的脚本特性。比特币支持较为简单的交易脚本编写,用于对相应资产使用方式的规则的制定。


标签: UTXO模型