最简单的区块链故事:一个故事看懂区块链原理

故事开始前,看一下百度百科的解释:区块链是比特币的底层技术和基础架构,

本质上是一个去中心化的数据库。区块链是一串使用密码学方法相关联产生的数

据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有

效性(防伪)并生成下一个区块。狭义来讲,区块链是一种按照时间顺序将数据 

区块以顺序相连的方式组合成的一 种链式数据结构, 并以密码学方式保证的不

可篡改和不可伪造的分布式账本。

以上定义摘自百度百科。很多菜鸟朋友看完这段解释依然满脸懵逼,特么到底什

么是“区块链”?

起 因

除非你完全没有接触过信息安全,否则一定听说过比特币和区块链。毕竟这两个

名词也是近两年来各大国内外媒体争相报道的热词。尤其是继今年5月爆发的

WannaCry病毒爆发以后,很多从未接触过的人都开始加入讨论大军。

我的很多朋友都不懂技术。最近几周他们一个个都变身好奇宝宝,围着我问比特

币和区块链。我想这两个名词的热度一定还会持续攀高,对他们不够了解的人也

还有很多很多。何不采用通俗的语言对“区块链”做一个解释,把这个概念传播

开来?

和网上一般的名词解释不同(不管三七二十一,下个定义再说,其实并没有什么

卵用),我们以它的作用为切入点来理解区块链的工作机制。

故事的开端

Joe是你最好的朋友。他出国旅游后的第五天给你打了个电话:“兄弟,我需要点

钱,出国之后把身上的钱都花完了。”

你回复:“我马上打过来”,然后挂了电话。

接着你又打电话给你的银行客户经理:“麻烦你马上从我的账户转1000美元给

Joe。”

客户经理:“好的,明白。”

客户经理随后确认了你的账户是否有足够的余额。因为你是百万富翁,所以客户

经理进行了如下的操作:

转账记录

你打电话给Joe说你已经把1000美元转过去了。

回头我们再来看看刚刚到底发生了什么。你和Joe都信任那家银行来管理你们各自

的财产。整个过程中实际并没有真实货币的物理流动。整个过程只涉及录入系统

的两个账户即可。更准确地说,全程只需主动权属于该银行的两个账户就可以完

成。

在这样传统的货币体系中,我的问题就来了。

交易双方的信任机制建立需要借助第三方。这种“中间人”的方式由来已久。那

么你可能又要问了:“这种信任机制有什么问题吗?”问题在于除交易双方以外

的“监督者”只是单个个体。这种情况可能存在以下风险:

1)如果有人有意或无意地摧毁了某个人或某个第三方组织机构就可能足以引起社

会混乱。

2)如果记录了某个交易的注册表遭遇火灾怎么办?

3)万一你的客户经理不小心划了1500美元到你朋友的账户怎么办?

4)如果他是故意这么做的呢?

世界上有没有无需借助银行就能帮助我们完成安全转账的系统?

要想解决这个问题,我们首先应该静下心来好好思考,问自己一个更深层次的问

题:我们能不能自己掌握账户和历史交易的信息呢?

这的确是一个值得探讨的问题。答案当然你一定也已经猜到了——那就是“区块

链”。现在我们就开始学习这个分布式账本是如何运作的。

故事的发展

该方法得以实行的必要条件是必须有足够多的人愿意在交易时不依赖于第三方。

只有这样,这一部分的人才能够自己掌控账本资料。

那么人数要达到多少才足够呢?在下面的例子中,我们假设有10个人愿意放弃银

行或其它任何第三方机构。在双方达成协议的前提下,他们互相之间能够在不知

道对方身份的情况下时刻掌握对方账户的一切信息和动态。

1. 一个空文件夹

一开始每个人都会获得一个空文件夹。随着时间推进,这十个人都会在他们现在

空的文件夹里不断添加记录交易信息的纸张。

2. 交易发生时

接下来,这个交易网络中的每个人都带着纸和笔坐下来,准备记录下在这个系统

中发生的每一笔交易。

假设,2号想给9号10美元。

为了完成这笔交易,2号大声地告诉每个人:“我要转10美元给9号。请大家都在

自己的纸上记下来。”

然后每个人都检查确认2号是不是有10美元及以上的余额能够转给9。如2号余额足

够,那么大家都在空白纸上记录下这笔交易。

纸上的第一笔交易

这笔交易这样就算完成了。

3. 持续发生的交易

随着时间的流逝,这个交易网络中出现交易需求的人越来越多。无论何时他们产

生交易需求,都会通知网络中的每个人。只要有人听到了这个通知,他/她就会在

他们各自的纸上记录下来。

这个过程会持续进行,直到这张纸上的空间不足。假设每张纸只能记录10次交

易,那么只要第10次交易完成,每个人纸上的空间也就随之耗尽。

当白纸被填满

这时候我们就需要把这张纸放进文件夹并拿出另一张新的白纸,重复上面步骤2的

过程。

4. 把纸张放进文件夹的注意点

在把纸张放进文件夹之前,我们需要对这张纸用网络中每个人都认可的专有密钥

进行密封。但是密封后我们要确保的是,这张纸就只能尘封在文件夹里,无论是

谁无论何时都不能对其作任何修改。并且如果每个人都相信这个“封印”,那么

也就意味着每个人都绝对信任这张纸上的内容。这种密封方式也是区块链的关键

所在。

以前第三方或中间人都会说服我们相信无论他们在注册表中记录了什么,里面的

内容都不会发生改变。但在现在这个分布式的、去中心化的系统中,这个印章

(密钥)就为我们建立了这种信任机制。

故事的高潮 一

新的问题又来了。我们应该如何密封这张纸?

在学习如何密封之前,我们先来了解印章的工作原理。

假设我们现在有一个机器,如果你把一个里面装着东西的盒子从左边放进去,这

个魔法机器会从右边吐出一个装着其它东西的盒子。

【术语解析】这个机器实际叫作“哈希函数”,但是今天我们不讨论技术。所以

我们暂且称它为“魔法机器”。

魔法机器(即哈希函数)

如果我们把装有数字4的盒子从左边放进去,它会从右边给出下列字符:dcbea。

如果已知条件是输出结果为“dcbea”,要想知道从左边输入的是什么非常困难。

但是每次如果你把4放进去,最终的输出结果“dcbea”是肯定的。

我们来试试发送其它数字。如果放入26会得到什么呢?

哈希(26)=94c8e

这次我们得到的是“94c8e”。从26的输出结果来看,结果也可以包含数字。

了解到这儿,我们可以开始思考下一个更加深入的问题了:

“如果我想从右边得到一个以3个零为开头的结果(如000ab、00098、000fa

等),那么我应该从机器的左边放入什么内容?”

预测输入的内容

这个机器有一个单向性的属性:给出右边的预期结果后,我们无法计算出左边放

入的内容。那是不是意味着这个问题无解?倒也未必。

我能想到一种方法——把每个数字都输入一遍,直到机器输出以3个零为开头的结

果。

把每个数字都尝试一遍

有耐心的人试上几千次可能也就找到了这个符合我们输出要求的数字。

通过输出结果来获得输入数字这种逆向计算的确非常困难。但是如果我们得到了

预测的输入内容,验证该输入是否能得出我们想要的结果就非常非常容易了。记

住,这个机器最大的特点就是每个结果只对应一个数字,绝无例外的“一夫一妻

制”。

如果我给你72533这个数字,然后问你:“这个数字输入魔法机器后会不会输出以

3个零为开头的结果?”这个问题就简单到简直在侮辱我们的智商了。

因此这个机器最最最重要的属性是——知道结果,要想算出输出非常困难,但是

如果我们知道输入的数字和输出结果,验证两者是否匹配很简单。

如何利用这个机器密封纸张?

怎样利用魔法机器生成每张纸独有的封印?还是老办法,采用情境模拟的方法展

开解释。

假设我给了你两个盒子。第一个盒子里面有数字20893,你能不能想出一个数字,

这个数字与第一个盒子里的数字相加后的结果放入魔法机器后,我们能够得到一

个以3个零为开头的字符结果。

这个情景和之前的难题几乎相同。唯一的办法就是把每个数字都放入机器尝试一

遍。

经过几千次的尝试,我们会在21191这个数字这里停下,21191+20893=42084,把

42084放入这个机器后所得到的结果正是我们想要的。

在这个案例中,21191这个数字就是20893这个数字的“封印”。假设有张纸上写

着20893这个数字。为了密封这张纸(即没有人能够再对其内容作改动),我们把

带有21191标签的徽章贴在纸上,密封完成。

被密封的数字

【术语解析】用来密封的数字实际被称为“工作证明(Proof Of Work)”,因为

这个数字是通过努力计算得来的。本文为了简单易懂,我们称它为“密封数

字”。

无论谁想验证这个页面是否被改动过,只要把页面上的内容与密封号码叠加后放

入魔法机器。如果机器输出的内容是以3个零为开头的,那么该页面内容是没有

被“污染”过的。但如果结果不满足这个特点,我们就应果断丢弃这个页面,因

为上面的内容已经被改动、已经失效。

密封过程总结

要想密封记录整个交易网络中交易流水的页面,我们需要找到那个加入交易内容

并输入机器后会得到以3个零为开头的字符的关键数字。

注意:“以3个零为开头的字符”只是一个举例,简单地反应哈希函数的工作原

理。实际问题处理起来会复杂得多。

只要花费一定的时间,交易网络中的参与者就能够计算出这个数字,该页面也就

随之密封。一旦有人更改了页面上的内容,任何人都能够通过这个密封号码来验

证这个页面的完整性。

故事的高潮 二

了解如何密封页面后,我们再把思绪拉回10个人用完了一张纸上所有空间的时

候。

当这个页面上记不下更多的交易记录时,交易网络中的每个人都会停下来计算该

页面的密封数字,然后将其放入文件夹。如果第一个人算好了密封数字,他就会

向所有人公布。

听到密封号码后,大家都去验证这个数字是否能满足输出需求。如是,则在他们

的页面上贴上这个标签,再把这个页面放进文件夹。

但是如果7号算出了密封号码并“昭告了天下”,但结果大家发现这个数字并不满

足他们的输出需求怎么办?这样的情况也很常见。原因可能有以下几点:

1)公布交易信息时听错了;

2)记录交易信息时出现笔误;

3)为了一己之利,记录交易时故意犯错。

不管出于什么原因,7号只有一种选择——丢弃自己这张纸,然后从别人那里复制

一份副本放进他自己的文件夹。如果不把这个页面放进文件夹,他就不能继续记

录接下来的交易记录,这也就相当于把他从这个交易网络中踢掉了。

说到这里,我相信有的人脑海里又出现了一个疑惑:既然有人计算好密封号码后

会公布,为什么我们每个人还要花费那么多时间都去计算一遍?其他人为什么不

歇着、坐等公布?

Good question!区块链含有特有的奖励机制,网络中每个人都有资格获得奖励。

第一个计算出密封号码的人能够获得一定奖励。

我们再来简单地假设一下,如果5号第一个算出了页面的密封号码,并获得了1美

元的金额奖励,那么这1美元就是凭空出现的。换句话说,假如他账户里本来余额

5美元,现在增加了1元,但是这1元没有从其它任何人的账户里扣除,即没有减少

任何人的账户余额。

这就是比特币的起源。它是在区块链(分布式账目)上发生交易的第一种货币。

如果在这个交易网络上持续努力,你同样也能获得回报,这个过程就是我们所说

的“挖矿”。

拥有比特币的人越来越多,这些人一刻不闲着地开始炒这种虚拟货币,不断扩大

市场对比特币的需求,再进一步提高比特币的价值。就这样周而复始地把比特币

的价格炒得很高。

这种奖励机制让交易网络中的每个人都勤勤恳恳地劳作。

他们把纸张放进文件夹后,拿出一张新的空白纸张,然后再次重复前面的过程

——循环往复、永无止境。

假设文件夹中已经有5个被密封的页面。如果我为了谋取私利修改了第二个页面的

其中一笔交易会发生什么?前面已经提到过,所有人都可以通过密封号码查出交

易内容已经发生改变。但是如果我根据修改的内容重新计算密封号码,然后把新

号码贴在纸上,出现这样的情况怎么办?

为了防止有人同时修改页面和密封号码,计算密封号码时有一个小技巧。

如何防止密封号码被重新计算、更改?

还记得之前我假设你有两个盒子,一个包含20893这个数字,一个是用于计算的空

盒子吗?在区块链中计算密封号码,实际上存在三个盒子,而不是两个,其中两

个是有内容的,一个是待计算填充的。

当三个盒子的内容都填好放入机器后,机器右边输出的结果能够满足我们的需

求。

一个盒子里是交易记录、一个盒子是密封号码,第三个盒子是通过哈希函数计算

出来的前一页的输出结果。

通过这个小技巧,我们能够确保每一页的密封号码都与前一页的内容相关联。因

此如果有人修改了历史页面的内容,他需要改动接下来每一页的密封号码,从而

保证整个链路的一致性。

探测。拥有19项软件著作权及13项发明专利。

你可能感兴趣的:(最简单的区块链故事:一个故事看懂区块链原理)