理解UTXO账户模型
Posted lingyaoyao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解UTXO账户模型相关的知识,希望对你有一定的参考价值。
什么是UTXO?浅谈比特币账户模型
1:什么是UTXO?
UTXO的英文全称为Unspent Transaction Output,汉语翻译过来则为:未消费的交易输出。我们可以把UTXO理解为交易过程中的一个数据结构。未花费的交易输出UTXO是一个包含交易数据和执行代码的数据结构,可以通俗的理解为某仓库(某地址)已经收到的但是尚未花费出去的加密数字货币。基于区块链的加密数字货币使用UTXO来验证一个人(其实是一个地址)是否拥有未使用过的加密数字货币用于支付。
UTXO模型是中本聪在bitcoin模型中初创并引用的,因为我们谈到UTXO总会首先联想到比特币,但是需要额外指出的是:UTXO不是比特币独有的,当然 UTXO跟区块链也没有必然的联系,比如你可以模仿比特币但是不使用UTXO模型。
PS: 有一些博文中将其解释为未消费的事务输出。
个人认为不合理,比特币的流转过程是一个输入与输出的过程,我们知道比特币只是一个以区块链为底层技术的应用之一罢了,所以比特币本身践行着”价值“的传输(”价值“的传输模式 是为了区分现行互联网上的”数据“传输(字节复制),比如传输一个文件),这个价值转移的过程,其实就是交易的过程。
说道这里,想解释一下TX的含义,通过上面的英文全称解析,我们知道TX代替的是Transiaction。但是为什么呢?
原因1:在比特币社区里,大家习惯性的用TX来代替交易Transaction。
比特币区块描述
其中:TX代表的是Transaction,其中数字“44”代表的是本区块打包的交易笔数。
PS1:关于区块结构及解析,将会在本专栏系列文章中进行详细解读,敬请期待。
PS2:至于什么是加密数字货币浏览器? 什么是加密数字货币(什么是比特币)?将会在本专栏系列文章中进行详细解读,敬请期待。
2:常规的账户余额系统与比特币的账户模型是什么?
我们常规理解的账户余额系统是什么样子的?下面举一个转账的例子
Case背景: TT 在某第三方中心化支付系统账户(比如招商银行的账户)上有存款1000元,ZY有2000元,TXT有3000元。
操作如下:
操作1:TT某天向ZY转账800元;操作2:ZY然后向TXT转账500元。
假设平台手续费为0,那么在每一步操作,第三方支付账户系统需要做如下逻辑(以操作1举例说明):
(1)判断TT账户余额是否足够800元,如果不够 ,操作失败,取消交易。如果足够则转向(2);
(2)TT账户余额减少800,同时ZY账户余额增加500;这一步操作是事务性操作,可以理解为同成功,同失败。
其中第(2)步,如果间隔有时差(现实中会有这种情况),那么就会出现常见的“双花问题”(也叫双重支付攻击,double spent attack)
操作1结束,操作2类似,不详细描述,如下图所示
转账操作前初始状态
操作1转账之后余额状态
操作2转账之后余额状态
(1)现在的银行支付系统、证券交易系统,包括互联网第三方支付系统(比如支付宝等),其核心都是基于账户(account based)的设计,底层数据都是由关系型数据库(RMDB:Relation Manage DataBase)支撑。
(2)RMDB的好处是可以支持事务性操作,RMDB所具有的ACID特性(原子性,一致性,隔离性,持久性)。
比特币的账户模型就是基于UTXO数据结构
业内流行一句话:”其实并没有什么比特币,有的只是UTXO“---孟岩;个人表示赞同。
在比特币交易中,每一笔交易都会有”交易输入”(即资产来源)和“交易输出”(即资产去向,当然比特币模型里叫做未花费的交易输出)。
可以通俗的理解为:别人付给你的钱是“交易输入”,你收到的钱是“交易输出”。
每一笔交易当中有可能有多个“交易输入”和多个“交易输出”。每一笔交易都是按照时间戳发生的顺序,使用固定编码编排的。
而且,任何一笔“交易输入”都是前序某个交易当中产生的“未花费交易输出”,就像接链条一样,前后互相链接,前一个链条块的输出就是后一个链条块的输入。
一笔UTXO交易的组成
一笔比特币交易的流程是什么样子呢?下面举一个例子来解释下:
Case背景:TT的钱包(对应公钥地址A)里有12.5个比特币(其实就是UTXO),ZY钱包(对应公钥地址B)里拥有5个比特币,TXT钱包(对应公钥地址C)里有0个比特币。
操作(1)TT给TXT支付一笔5个比特币;
操作(2)TT又给TXT支付一笔2个比特币;
操作(3)ZY给TXT支付一笔1个比特币;
操作(4)TXT给其他某个人转出支付一笔3.5个比特币。
那么,TXT的钱包里的比特币(UTXO)变化是什么样子呢?
比特币变化结果如下:
操作(1)之后,TXT钱包里有一笔大小为5的UTXO收入交易记录,共一笔,净UTXO:5;
操作(2)之后,TXT钱包里有一笔大小为5的和一笔大小为2的UTXO收入交易记录,共两笔,净UTXO:7;
操作(3)之后,TXT钱包里有一笔大小为5的,一笔大小为2的和一笔大小为1的UTXO收入交易记录,共三笔,净UTXO:8;
Caution:
操作(4)之后,TXT的钱包里基于(3)的基础上,新增一笔支出大小为5个UTXO,然后新增一笔大小为1.5的收入交易记录。净UTXO:3-->4.5(终态);
为什么呢?
原因是:UTXO模型中,交易处理的基本单位是一个交易记录,任何一个交易的输入都是某一个交易的输出。可以浅显的理解为:上述的三笔收入分别为1,2,5个大小的UTXO为三个面额为1,2,5的硬币,硬币的消费是不会掰开花的,只能拿出合适的一个全花出去,然后接受对方找零(其实不是对方找零,而且比特币交易系统自动为我们做的找零操作,UTXO接收方(目标地址)是感知不到的);
总结一下,UTXO的三个原则
1)所有交易始于coinbase(即始于挖矿奖励所得);
2)除了coinbase交易之外,所有的交易输入都必须来自于前面一个或者几个交易的UTXO输出。
3)每一笔的交易支出总额等于交易收入总额;
UTXO与支付系统账户模型的区别是什么?
1)在比特币系统中,没有账户的概念,所以也就没有余额的概念,有的只是UTXO,比特币交易系统中,用一连串的关联交易来计算,某地址(类比于账户系统中的账户概念)下究竟有多少UTXO,通过这个UTXO计算值来确定,一个地址是否具有转移出一笔交易的能力。
2)区别
在支付系统账户模型中,一个账户具有账户名(账户唯一ID)和密码,通过账户ID和密码认证,即获得了对该账户的使用权和支配权。也就是说,该账户内的所有资产归经过密码安全认证的人所有。
在比特币交易系统中,没有账户iD和账户密码一说,也没有账户余额计算一说。但是 有公钥(钱包地址)和秘钥,可以浅显的类比理解为:公钥就是账户ID,私钥就是账户密码。在比特币交易系统中,知道对方公钥,就可以给对方转账进行交易。拥有了私钥,就代表着拥有了该地址下所有UTXO的使用权和控制权。
个人理解:
以上是关于理解UTXO账户模型的主要内容,如果未能解决你的问题,请参考以下文章