我们离比特币的核心越来越近了

每周一新第11周的践行是每周一篇文章的计划,到现在为止,已经是第75周,如果严格执行应该已经有65篇了。但实际上,远远没有达标。并且最近荒废了很久,已成月更,再写不出来就成年更了,说来也是真得惭愧。感慨那些每天一更的同学是怎么做到的,即使是全职保持持续输出都不容易,更何况是兼职,由衷的佩服。也更加明白认真持续地做好一件事之不易,远不是逞一时口舌之快那般自在。

当我们说某个事物不好时,经常会被回击“你行你来试试”,而我们有力的回应往往是“不会下蛋,难道不能说鸡蛋不好吃吗?”。怒得的确很有道理,但对我而言这段经历告诉我,这样的话恐怕不会不经思忖轻易出口了。

至于本次拖延这么长时间,其实也有原因的(让我找点借口)。

一来是作为分析比特币越来越接近核心的一篇,从原理到demo代码的运行,面临了不少困难。清楚原理还算简单些,要用代码无差错地验证出来,就要面对很多细节问题了。而这些问题错一点,验证结果都是错误的,都不是我想要展示给读者的。并且现在网络上介绍原理文章不少,但从原理到最后demo验证,几乎还是没有的。不过还好遇到的困难都逐一解决了,才决定开始落笔————这算是客观因素。

二是对于写文章这件事,我不想从别处copy来就给读者,若原创从思路的构思、到素材准备、再到草稿完成、再到字句斟酌,还有配图、格式等的整理,着实是一笔不小的工程,很花费时间。写文章作分享与读者交流很好,但不同的人生阶段有不同重要的事情,也不是生活的全部。精力有限,有时候只能有所舍弃 —— 这算是主观因素。

但不管怎样,每篇文章我都会保证质量,输出对读者真正的有价值的东西。

(一)回顾

在前面的文章里,我们先是手动拆解一个block数据,窥探了其所有的数据结构;由此延伸,又解释了默克尔树是如何生成一个hash来表征所有的交易的,又说了区块链的基础——密码学,加密和签名是怎么回事,对应到比特币里,清晰的说明了公钥、私钥、地址之间的关系。

还剩一个关键的问题,那就是如何验证一笔交易。这个问题解决了,关于区块链这个独特的记帐技术,算是打通了。

为什么说这个问题关键,因为它解决了资产的归属问题,也就是说正是这个技术真正决定了这笔资产是你的、这笔交易是你来发起的。在愈发了解之后,我发现它相当有趣,也没有我开始想象的那么简单。中本聪,为了实现这个目标,并没有单纯地来实现这个功能,而是把整个验证原理抽象成了一门语言,有指令、有逻辑、有数据。不夸张地说,正是这个思想为当前区块链2.0的智能合约,乃至今后的区块链3.0的出现奠定了基础!

接下来我们逐步朝着这个方向迈进。

(二)记账方式对比

比特币作为一种记录全网数据的新型记帐方式,这个记帐方式是非常有独特性和创新性的。如果你看过我前面拆解block文章,相信你已经知道了一些概念,如input、output。那么这个帐到底是怎么记的呢,特殊在哪里?虽然网上有不少的资料,来讲述这个问题,但我认为还可以有更简洁、更形象的方式来阐释——这也正是本文“普及版”要做的,让我尝试一下。

我们先来观察一下传统的记帐方式。

在现实生活中,个人记帐一般采用这样的方式:把每一笔交易记录下来,经过一段时间后,比如一个月,再把所有明细加起来,看下收入支出总共多少,很少有人每发生一次交易就汇总一下。

小明:

工资收入 +5000

住宿 -1000

请客 -500

买衣服 -700

余额:2800

在银行系统中,需要管理所有人的财产,记帐方式便进行了升级:引入了帐户的概念,每个人都有一个自己的帐户。当发生转帐时,会将每笔交易都如实记录下来,同时两个交易方帐户进行增减。

而比特币没有采用这种帐户的形式,而是使用了一种叫UTXO的方式(unspent trsaction output)。UTXO记录了每笔交易,但却没有一个单独的总余额的概念。打一个形象的比方,它就如同在钱包里存了一张张支票(或叫收据、凭证),而不是一张张固定面额的“钱”。这些支票记录了你有多少“钱”可以用。转帐的时候检查一下有没有数额足够的支票,如果有的话,转完帐生成新的支票,一张属于接收方,另一张支票还属于你,上面记着还剩多少钱。

听起来是不是很简单,根本不像很多文章里说的那么复杂——任何复杂的事件本质都是清晰的。恭喜你只花了一分钟就了解了比特币记帐方式的本质!

但是抽象最终要回到具体,才能理解的更准确,不偏颇。我们以一个实际的例子,看下这个过程是怎么发生的。

假设有小李、小王、小明、小红。小明一开始没有钱,小李、小王分别给小明转账200元,小明有了两张支票。

小李 -> 小明 200元 支票A

小王 -> 小明 200元 支票B

接下来小明给小红转账,会分为两种情况。

假如现在小明要给小红转帐100元,那么只需要拿其中一张支票来交易,比如是支票A,小红得到100元的支票C,小明得到100元的支票D。

这样小明钱包里就有了两张支票:200元支票B, 100元支票D。原来的支票A作废,因为已经花掉了,新的支票C、D就是未花费的。A叫作这笔交易输入,C、D叫作这笔交易的输出。C、D即是UTXO,未花费交易。

B(200 小明) -> C(100,小明) + D(100,小红)

假如小明要给小红转帐300元,已有的两张支票单独支付是不够的,需要联合起来支付。 小红得到300元的支票C,小明得到100元的支票D。同样,原来的支票A、B作废,新生成的两张“未花费”的支票C、D。A、B就是这笔交易输入,而C、D是这笔交易的输出。

A(200 小明) + B(200 小明) -> C (100,小明) + D(300,小红)

看了实际的例子,是不是更清晰了呢?

(三)UTXO 有什么好处吗?

那么UTXO这种设计好处是什么,为什么会这么设计呢?对此,网上有几种广泛流传的观点,我们来分析一下。

观点一: UTXO数据量更小——账户数据库会无限膨胀,而UTXO数据库体积会小很多。

帐户数据库会记录每笔交易,UTXO也会。帐户还会记录余额,而这个数据很小,但UTXO一笔交易至少包含一个输入两个输出,这部分数据在帐户数据库里是没有的。直观上单从数据项来看,数据体积并不会有明显小很多,UTXO并不具备在数据体积上的优势。所以这种观点,并不能让人信服。

观点二:UTXO统计余额效率更高——账户系统要看历史全数据后把所有的增减操作全部加起来才能获得正确的余额,两者效率差异随着时间推移会越来越大。

这个显然也不对。在使用帐户数据库时,没有程序会把所有交易加起来再看余额,那太傻了,肯定有个余额数据。所以这个优势也不能让人信服。

观点三:UTXO隐私性更强——每笔交易都使用新的地址接收,新旧地址之间关系难以跟踪。

难道帐户系统就不能使用新的了吗,只要你愿意完全可以,使用新的帐户啊,因为这种说法也是不对的。

另外,我们知道,以太坊就是采用的帐户模型,而不是UTXO。可见任何一种模型都可以解决问题,都可以应用在区块链里。与其直接讨论它的优势,我们不如反着看,先看下这种设计有什么特点,它所具有的特点也即客观体现了优点和缺点。

(四)UTXO的特点

(1)与传统的帐户余额模型相比,比特币的记帐方式UTXO看起来有些反人类正常思维,不好理解,但其实这是一种更本质的表达。在传统的帐户余额记帐方式里,要实现一笔转帐是可以非常清晰划分为三步:

第一步检查帐户余额有无足量的数额(小明有没有300元)

第二步是记录一条转帐明细(或叫转帐行为,小明向小红转帐300元)

第三步是在相应帐户里分别减加相应数额(小明帐户-300,小红+300)

而UTXO的方式,第一步先会判断有没有足量的支票,第二步记录交易明细,记录的同时即实现了数额的加减,因为该交易明细的输入输出就是币转移后各帐户应该有的结果。

在UTXO模型里,原来的第二步、第三步的区分不那么清晰了,相当于用一步实现了同样的效果。但实际上这两种方式达到的效果等价的:

A. 实现了把所有交易明细记下来

B. 实现了要转帐必须先有这笔钱的检查,这个检查是通过要求必须有相应的未花费的输出来作为本次交易的输入来实现的。

在这整个过程,可以发现并不需要把历史曾经收到的所有数目加起来才能判断有没有足够的转帐,只需要知道曾经有人给他转一笔“足量且还没有花费”的钱即可以。花费的时候,拿这笔钱直接支出,剩下的还是你的,对吧?!

因此UTXO是一种更本质的表达,简化了交易的记录和程序上的处理。但正因为这个特点,要得到一个地址的余额,必须把utxo库的数据遍历,才能得到总余额。

(2) UTXO的每笔交易的输入都是之前的一笔交易的输出,这本身也是一种链,跟区块链区块的链内在思想是一致的,每一笔交易可以追踪到币的流向,直至coinbase(打包区块产生的初始币),这意味着UTXO的可追溯性更好。

(3) 因为没有帐户的概念,如果有多个支票,可以使用不同支票同时发起两笔转帐,而不发生冲突,因此UTXO可以实现并行。更准确讲,并行是指同时发起交易,并且打包时,只要用了两个不同的输入支票,两笔交易是可以打包在同一个区块里,而帐户系统必须先后处理。

这些是在学习之后,我自己的一些思考。因为上面所列的网上一些观点,看起来不是那么经得起分析,我并不十分认同。如果有不同观点,欢迎留言。

最后,对于上面所分析的其中一种观点——比特币UTXO隐私性更好,多说两句,这也是很有必要纠正一下的普遍的错误认识。如果认识不到,很可能比特币不仅给不了你想要的隐私,反而让你的资产完全透明可见,公之于大众。

(五)用比特币转帐真的是隐私的吗

通常比特币被认为是一个匿名的支付网络,但事实上,比特币却又是世界上最透明的支付网络。为什么?

一个新生成的地址,只要没有发生转账,比特币网络里就不会有该地址的任何信息,只要发生转账,该地址下的资产以及交易往来就被记录在这个网络里。试想,如果有关部门或某个人,通过线下方式确定到这个地址是谁的,也就意味着知道了该地址下所有的交易记录。

也许你会问,他们如何确定到这个地址是我的?如果你要接收或发送转账,就需要告诉别人你的地址,该人完全可以知道你这个地址下所有历史交易和资产状况;另外,如果你想要换成法币,很可能会与交易所发生过关系,该地址只要从交易所接收或发送过币,便产生了关联,而交易所都是实名的。所以就不再匿名,而是完全透明了,并且这种透明甚至是空前的——正因其不可篡改、可溯源性造成了地址一旦被使用,与地址相关的交易历史便破坏了地址的保密性。即使当前地址无法被追踪和确定,在未来也很可能容易被追踪和确定。

所以,官方给出的建议是:比特币地址最好只使用一次,每次发生交易更换新地址,同时用户必须注意不要透露他们的地址。这样做可以将你的每笔交易都隔离开以使它们无法被关联起来。付款给你的人不会看到你其它的比特币地址,也不会知道你如何使用它们。这可能是你需要记住的最重要的一条建议。

另外,在公共空间使用也要当心,除非是打算接受公开的捐款或完全透明的付款,但是如果你从公开的地址向自己的其他地址发送了转账,那么这些的地址的隐私性也就遭到了破坏,因此在网络上公开自己的地址对隐私性来讲并不是一件好事,这是应该注意的。

如果使用得当,比特币可以提供可接受的隐私性。永远记住养成良好的习惯来保护你的隐私是你自己的责任,而不是这个网络。

小结

在本文里,我们简单回顾了过去的文章脉络;然后着重分析了UXTO的独特思想,用输入和输出的方式来记帐;最后纠正了很多人对于比特币隐私性的错误认识。前面所有的这些文章包括本文都是基础,最终我们是为了探究清楚这个系统的核心:你地址下的币,这个系统是如何确定就是你的而不是别人的,只有你能花别人不能花,并且你花费了,别人能确定是你花的。下篇文章,就可以直奔这个核心又有趣的主题了,欢迎继续关注。

本公众号是活动“每周一新”第11周的践行产物。主要分享成长感悟、旅游经历、通用技术、IT趣闻、编程知识等,真诚欢迎你关注公众号。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180826G11TPY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励