理解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的使用权和控制权。

个人理解:

猜你喜欢

转载自www.cnblogs.com/lingYaoYao/p/9270211.html