中本聪有三个天才般的创举,一个是区块链的设计,一个是UTXO,一个是智能合约。而这三个设计是极为天才的,被斯坦福大学密码学和计算机安全教授 Dan Boneh 评价为”extremely brilliant”,”必将激发无穷的创新”。
UTXO,即未花费的交易输出(Unspent transaction output),基于UTXO的模型与银行使用的账户余额模型完全不同。
BTC账户中的余额不会显示成一个总数,而是由区块链网络中所有与当前账户有关的UTXO所组成的。BTC的每一笔交易都由输入和输出两个部分组成,输入代表的是转入到你的BTC地址上的币,输出代表的是你转出的币,未花费的交易输出会作为下一笔交易的输入。
中本聪在比特币白皮书中做出如下规定:”如果某笔交易的输出值小于输入值,那么差额就是交易费,该交易费将被增加到该区块的激励中。”
因为UTXO的这种特殊设计,转账BTC会生成两笔交易,一笔转给对方,一笔转给自己,俗称”找零”。
当我们在现实生活中进行资金交易的过程中,整个交易的流程往往是这样的,小黄得到了现金10元,转给小牛2元,那么小黄的账户在现有基础上减去2元,小牛的加上2元;小牛和小黄又分别转给小王1元,小牛和小黄的账户分别减去1元,在小王的账户上加上2元,整个交易过程如下图所示。
而在比特币交易中,我们是这样记账的。依然是刚才的流程,小黄通过挖矿获得了10比特币,他向小牛转了2比特币。后来小牛和小黄又各自向小王转了1比特币。整个交易流程如下图。
而三个人的比特钱包地址中只记录了这几笔交易的流水,并没有余额的概念,如下图。
每一个比特币交易都有若干个输入和输出组成,输入直白点讲就是你拿什么证明你能拿出这些比特币来给别人,那么这个证明就是前一个人给你的转帐记录。
小黄的比特币钱包地址中有两种交易类型,Coinbase是一种比较特殊的交易,是指小黄挖矿后的获得的奖励,这种交易实际上是没有输入只有输出的,输出的就是挖矿者小黄的比特币钱包地址,小黄此时要向小牛转2个比特币,那么输入就是小黄挖矿得来10比特币的这个交易,输出2个比特币给小牛,另外转8个比特币给自己。
输出的数量必须小于等于输入的数量,若没有把多余的比特币转回给自己,那么很可能会作为手续费奖励给记账的矿工。后续流程类似,小牛转给小王1比特币的输入是小牛从小黄那得到的2比特币。这样包含若干输入和输出得交易数据结构被称为UTXO即未花费的交易输出。数据库中有专门的表记录UTXO,一旦未花费得作为输入产生了其他输出,则输入交易就从UTXO表中删除。
那么中本聪为什么要采用UTXO而不是账户体系呢,一个比较直接的好处是交易可以并行处理,举个例子,在银行的账户体系下,如果你和你朋友都想操作某一个银行卡账户,这两笔交易在处理时有先有后。
例如,你想从账号里面转200块出来,而你朋友想向账户里存100元。在他操作存款的时候,你操作了转出200元,那么页面上你也许看着是操作成功,进入银行处理状态了,但是银行在真实处理这两笔交易时是有明确的先后顺序的,如果你朋友并不是存钱,而是将钱都取出来,那么过一会,你就会收到支付平台返回的操作失败的操作了,因为并没有足够的余额供你转出。而UTXO并不存在这样的问题,只要每笔钱都有来源,且来源是未被用过的,那么多少个操作同时向一个地址转帐,或者从同一个地址转出也是没关系的。