故事开始前,看一下百度百科的解释:区块链是比特币的底层技术和基础架构,本质上是一个去中心化的数据库.区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)并生成下一个区块.狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一 种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本.
 除非你完全没有接触过信息安全,否则一定听说过比特币和区块链.毕竟这两个名词也是近两年来各大国内外媒体争相报道的热词.尤其是继今年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这个数字,一个是用于计算的空盒子吗?在区块链中计算密封号码,实际上存在三个盒子,而不是两个,其中两个是有内容的,一个是待计算填充的.
 当三个盒子的内容都填好放入机器后,机器右边输出的结果能够满足我们的需求.
 一个盒子里是交易记录,一个盒子是密封号码,第三个盒子是通过哈希函数计算出来的前一页的输出结果.
 通过这个小技巧,我们能够确保每一页的密封号码都与前一页的内容相关联.因此如果有人修改了历史页面的内容,他需要改动接下来每一页的密封号码,从而保证整个链路的一致性.
 我们假设十个人中有一个人想要恶意修改区块链中的内容(包含记录了交易历史页面的文件夹),那么他需要调整很多页面,计算改动页面之后所有页面的密封号码.我们都知道计算密封号码的工作非常困难.因此,整个交易网络中的一个叛徒最终还是会输个剩下的9个好人.
 从这个叛徒想要更改内容的页面开始,他就需要在整个网络中创建另一个区块链,但是这个区块链几乎不可能赶上好人们创建的链路 -  - 一个人的力量赶不上剩下9个人的共同努力.因此,有一点非常明确,区块链规模越大,安全性和可信度越高.
 但是如果10个人中有6个人都叛变了怎么办?
 如果出现这样的情况,这个协议就有点打脸了.这种情况被称为"51%攻击".如果整个网络中的大多数人都决定叛变,欺骗剩下不到半数的人,那么整个协议就自然而然地走向了灭亡.
 这是区块链最大的弱点.尽管这样的情况不可能出现,但我们还是要谨记这个系统的弱点.整个体系都是基于一个假设:整个交易网络中的大多数人都不会叛变.
 结 局
 解释到这里也就差不多了.还请亲爱的们再回头看看百度百科给出的定义,现在是不是理解起来容易很多了?
 如果还有人问起到底什么是区块链,比特币的运作机制是怎样的,我相信本文的读者都能够解释给更多的小白们听啦.
 本文同步发布于赛博朔方微信公众号.
 在此输入...
 如果有人回复我的评论,请通过电子邮件通知我.