大数据文摘作品
编译:小鱼、蒋宝尚
“老矿工”用5000字讲清区块链工作原理:去中心化、分布式存储、哈希函数加密,这些都是什么?
除非你居住在世外桃源,要不然你一定听说过比特币和区块链。毕竟它们是当下最热门的话题之一,也被评为了年度流行语。即使那些没有接触过数字货币、也不知道其如何工作的人也在讨论区块链。
在理解这些新技术的时候,我那些没有技术背景的朋友“懵了”,他们一连几个星期缠着让我解释到底什么是区块链。
作为比特币的资深“老矿工”,我用最浅显易懂的语言写了这篇文章,帮助大家理解当下最流行的趋势。
区块链:为什么我们需要如此复杂的东西?
“对于每个复杂的问题,都有一个看似简单明了、实际上却是错误的答案。”
—— H. L. Mencken
和其他文章在开头尝试定义区块链不同,我先解释它解决的问题。
想象一下,你最好的朋友Joe正在国外旅游时候,突然给你打电话说:“我的钱完全花光了,借我点钱。”
因为你是热心肠的人,所以你说:“马上打给你。”
然后,你打电话给你的银行客户经理:“从我的账户转1000美元到Joe的账户。”
你的客户经理回复:“好的,先生。”
他登陆了你的账户,查看了一下你是否有足够的账户余额进行1000美元的转账。你很富有,有足够的钱可以转账,于是他在一个表格中做了如下登记:
之后,你打电话告诉Joe,“我已经给你寄了1000美元,你可以去银行取钱了。”
整个过程中,你和Joe都信任银行并让它管理你的钱。上述交易过程并不涉及真金白银,只是需要在一个表格中进行修改。更准确地说,这个表格并不是你和Joe拥有或能够直接控制的。
这就是现行制度所体现的问题:为了建立起我们之间的相互信任,我们需要求助独立的第三方。
多年来,我们通过“中间人”才能信任彼此。你可能会问,“这种中间人制度会带来什么问题?”
问题就在于,“中间人”的数量是有限的。只要一个人或一个组织有意无意地腐败了,那么整个社会就将陷入混乱状态。
- 如果表格中的交易记录在火灾中烧毁,该怎么办?
- 如果你的客户经理写了1500美元而不是1000美元呢?
- 如果他故意这样做呢?
多年来,我们一直把所有的鸡蛋都放在别人的篮子里。
是否能够有一个系统可以在没有第三方(银行)的参与下进行转账?
为了回答这个问题,我们可以想一想,转账的含义是什么? 只是在表格中登记的一个条目。
那么,有没有办法在不依靠第三方的情况下,维护我们之间的交易记录?
你可能已经猜到了答案——那就是区块链。
区块链:一种不需要依赖第三方的交易方法
区块链如何实现自己登记交易记录?这就需要用到分布式记账的技术。
这种方法要求有足够多的人选择不依赖于第三方。 只有这样,这些人才能依靠自己运营这个去中心化的系统。
“可以存一些比特币,万一以后它涨了呢。如果这么想的人多了,那设想就变成现实了。”
——中本聪
系统里有多少人就算足够多了?至少三个。 但这里,我们假设有十个人想要放弃银行或任何其他管理交易的第三方。在彼此同意的情况下,他们一直都有对方账户的详细信息但不知道对方的身份。
1.建立一个空文件夹
每个人都从建立自己的空文件夹开始。随着这个过程不断推进,这十个人将不断向他们的空文件夹中添加页面。这个页面集合就是追踪交易的表格。
2.开始交易
接下来,网络中的每个人手里都有一支笔,用来填写空白页。 每人都准备好写入系统内发生的任何交易。
现在,假设2号想转账10美元给9号。
为了完成交易,2号发表声明告诉大家,“我想转10美元给9号。收到消息的人就在自己的空白页上进行交易记录。”
每人都检查2号的余额是否足够,是否能将10美元转给9号。如果她余额足够,每个人就会在他们的空白页面上记录这笔交易。
3.继续进行更多交易
随着时间的推移,会有更多的人利用该网络进行转账交易。每当他们想做一个交易,他们就通知其他人。只要有一个人听到这个通知,TA就会把交易记录写在TA的页面上。
记录将继续进行,直到所有人都用完当前页面上的空间。假设一个页面的空间只能记录十个交易,当第十个交易完成后,每个人的空间也都用完了。
当一个页面被填满时,就可以将其放入文件夹中,并创建出一个新的页面,重复上述步骤2的过程。
4.收起页面
在我们将文件放进文件夹之前,我们需要用网络上每个人都同意的唯一数字来加密。通过加密,密码副本将放入每个人的文件夹中,我们就能确保没有人能对加密数字进行修改,且不会随时间而改变。不论是在今天、明天,甚至是一年之后,密码副本一旦进入文件夹,它将始终停留在文件夹中并处于加密状态。而且,如果每个人都信任这一加密方式,那么他们就会相信页面内容。页面的加密方式是网络交易的关键。
保护页面不被修改这项工作叫做“挖矿”。但为了简单起见,我们将继续称它为“加密”。
在区块链出现前,我们相信第三方/中间人,相信他们在表格中登记的每笔交易都不会改变。而在刚刚描述的这种分布式和分散系统中,人们也会信任这一加密方式。
用来加密的魔法机器:哈希函数
在我们学习如何加密页面之前,我们需要知道加密的原理。我称之为“魔法机器”。
想象一台由厚厚的墙包围的机器。如果从左边给机器发送一个非空的盒子,它会“吐出”一个包含其他内容的盒子。
这台机器被称为“哈希函数”,但是为了方便理解,我们暂且称它为“魔法机器”。
假设你从左边发送数字4,它在右边吐出单词:’dcbea’。
它是如何将数字4转换成’dcbea’这个词? 没人知道。而且,转换过程不可逆。
即使你知道机器输出了“dcbea”,你也无法知道对应的输入内容。但是每次你把数字4输进机器上,它总是会吐出同一个词“dcbea”。
图:哈希(4)== dcbea
发送数字26会怎么样?
图:哈希(26)== 94c8e
我们这次得到了’94c8e’。 有趣! 所以机器输出的结果中也会包含数字。
现在,如果我问你以下问题:
“我从左边给机器输入什么,可以从机器右边获得一个以三个0开头的单词?例如,000ab,00098,000fa或000XX。”
上面已经提到,机器有一个属性,即我们无法从右边的结果逆推出左边所输入的内容。
面对这样的机器,如何解决刚才提出的问题?
我想到一种方法。 为什么不一一地尝试宇宙中的每一个数字,直到我们得到一个以连续三个0开头的单词?
经过几千次的尝试,最终会得到一个能够产生正确结果的数字。
要计算给定输出的输入内容是非常困难的。 但与此同时,验证输入输出是否对应确实很容易。请记住,对一个给定的数字,机器每次都会吐出相同的单词。
如果我给你一个数字,比如说72533,并且问你,“把这个数字输进机器,是否输出了一个以三个0开头的单词?”,完成这个过程你觉得有多困难?
你需要做的就是把数字扔给机器,看看在右边输出了什么而已。
这样的机器最重要的特性就是,给定一个输出,计算输入是非常困难的,但是给定输入和输出,验证输入输出是否对应确实很容易。
如何加密一个页面?
我们将使用这个神奇的机器来加密页面。像往常一样,我们将从一个假设开始。
想象一下,我给你两个盒子,第一个盒子里包含了数字20893。然后,我问你,“你能算出这样一个数字吗:如果用它加上第一个盒子里的数字,然后发送给机器,可以得到一个以三个0开头的单词。”
这与我们之前看到的情况类似。我们已经了解到,计算这样一个数字的唯一方法是通过尝试整个宇宙中可用的每一个数字。
经过几千次尝试,我们会偶然发现一个数字,比如说21191,当用它加上20893(即21191 + 20893 = 42084)并发送给机器时,会产生一个满足我们要求的词。
在这种情况下,号码21191成为20893的封印。假设有一个页面的内容是20893。为了加密这个页面(即让人无法改变它的内容),我们在这页上添加一个名为“21191”的封印。 一旦加密数字(即21191)印在页面上,页面就被加密了。
加密数字也可以被称为“工作证明”,意思是这个数字证明了为了计算它所做的努力。
如果有人想验证页面是否被修改,他所要做的就是将页面内容加上封印数字,并送到魔法机器。如果机器给出以三个0开头的单词,则证明页面内容不变。如果结果不符合我们的要求,我们可以扔掉页面,因为它的内容是妥协的,是没有用的。
我们将使用类似的加密机制来加密我们所有的页面,并将它们放在各自的文件夹中。
为了加密包含网络交易的页面,我们需要找到一个数字,当把它附加到交易清单上并送给机器时,我们能在右边得到一个以三个0开头的词。
注意:我一直只使用“以三个0开头的词”这个短语作为例子。因为它演示了哈希函数如何工作。真正的计算原理比这更复杂。
在机器上花费时间和电力后,一旦计算出这个数字,页面就被这个数字封印了。如果有人试图改变页面的内容,任何人都可以利用封印数字验证页面的完整性。
现在我们已经知道如何加密页面了,我们将回到编写第十个交易的页面上。编写这十个交易用尽了我们的空间。
当每个人用来编写进一步交易的页面都用完时,为了获得页面,他们就会不停的计算加密数字,以便可以将其隐藏在文件夹中。
网络中的每个人都会计算加密数字。第一个在网络中找到的人会将其宣布给其他人。
一旦收到加密数字,每个人都会验证它是否产生合法的输出。输出如果合法,每个人都用这个数字标记他们的页面,并将其放在文件夹中。
但是,如果有个人说公布的加密数字产生的输出不合法,怎么办? 这种情况并不罕见。可能有以下原因:
- 他可能误读了网络中公布的交易
- 他可能误写了在网络中公布的交易
- 在写交易时,他可能会试图欺骗或不诚实,或者在网络上偏袒自己或其他人
不管是什么原因,这个人只有一个选择——放弃他的页面,并复制别人的页面放在文件夹中。 如果他没有把他的页面放在文件夹中,他将无法编写更多的交易,也会被禁止成为网络的一部分。
大多数人同意的加密数字就变成了真正的加密数字。
区块链的工作原理
那么,为什么每个人都努力计算加密数字,即使知道别人会计算并向他们宣布?为什么不坐下来等待通知呢?
这就是激励机制出现的地方。每个人都是区块链的一部分,都有资格获得奖励。计算加密数字的第一个人将因为他的努力(即消耗的CPU功率和电力)而获得奖金。
简单想象一下,如果5号计算了一个页面的加密数字,他会得到一些钱,比如1美元,这些钱是凭空而来的。换句话说,5号的账户余额增加了1美元,而其他人的账户余额却不会减少。
这就是比特币存在的方式。这是第一个在区块链(分布式帐本)上交易的货币。为了保持人们在网络上继续工作的动力,人们将获得作为回报的比特币。
当一定数量的人都拥有比特币时,比特币的价值就会增长,那么其他人也会想购买比特币。这使比特币的价格进一步增长,继而更多的人想购买比特币,比特币的价格又会增长。
奖励使每个人都有了继续在网络上工作的动力。
而且,一旦所有人都将页面收到他们的文件夹中,他们就会带出一个新的空白页面,这个过程在不停重复进行。
一个页面可以被视为一个交易块(区块),而文件夹可以被视为一连串页面(区块链)。
这就是区块链的工作原理。
除此之外,还有一件小事。
想象一下,这个文件夹中已经有五个页面了——全部用加密数字进行了加密。如果我为了自己的利益回到第二页并修改交易,该怎么办?加密数字可以让任何人发现交易中的不一致性,对吗?如果我继续为已修改的交易计算一个新的加密数字,并在页面上添加这一数字,该怎么办呢?
为了防止某人返回并修改页面(Block)以及加密数字,计算加密数字的方法有一些小小的改动。
加密方式的改进
请记住我给出两个盒子的目的:一个盒子存放号码20893,另外一个则为你的计算预留空间。实际上,为了计算区块链中的加密数字,两个盒子是不够的,其实有三个盒子:两个盒子作为预填盒子,另外一个盒子用于计算。
当这三个盒子所有的内容被发送到机器时,从右边出来的答案必须满足要求。
我们已经知道,一个盒子用来存放交易清单,另一个盒子用来存放封印数字。 第三个盒子包含魔法机器的前一页输出结果。
有了这个小技巧,我们就能确保每一页都依赖于它的前一页。 因此,如果有人要修改一个历史页面,那么他必须改变所有页面的内容和加密数字,以保持区块链上的一致性。
如果我们开始时想象的十个人中的一个人试图欺骗和修改区块链(包含交易记录的页面的文件夹)的内容,他将不得不调整几个页面并计算新的加密数字来加密这些页面。我们知道计算加密数字有多困难。因此,网络上一个不诚实的人无法击败九个诚实的人。
如果一个不诚实的人试图在一个页面上做出欺骗行为,那会在网络中创造另一个链条,但是欺骗的链条永远无法赶上诚实的链条——因为一个人的努力和速度无法击败九个人累积的努力和速度。因此,这个机制可以保证网络中最长的链是最诚实的链。
如果,不是一个人不诚实,而是有六个人不诚实呢?
在这种情况下,协议就变得一塌糊涂。它被称为“51%攻击”。如果网络中的大多数人都变得不诚实,并欺骗网络的其余部分,协议目的就失效了。
如果区块链会崩溃,那么这可能就是唯一可能的原因。虽然这种情况不太可能发生,但是我们必须知道区块链系统的弱点:它建立在大多数人群总是诚实的假设之上。
以上就是“老矿工”关于区块链的全部介绍。你看懂了吗?欢迎留言分享你的“矿工”经验。