前言

区块链现在是紧跟着人工智能、大数据的新名词,提起区块链,大多数人首先想到的是炒币,充斥着虚假、浮躁,再加上前几年国家对这种现象的抵制,让很多人对区块链技术望而却步。

殊不知,比特币只是区块链技术的一个分支,而区块链本身,凝聚了许许多多计算机科学家的智慧,发展突飞猛进,正在脱离实验室,走进人们的生活,未来可期。从 Facebook 的 libra 到最近中国的重视态度,像 AI 一样,区块链将是未来几年甚至几十年围绕着人们的新技术。

回过头来看,2008 年末“中本聪”提出区块链概念到目前为止不过十多年,现在开始了解区块链,你我都称得上是这项技术的先驱者。

不过,目前国内介绍区块链的内容还是显得浮躁,鲜有真正踏踏实实介绍其内部技术细节的文章。下面是一篇我翻译的区块链的介绍文章,由 Mohit Mamoria 所作,在 Medium 上收到了广泛好评。文章比较长,图片很多,但值得耐心读完。无论你对区块链的认知如何,下面的有些内容一定会让你感到吃惊。


除非你是个鸵鸟,总是喜欢把脑袋埋进沙子里,否则你一定曾经听说过比特币和区块链这两个名词。毕竟,它们都是当今炙手可热的话题,即使是从未开采过加密货币或是从未了解过加密货币工作原理的人,也都在讨论它。跟很多人一样,我身边谈论它的非专业朋友甚至多于专业朋友。

当这种情况发生,就到了写点东西的时候了,我希望用简单的文字为所有普通的互联网用户指明方向,以免大家在迷雾中没头脑地摸索。

区块链:为什么我们需要这么复杂的东西?

“对于每个复杂的问题,都有一个清晰、简单而错误的答案” — H. L. Mencken

与互联网上其他的文章不同的是,我们首先不是要定义区块链,而是要理解它所解决的问题。

想象这样一个情景,你叫 Dude,你最好的朋友 Joe 在国外旅行,在他假期的第五天,他打电话给你说:“哥们,能不能借我点钱,我钱都花光了。”

你回复他:“我马上就给你转。”

然后你给银行经理打电话,让他从你的的账户上转1000美元到 Joe 的账户上。

你的银行经理收到消息后打开登记簿,检查你的账户余额,看看你有没有足够的钱转账。在确认了你有足够的金额后,他在登记簿上做了如下操作:

你打电话给 Joe,说钱已经汇过去了,下次他去银行就可以把你刚转给他的钱取出来了。

刚刚发生了什么?你和 Joe 都相信银行来管理你们的资产。钱并没有真正的转移,只是在登记簿上做了一些记录。更准确的讲,你和 Joe 都不能直接控制登记簿上的记录。

这就是当前系统存在的问题。

为了建立彼此之间的信任,我们必须依赖于第三方。

多少年来,我们一直以来这些中间人达到相互信任,可能你会问,依赖他们有什么问题吗?

问题就是他们在数量上是单一的,如果一个人/一个组织有意或无意地走向腐败,那么社会就会混乱。

  • 如果记录交易的登记簿火灾中被烧毁了怎么办?
  • 如果你的银行经理将1000美元误写成了1500美元怎么办?
  • 如果他故意这么做怎么办?

多年来,我们总是在一棵树上吊死。

是否有这样一个系统,让我们不需要银行就可以转账?

为了回答这个问题,我们需要进一步细化,问自己一个更好的问题(毕竟更好的问题才能得到更好的答案)。

思考一下,转账这个动作意味着什么?只是在登记簿上记录一下,下面才是更好的问题——

有没有一种方式来维持我们之间的记录,而不是其他人替我们维持?

这是一个值得讨论的问题,不过我想你已经猜到了,区块链就是这个问题的答案。

这是一种不需要依靠他人,仅凭我们自己来保持记录的方法。

你应该没有走神吧?很好,因为现在,当这几个问题在你的脑海中开始浮现时,我们将正式介绍这个分布式记录簿是怎样工作的。

告诉我,区块链是如何运作的?

这种方法的前提条件是有足够多不希望依赖于第三方的人,只有这样,这些人才能自己维持记录。

为了防止比特币流行起来,购买一些比特币或许是有意义的,如果有足够的人这样想,那么这将成为一个自我实现的语言。—中本聪(Satoshi Nakamoto),2009年

多少个人才足够呢?至少三个,在我们的例子中,假设十个人想要放弃银行或其他第三方。经过大家的同意后,他们会一直保持彼此账户的详细信息,而无需知道别人的身份。

1.一个空文件夹

每个人都有一个空的文件夹,随着大家的前进,每个人的文件夹中都会添加新的记录页,这些记录页的集合就是记录交易的记录簿。

2.什么时候发生交易?

接下来,这个网络中的每个人手机都拿着一张纸额一支笔,每个人都准备记录系统中发生的任何交易。

假设2号想要给9号转10美元。

为了达成交易,2号要向大家喊:“我想给9号转10美元,所以,你们每个人都在自己的记录页上记下这笔交易。”

每个人都会检查2号是否有10美元转给9号,如果有的话,他们每个人都会在自己的记录页上写下这笔交易。

然后这笔交易就被视作完成了。

3.交易不断发生

随着时间的推移,系统中的每个人都有交易的需求。每当他们想交易时,都会向所有人公布,别人听完公布并检查后,都会将交易写在自己的记录页上。

这个流程会一直进行下去,知道每个人都用光了当前的记录页。假设一个记录页可以记录十笔交易,当第十笔交易完成后,就证明每个人都用光了当前的记录页。

现在是时候将记录页放到文件夹中,再取出一个新的记录页,重复上述的流程。

4.收回记录页

在我们将记录页放回文件夹之前,需要使用一个唯一的密钥来密封它,而且这个密钥要经过系统中每个人的同意。通过密封,我们将确保,无论今天、明天、甚至是一年后,一旦它的副本放在每个人自己的文件夹中,就没有人可以再对它进行任何更改。一旦进入文件夹,它就将永远在文件夹中密封。而且,如果每个人都信任印章,那么每个人都信任记录页的内容,记录页的密封也正是这个方法的关键之处。

这在现实中称作“挖矿”,不过简单起见,我们仍然称它为“密封”。

先前,第三方/中间人为我们提供信任,我们相信他们在记录簿上记录的内容不会改变。而在我们的这种分布式系统中,密封的手段为我们提供信任。

很有趣!那么我们如何密封记录页呢?

通常,在学习如何密封之前,我们将对密封的工作原理有一个大致的了解。作为前提,你需要知道这几个名词。

魔法机器

想象一个被厚重墙壁包裹的机器,如果你从左边输入一个装有东西的盒子,它会从右边吐出一个装有其他东西的盒子。

事实上,这台机器叫“哈希函数”,不过我不太想技术化,现在,他就是台神奇的机器。

假设,你从左边输入4,它可能从右边返回这些单词:dcbea。

它是如何把数字4转换成这个单词的呢?没有人知道。而且,这是一个不可逆的过程。有了 dcbea 这个词,却不可能知道机器的左边被输入了什么。但每次你把数字4输入机器时,它总会吐出相同的单词 dcbea。

让我们再尝试输入一个不同的数字,比如说 26。

这次我们得到了 94c8e。很有趣不是吗!原来单词也可以包含数字。

好,接下来请你思考这样一个问题:

你能告诉我我应该从机器的左边输入什么,才能从右边得到一个以三个0开头的单词吗?例如,000ab 或 00098 或 000fa 或其他单词。

好好想一会这个问题。

之前说过,这台机器的一个性质就是无法从右边的输出结果推测出左边的输入内容,那么怎么才能回答我提出的问题呢?

我能想到一个方法,为什么不一个一个尝试世界上所有的数呢,直到得到一个以三个0开头的单词?

乐观地看,经过几千次尝试后,我们才会得到一个所需的输出。

可见,根据输出来计算输入是一件很困难很困难的事情。但与此同时,要验证输入是否产生一个所需的输出总是非常容易的。记住,输入相同的数组机器总产生同样的单词。

如果我给你一个数,比如说 72533,然后问你:“把这个数从左边放入机器中,是否能得到一个以三个0开头的单词?”

那么你需要做的,就仅仅是把这个数字扔进机器中,然后观察右边产生的单词,你看,就是它。

这种机器最重要的一个性质就是——“已知一个输出,很难计算出它的输入是什么,不过已知一个输入和一个输出,却很容易验证它们是否匹配。”

在文章的剩余部分,一定要记住魔法机器(或者叫哈希函数)的这一特性:

已知一个输出,很难计算出它的输入是什么,不过已知一个输入和一个输出,却很容易验证它们是否匹配。

如何使用这些机器来密封记录页?

我们将使用这种魔法机器来为记录页产生印章。同样,举个例子来说明。

假设给你两个盒子,其中一个盒子中的数字是 20893,那么请问你能不能找出一个数字,使它加上20893并放入机器后产生一个以三个0开头的单词?

这和之前的情况类似,我们已经知道答案了,计算这样一个数字的一个唯一的方法就是枚举世界上的每个数字。

经过了几千次尝试后,我们或许能偶然发现一个数字,比如说21191,加上20893(21191 + 20893 = 42084)后放入机器中,可以得到一个满足需求的单词。

在这种情况下,21191这个数字就是20893的印章。假设有一个记录页上写着20893,那么要密封该页(即任何人都不能更改该页的内容),我们就会在该页贴上21191的标签,封口号(即21191)一贴在记录页上,就表明该记录页已经被密封了。

封口号被称为“工作证明(Proof Of Work)”,表明这个编号是经过努力的计算得来的,不过为了说明,我们更乐意叫它封口号。

这样,想要验证一个记录页是否被篡改就很简单了,只需将记录页的内容加上封口号,再输入到魔法机器中,观察产生的结果是否以三个0开头。如果出现的单词不符合我们的要求,那就证明该页被更改了,没有任何用处。

我们将使用类似的密封机制来密封所有记录页,并排列好它们放入各自的文件夹中。

最后,密封我们的记录页

为了密封包含系统中交易的记录页,我们需要计算出一个数字,这个数字添加到交易列表并输入到机器中,得到一个以三个0开头的单词。

“以三个0为开头的单词”只是一个例子,它说明了哈希函数的工作原理,实际情况比这复杂得多。

花费时间和电力计算出的这个数字,就被用来作为记录页的封口号。如果有人试图篡改该页的内容,其他人可以使用封口号来验证它的完整性。

现在,我们已经知道了如何封页。那么转回我们在记录页上完成第十笔交易的时间,我们已经用光了空间不能再增加新的交易了。

当每个人都用完了记录页的空间时,他们就会沉迷于计算记录页的封口号,以便将它们放入文件夹中。系统中的每个人都会计算,第一个计算出封口号的人会向其他人宣布这个数字。

一听到密封号,每个人都会立刻验证它是否产生了所需的输出。如果通过了验证,那么每个人都将使用这个数字来密封他们的记录页,并放入文件夹中。

但是,对于某个人(比如7号)来说,公布的密封号不能产生所需的输出结果,该怎么办?这种情况并不罕见,可能有以下几个原因:

  • 他可能听错了系统中的某个交易
  • 他可能写错了系统中的某个交易
  • 在记录某些交易时,他可能试图伪造以使自己或系统中的其他人受益

不管原因是什么,7号只剩下一个选择,那就是放弃他的记录页,从其他人哪里拷贝一份,然后放进他的文件夹中。如果他表示反对,那么他就无法继续进行交易,而且被禁止成为系统的一部分。

多数人通过的密封号就是真实的密封号。

可能你会问,既然知道了别人计算出密封号后会向他们公布,那为什么他们自己还要花费资源计算呢?为什么不闲坐着静静等待公布呢?

这是一个很好的问题,恰恰指明了区块链的激励来源,第一个计算出密封号的人会因为他的努力(即消耗的 CPU 功率和电力)而获得免费的金钱。

试想一下,如果5号计算出一个记录页的封口号,他就会得到免费的金钱,比如说1美元。这些钱是凭空冒出来的,换句话说,5号的账户余额会增加1美元,而其他人的余额不会减少。

比特币就是这样诞生的,它是区块链上进行交易的第一种货币。为了回报对封口号努力的计算,人们被授予比特币。

当足够数量的人获得比特币时,它们的价值就会增加,促使其他人也想获得比特币。

奖励让系统中的每个人都保持工作。

一旦每个人都将记录页放入文件夹中,他们就会拿出一个新的记录页,并永远重复这个流程。

将一个记录页想象成一个交易区块,将一个文件夹想象成一个记录页(区块)的链表,这样,就演变成了区块链。

至此,你已经掌握了区块链的工作原理。


还有一个小问题没有告诉你。

假设文件夹中已经有了五个密封好的记录页,如何有人想篡改第二页的一笔交易呢?为修改后的记录页生成一个新的密封号就可以了吗?

为了防止有人返回修改记录页和密封号,需要在计算密封号的过程中稍微变化一下。

保护密封号的修改

还记得刚才讲过的两个盒子吗?一个盒子中包含数字20893,另一个盒子中的数字需要你计算。在现实中,要计算一个区块的密封号,不是两个盒子,而是两个填充好的,一个需要计算的。

当这三个盒子的内容加和并输入机器时,从右边出来的答案必须满足要求的条件。

我们已经知道,一个盒子包含交易列表,一个盒子包含封口号,第三个盒子有些不同,它包含了前一页魔法机器的输出结果。

通过这个简单的小技巧,我们确保了每个记录页都依赖于上一个记录页。因此,如果某个人必须修改历史的记录页,那么他还需要修改之后的所有记录页的内容和封封口号,以保持链表的一致。

如果我们一开始想象的十个人中的一个试图欺骗篡改区块链的内容,他就部分不调整几个记录页,并为这些记录页计算出新的封口号。我们知道计算封口号是一个很困难的过程,因此系统中的一个不诚实的人无法打败其他九个诚实的人。

还有可能发生这种情况,一个不诚实的人作弊,他会创建一个新的链表。不过这个新的链表永远无法赶上诚实的链表,因为一个人的努力和速度无法打败其他九个人的累计之和。因此,系统中最长的链表是最诚实的链表。

当我告诉你一个不诚实的人无法打败九个诚实的人时,你是不是有新的疑问呢?

不是一个,如果六个人都变得不诚实呢?

在这种情况下,协议将彻底失败,这被称为“51%攻击”。如果系统中的大多数个体u决定变得不诚实并欺骗系统中的其他部分时,协议就毫无价值了。

这也是个区块链可能崩溃的唯一脆弱原因,要知道,这几乎是不可能发生的,但我们都必须知道系统的弱点,它是建立在大多数人始终诚实的基础上的。

朋友们,这就是关于区块链的所有内容了。如果你发现有人被这项技术甩在身后,那么就把这篇文章分享给他,让他将链接添加至书签。