首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

比特币交易记录里隐藏的秘密

17年下半年,ICO大爆发。

那时候市场真热,只要上得了交易所,管你是什么牛鬼蛇神,先翻个几倍再说。当时我也跟大多数人一样,兴冲冲地参与了不少的项目。从一开始认真做每个项目的研究,到后来只问这个币什么时候上交易所。然而很少人能够预料到,仅仅过了几个月,币市就迎来了史上最大的“破发潮”。

不知道大家在拿比特币或以太坊参与ICO时是否曾经发现过这样的问题,当你在用以太坊转账的时候,你很容易在区块上(ETH blockchain explore)找到并看懂这笔交易:

比如像上图所示,这是一笔价值大约为0.52个以太坊的转账,左边是我的地址,右边是对方的地址。

而当你用比特币转账的时候,一系列的疑惑可能就会出现,比如,下图是一个1.5btc的转账记录:

红色方框很好理解,那是对方的地址,1.5BTC是转账数量。但下面多出来的地址,里面8.02个比特币是什么玩意儿?

随便浏览一个区块上的其他交易,你会发现更“离谱”的交易记录,比如,这个:

这难道是多个人转到一个人账户上吗?如果是的话,不应该分成好几笔交易来处理吗?

又比如,这个:

这就完全乱套了,到底是哪个地址转到哪个地址啊?

账户余额模型vsUTXO模型

如果你也存在以上的疑惑,说明你跟曾经的我一样,不知道这个世界上除了账户余额模型以外,还存在另一种你从未想过的,违反直觉的,脑洞大开的管理交易的方式 —— UTXO模型。

账户余额模型(Account/balance model)很直观很好理解,每个用户都有一个账户,这个账户里会有一个余额,当任意两个用户发生交易,他们账户上余额就会在数据库里更新一遍。所有的传统银行,以及以太坊,本质上采用的都是账户余额模型。

而比特币采用的是UTXO模型,这是一种在哲学与方法上完全区别于账户余额模型的交易管理方式。

因此当我在上面尝试用账户余额模型的方式来解读UTXO模型里的交易记录时,当然是行不通的,这就跟在安卓系统上开发的APP没办法在IOS系统里运行一个道理。

揭开UTXO的神秘面纱

比特币钱包里装的不是比特币,而是UTXO(Unspent transaction output)。UTXO翻译成中文就是未花费的交易输出

你完全可以把每个UTXO,想象成是一张“支票”,每张“支票“可以是不同面值的比特币。

假如今天你爸爸、妈妈、奶奶分别给你转了1BTC,2BTC,5BTC,这时候你的比特币钱包就一共有8BTC。但他们并不会像零散的硬币一样混淆在一起,而是以3个UTXO的形式各自独立存在,3个UTXO分别等于1BTC,2BTC,5BTC。

既然是“支票”,他们当然是不能拆开来花的,你要么不用,要用就得一次用掉。

UTXO模型里,一笔交易包含输入(input)输出(output)。只有UTXO才能够作为交易的输入,而交易的输出则是新的UTXO。

比如,在你收到8个BTC后,你要给老王转过去7个BTC,这时候,你钱包里的3个UTXO就会变成这笔交易的”输入“,并成为”已花费的交易输出“,完成使命,从此消失在历史长河里;而这笔交易的"输出",则会是两个新的UTXO,分别是7BTC,到老王的钱包里,以及1BTC,作为系统的找零,返回你的钱包中。

每一个新诞生的UTXO,都会附有一个所有者的地址,以表示这个UTXO的归属。

一个比特币钱包可以集合多个地址,钱包只要把所有的地址上拥有的UTXO加总一遍,就能得到钱包的比特币余额。

这是非常反直觉的设计,因为在我们用的最舒服最习惯的账户余额模型里,余额是可以随意分割成任意大小来支付出去的。

不过幸运的是,由于比特币钱包设计得足够人性化,今天我们在使用比特币转账时,几乎感受不到这个复杂的过程。当然,除了在你查看交易记录的时候。

你现在再回过头看我们开篇时讲的几笔交易记录,你或许就能明白这是怎么一回事了。比如,1.5BTC那笔交易里,那个8.02的比特币明显就是一个新输出的UTXO,是系统给我的找零,将退回我的钱包当中。而下面那一笔交易,并不是因为很多人同时在给同一个人转比特币,而是那笔转账的转账者钱包里一共就存有那么多零零散散的UTXO,在这笔交易当中这些UTXO集合起来共同作为交易的输入。

而那么最后一笔转账,作为思考题,读者可以自行解读一下,有任何问题都可以在后台给我留言。

UTXO的好与坏

与账户余额模型不同的是,UTXO的关注点不在每个账户身上,而在交易的货币本身。

在传统的账户余额模型中,为了防止双重交易,我们必须在数据库里保存所有账号的数据,在每笔交易发生的时候及时更新这些账户的余额。

而在UTXO模型里,我们根本不在乎用户的余额是多少,因为只有UTXO是可以作为交易的输入被花费出去的,且每个UTXO支付一次后就会被系统销毁,因此理论上来说我们只需要拥有一个存储所有UTXO状态的数据库就可以验证任何交易了。

当目前为止,比特币的区块链大小大约为170G,而整个UTXO的数据库只有3个G不到,我们真正需要的数据其实只有这3个G而已(数据来源:https://statoshi.info/)。跟外界的批评或许不一样,比特币的拓展性其实具有非常大的潜能,只不过在此之前,我们还有一些技术难题有待解决。

除此之外,UTXO还具有比账户余额模型更好的隐私性。从文章开篇的几笔交易就能看得出来:你用以太坊交易的话,别人在eth explore上按着你的交易地址搜索就能查看到你这个地址上的所有资产;你用比特币交易,别人根本不知道你有多少不同的地址,又有多少不同的UTXO。

既然UTXO这么好,那为什么以太坊不用呢?以太坊创始人V神还真的就这个问题在medium上发表过一篇文章《Thoughts on UTXOs by Vitalik Buterin, Co-Founder of Ethereum》,有兴趣的读者自己去搜搜看。

在这篇文章里,V神的主要论点是:

1. UTXOs are unnecessarily complicated, and the complexity gets even greater in the implementation than in the theory.

2. UTXOs are stateless, and so are not well-suited to applications more complex than asset issuance and transfer that are generally stateful, such as various kinds of smart contracts.

不专业的翻译就是:

1. UTXOs有点复杂,而且在实践过程中复杂程度要比理论上更大。

2. 建立在以太坊上的应用,肯定不是单纯的转账而已,而是要做很多更复杂的事情,比如智能合约。这些事情都是要求有“账号状态”的,而UTXO恰好就好是没有“账号状态”的一个模型。

总结一下就是V神给UTXO发了好人卡:你不是不好,我们只是不合适!

结语

奥卡姆剃刀原理就是“如无必要,勿增实体”,而我认为这就是UTXO的哲学。

UTXO并没有像POW机制那样被那么多人知晓,但他依旧带来了非常革新的理念,UTXO并不会取代账户余额模型,就如比特币也不会取代法币一样。但是由于他的存在,我们多了一种思考事物的方式,这就足够了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180621G1DB6P00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券