查看原文
其他

【国盛区块链】一头猪告诉你为何没有比特币而只有UTXO——大话区块链(二十)

国盛区块链研究院 吉时通信 2019-06-24

导读

小明闲来无事,仔细研究了一下比特币的白皮书(《Bitcoin-A Peer-to-Peer Electronic Cash System》),白皮书给出一个惊人的结论:自己的比特币账户并没有余额!吓得小王赶紧打开自己的比特币钱包查看,还好还好,自己那半个比特币还在。可是白皮书说,并没有比特币,只有UTXO,甚至有人说,了解了UTXO,就理解了比特币,这是怎么回事呢?


1. 当前最流行的“账户余额模型”

账户余额模型,是目前应用最为广泛的账户交易数据结构和存储模型。这非常好理解,在中心化的社会里,我们太熟悉这样的操作了:小明要给小红转账1块钱,小明跑到银行某个网点,在柜台发送指令给银行的中央服务,中央服务器要做2件事:


1)检查并确保小明的账户余额大于1块钱;

2)然后在小明的账户里扣除1块钱,同时给小红的账户里增加1块钱。


现在的银行、信用卡和证券交易所以及第三方支付系统都是类似的操作方式,其账户数据库的核心都是由关系数据库支撑的基于账户(account based)的设计。


数据库要确保两点,第一是你要确保业务规则得到遵守,即余额充足。第二是确保事务性,也就是原子性、一致性、隔离性、持久性(ACID)。这些都是数据库的常识性知识,请各位自行搜索相关知识。


这种基于账户余额的数据库设计,简单直观,已经广泛应用运行了几十年。其优点是易于理解和实现,且由于没有“币的来源”这一概念,很难实现对来源的追踪和回溯。


同时,其缺点也非常明显:一笔交易要同时记录多个(至少2个)账户的输入和输出确保平衡,数据库膨胀的厉害,另外,在处理并行交易方面劣势明显,也就是说,小明同一时间只能做一次转账,如果有多笔转账,肯定要排队了。


上述模型的核心是共享状态,即要对每个账户的余额情况(状态)要实时监控。因此并行交易受到了限制,且状态信息往往是非常繁冗的。

 

我们来了解下以太坊(Ethereum)的账户余额模型工作原理。Ethereum用账户余额模型来存储区块链中的数据,如下图:



在 Ethereum 中的交易是在被合约代码控制的账户中进行的(另外Ethereum还有一个类似BTC的UTXO账户),能够将每一笔交易执行并保存在合约中。


交易过程中,Ethereum只有from和to两个地址,对应付款者和收款者,每当一个交易被 Ethereum 主网确认后,from 和 to 账户的 Ether 余额就会变动,系统使用 gas 和 gasPrice 来表示手续费。



数据来源:draveness.me


Ethereum 就像一个状态机,它接受一个又一个的交易并不停更新自己的状态。这跟传统的银行、证券、第三方支付的账户余额模型工作方式基本一致。


2. 比特币的世界里,唯有UTXO才是账本中真实的存在

UTXO是比特币交易的基本单位,它的全称叫Unspent Transaction Output,因为外国人习惯把Translation叫做TX,所以就简称为UTXO,翻译过来它就是一个未经花费的交易输出。


UTXO是不能再分割、被所有者锁住或记录于区块链中的并被整个网络识别成货币单位的一定量的比特币货币。


业界有说法:中本聪为比特币带来三个绝妙的原创设计,一个是区块链的设计,一个是智能合约,一个是UTXO。甚至有夸张说法:了解UTXO,就了解了比特币的一切。那么,到底UTXO是什么?小王的比特币又去哪里了呢?本文通过详细解释,带你进入神奇的比特币世界。

 

比特币白皮书中弃用账户/余额,而采用了UTXO,是伟大而明智的选择。在比特币白皮书原文中,第9节《Combining and Splitting Value》(《价值的组合与分割》)中是这样描述的:


Although it would be possible to handle coins individually, it would be unwieldy to make a separate transaction for every cent in a transfer. To allow value to be split and combined, transactions contain multiple inputs and outputs. Normally there will be either a single input from a larger previous transaction or multiple inputs combining smaller amounts, and at most two outputs: one for the payment, and one returning the change, if any, back to the sender。


翻译过来就是:虽然对币可以进行单独处理,但是在转账中为每一个币创建一个独立的交易是不明智的。未来让价值方便组合和分割,交易包含多个输入和输出。通常会有来自先前交易中的一个较大值的输入或多个小数值组合成的输入,最多两个输出:一个用于支付,一个作为找零(如果有的话)返回给发送者。白皮书给出这样的图示:



这样做有什么好处呢?白皮书中继续说:


It should be noted that fan-out, where a transaction depends on several transactions, and those transactions depend on many more, is not a problem here. There is never the need to extract a complete standalone copy of a transaction's history.


即:需要说明的是,(通常)一项交易记录依赖于多个交易记录,这些交易记录继续依赖于更多交易记录的问题,在这里将不成为问题。(UTXO体系下)永远不需要提取一个完整的独立交易历史副本。


简单说,UTXO模型记录的事件,而非状态,这大大简化了数据结构,相当于系统只记录“有用的信息”:


数据来源:CSDN


如上图,假设Alice挖矿获得了12.5个BTC奖励,那么此时它的公钥(地址)里就有了12.5个BTC的未花费输出,即UTXO,也就是说,这12.5个BTC是一个还没有花出去的输出,形成了一个完整不可分割的UTXO。


如果Alice转账给Bob 10个BTC,那么原来那个12.5个BTC的UTXO即被消耗掉,不复存在,产生了2个新的UTXO(10 BTC 和2.5 BTC)被分别记录在各自的公钥上,当然考虑到手续费的情况,Alice的找零略小于10个BTC。


这些UTXO之间通过引用交易ID(交易编号)组成链式结构,当然,所有的UTXO都可以通过交易编号追溯到最初挖矿产生的那一刻,即Coinbase交易。而区块链账本里只需记录UTXO信息即可,并没有账户余额的概念。


一个UTXO是不可分割的,如果产生一笔交易,相关的UTXO即被消耗而消失,产生新的UTXO,这些UTXO之间组成链式结构,钱包软件只计算UTXO的总和显示为账户余额,当然,UTXO可以有找零和组合,以满足不同数值的交易,其最小单位是聪(亿分之一)。


数据来源:draveness.me



3. 让一头猪解释UTXO给你听

如果你觉得理解起来太费解,那举一个形象的例子——以一头猪肉的流通史为例。


假设2100万枚比特币的UTXO就一头猪身上的肉,都是有限且固定量的,coinbase挖矿产生的比特币就好比屠宰场已经完成屠宰的某个部位。这个时候屠宰场会给这块猪肉(假设10Kg)做一个签章,记录出厂信息,这就是UTXO。


这块猪肉出厂旋即被转运到某个零售商A处,那么A即拥有了这块猪肉,这时候A并非出售这块猪肉的任何一部分,即UTXO(编号为1),这是一块未经花费的猪肉,重量是10Kg。


零售商A接下来把这块猪肉按重量平均切成2半,各自签章记录好信息,其中的一半卖给某大型商超B,那么原来的猪肉不复存在,相当于UTXO(1)被消耗掉,从而产生两个新的猪肉,我们记录他们为UTXO(2.1)和UTXO(2.2),其中UTXO(2.1)作为找零仍然归A所有(但是它已经不再是之前的带有出厂签章的猪肉了,已经变成了新的签章的猪肉了),这是A的未经花费的输出。另一块猪肉UTXO(2.2)流转到B的手里,在B还没有卖出去之前,它属于B的未经花费的输出。



如果B想卖7近猪肉给某小超市C,那么需要凑齐超过7Kg的猪肉,除了UTXO(2.2),可能还需要B拥有的另外一块猪肉,姑且命名为UTXO(x.y),它的重量是3Kg。那么B可以把这里两块猪肉凑齐7Kg卖给C,同时产生一个新的UTXO(m.n),同时B获得一个找零,2Kg的UTXO(p.q),以此类推。



无论怎样,这些UTXO之间都通过交易号串成链式结构,甚至夸张地说,每一个猪肉分子都可以追溯到最早出厂的时候的部位信息,就好比每一个比特币都可以追溯到Coinbase挖矿产生时的信息。


系统只要记录每一次物流信息,即只需要记录每次新产生的未经卖出的猪肉的UTXO编号即可。


传统的账户余额模型是怎么记录的呢?首先,系统为屠宰场以及物流的每一个环节(包括消费者)创建一个账户,分别为屠宰场、物流商A、B…直至消费者Z。那么每一个账户的输入输出信息都要完整记录,当然,首先还要检查一下当前账户的余额是否充足。


假设一块肉从A流通了10个环节,那么,要全网检查10次当前账户的余额,然后记录一下交易账户双方的输入输出信息以及余额信息。显然这种账户余额模型相对来说比较复杂,而且如果A想卖给B和C一部分猪肉,那么通常情况下,这两笔交易要排队,每次交易之前都要确保A的账户余额充足。


4. UTXO和账户余额模型在双花问题上的处理比较

当然,UTXO带来的双花问题也是显而易见的。当我们需要计算某个地址中的余额时,需要遍历整个网络中的全部相关区块,同时,并行的处理交易虽然可行,不过并行的创建交易却会出现很多问题,例如多笔交易使用了同一个 UTXO,导致双花。


传统的账户余额模型,由于是记录全局状态的模式,解决双花问题比较简单,只要每次交易之前检查一下账户余额、串行处理交易就OK了。在银行这类中心化的账户系统里面,中心机构负责维护用户的账户信息,双花问题的避免主要依赖于中心机构的信用。由于Ethereum系统不断更新系统的状态,交易发生时,系统会根据from账户地址的余额充足情况来进行转账处理。


面对“双花问题”,比特币系统是这样解决的:

首先,每笔交易都要先确认对应比特币当前的情况,即要检查它是否存在于付款者的UTXO中;

如果不在,那么该交易会被系统拒绝;

如果付款者用同一笔UTXO付给2个人,系统中的节点只确认先接收到的那一笔。


当两笔时间上很接近的交易被不同节点确认,会导致区块链发生分叉。剩余节点会选择在他们认为的最长链作为主链,持续构建新的区块。当其中一笔交易被6个节点确认后,它将成为系统最长链,作为主链,可以认为这笔交易获得了最终的确认。其他分叉则不被系统认可。


5. UTXO意义深远

1. 比特币系统运行近10年来,数万台计算机在UTXO规则下共同维护市值高达数千亿美元的账本,从未发生过一起成功的攻击,也未产生任何的混乱,这是没有一个中心机构组织账户情况下,比特币系统信用的源泉;


2. UTXO确保了比特币的匿名性和隐私性,一个用户的比特币余额是钱包软件聚合用户的UTXO计算出来的,如果用户启用了新的地址用于转账和交易,新地址与原地址之间的关系很难被追踪,更好地保证用户的隐私,而传统的账户余额模型无法做到;


3. 由于没有账户余额的概念,UTXO很好地完成了比特币系统的去中心化,UTXO不仅能够确保每一枚(聪)比特币的来源有据可查,又满足了因私匿名;


4. 不同于账户余额模型需要记录一切账户的状态信息,UTXO由于只记录有用的事件信息,大大简化数据的存储,运行近10年,其账本才200GB左右,从数据存储角度来说,这绝对是比特币的伟大之处;


5. 由于不同于账户余额模型,UTXO并行地处理交易不会出现任何问题,提升了系统的交易验证速度;


6. 同时不可变的账本能够让我们在 Bitcoin 节点快速更新时,也能分析某一时刻整个网络中数据的快照;


7. UTXO 模型通过链式的方式组织所有交易的输入和输出,每一个交易的输出最终都能追寻到一个 Coinbase,也就是当前 Bitcoin 被挖出时的区块的第一笔交易,相当于可以追踪币的一切历史来源,使得“每一个币”(最小单位是聪,即亿分之一)的来源都可以追溯,确保比特币系统的信用基础;


国盛区块链系列——【对话区块链大佬】


2016.03.20 对话区块链大佬1:前沿探索——“和清华大学物理学博士聊聊区块链“


2016.04.19  对话区块链大佬2:小蚁Onchain达鸿飞——【漫画区块链之应用篇:对不起,地球人……】


2016.06.01 对话区块链大佬3:BitSE(唯链Vechain)COO陆杨——区块链在供应链溯源、防伪领域应用


2016.06.16 对话区块链大佬4:《区块链新经济蓝图》主编、DACA区块链联盟秘书长韩锋——区块链与意愿经济


2016.06.17 对话区块链大佬5:OK Inc. 副总裁段新星——区块链:重塑经济与世界


2016.06.21 对话区块链大佬6:世泽律所合伙人孙铭——DAO遭遇黑客攻击的法律分析


2016.06.22 对话区块链大佬7:比特大陆CEO助理张原——比特币矿机芯片的今天与明天


2016.07.12 对话区块链大佬8:StoneLedger创始人鲁斌——智能合约的前沿研究


2016.07.13 对话区块链大佬9:小蚁Onchain创始人达鸿飞、VP陶荣祺——区块链ICO究竟是什么鬼?


2016.07.19 对话区块链大佬10:布比联合创始人杨帆——区块链商业应用如何落地?


2016.07.23 对话区块链大佬11:巴比特COO屈兆翔——区块链能防止淘宝刷单?


2016.07.28 对话区块链大佬12:FinTech如何拥抱区块链?金丘实业(837901)为您解读


2017.06.10 对话区块链大佬系列13:QTUM发起人,帅初——解读2017最赚钱ICO项目




国盛通信区块链系列——【大话区块链】


2016.04.08  大话区块链(一)——最初的梦想【国君通信宋嘉吉团队


2016.04.10 大话区块链(二)——去中心化?你几个意思?国君通信宋嘉吉团队


2016.05.03 大话区块链(三)——由魏则西事件说开去【 国君通信宋嘉吉团队


2016.06.03 大话区块链(四):告别晦涩,说说大家都懂的理儿【国君通信宋嘉吉团队


2016.06.19 大话区块链(五):谁家的娃不犯错?【国君通信宋嘉吉团队


2016.06.27 大话区块链(六):我们为什么如此看好区块链主题? 【国君通信宋嘉吉团队


2016.08.30 大话区块链(七):Talk is cheap,show me the code 【国君通信宋嘉吉团队

 

2017.08.14 大话区块链(八):平行世界里的疯子和骗子【国君通信宋嘉吉团队】


2017.12.13 大话区块链(九):比特币、迅雷和云撸猫【国君通信宋嘉吉团队】


2017.12.27 大话区块链(十):区块链和代币【国君通信宋嘉吉团队】


2018.1.4 大话区块链(十一):梦百合携手唯链,海外区块链上市公司又在做什么?【国君通信宋嘉吉团队】


2018.1.30 大话区块链(十二):当买矿机概念股时,你买的是什么?【国君通信宋嘉吉团队】


2018.3.13 大话区块链(十三):台北遇到区块链


2018.3.30 大话区块链(十四):A股上市公司区块链布局的昨天、今天和明天


2018.5.02 大话区块链(十五):QTUM假期亮相,”卡牌对战“玩法渐多


2018.6.16【国盛区块链】比特币避险性的实证研究——大话区块链(十六)


2018.6.23 大话区块链(十七):一图看懂“交易挖矿”的市场竞争逻辑


2018.08.06 大话区块链(十八):你参加的同学聚会是否也要来场“币改”?


2018.07.25 大话区块链(十九):从唯链双币制说开去



国盛通信区块链系列——【区块链深度】


2016.02.28 区块链首次深入解读:巨头引领变革,区块链大有作为【国君通信宋嘉吉团队】


2016.04.13 最通俗、最诙谐解读,阅读量过12000【漫画区块链:我和小明的2块钱恩怨情仇】


2016.04.21 区块链行业跟踪:分布式总账联盟成立,区块链标志性事件出现【国君通信宋嘉吉团队】


2016.07.05  没想到你是这种区块链!【国君通信·海外区块链风云榜(上)——底层技术谁领风骚?】


2016.07.06 区块链的红旗还能扛多久?【国君通信·海外区块链风云榜(中):合纵连横,平台初现】


2016.07.07 开启“区块链+”的时代【国君通信·海外区块链风云榜(下):戒骄戒躁、精选场景】


2016.07.15 区块链帅得惊动CCTV!国君通信宋嘉吉应邀解读投资机会


2016.08.09 IBM与区块链的那些事儿 ——“链秀”全球区块链项目路演大会【国君通信宋嘉吉团队】


2017-01-05 【国君通信宋嘉吉团队】电话会议纪要:最赚钱投资标的解读——如何投资比特币


2017-05-03 【国君通信宋嘉吉团队】善粮味道——区块链+农业最新案例分享!


2018-07-08 芯片创新or金融工具?——矿机行业深度研究【国盛区块链】





    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存