一个故事给你讲明白比特币核心技术-区块链

起 因

随着比特币价格的持续攀升,眼下炒币成为了一个热门的话题,很多专家和大咖也纷纷站台表达自己的观点,目前来看专家们的开发也非常不统一,一派觉得比特币是电子时代的黄金,会有持续的升值空间;而另一类则相反觉得比特币就是第二个“郁金香泡沫”,甚至会比郁金香泡沫更加严重。那就让我们一起来了解比特币和比特币衍生出来的技术区块链。

什么是比特币?它是如何工作的?

这个恐怕不是只言片语能给大家讲明白的一个东西,我们通过下面一个故事来说明。

故事的开始

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

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


image.png

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

客户经理:“好的,老板。”

客户经理随后确认了你的账户是否有足够的余额。一看余额充足,所以客户经理进行了如下的操作:


*

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

那么我们来想想刚刚到底发生了什么。你和 Joe 都信任那家银行来管理你们各自的财产。整个过程中实际并没有真实货币的流动。整个过程只不过是修改了两个账户里面的余额值而已。更准确地说,是通过你们的授权让银行去修改了两个账户里面的余额值。

我们传统的货币体系中,如果非现金当场交易的,而是转账等电子交易双方的信任机制建立需要借助第三方(我们这个例子中的银行)。这种 “中间人” 的方式由来已久。

你可能又想问了:“这种信任机制有什么问题吗?”

问题在于除交易双方以外的 “监督者” (第三方)只是单个个体。这种情况可能存在以下风险:

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

  • 如果第三方存储的我们的交易数据或者余额被不小删除了怎么办。

  • 如果第三方的员工偷偷的把你账户的钱转到他们账户怎么办。(当然银行有权限管理,员工应该也做不到)

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

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

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

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

现在我们就开始学习这个分布式账本是如何让大家信任的。

故事的发展

该方法得以实行的必要条件是必须有足够多的人愿意参与进来,有点类似于导航软件一样,你在使用导航开车的时候帮别人提供了路况信息,同样别人也为你提供了路况信息。


10个小伙伴

如上图所示,我们假设有 10 个人参与。在事前我们达成协议的前提下,他们之前进行转账之前必须告诉其他所有的这10个人,那这样每个人那里就都有一个账本了。就有效的解决了刚才我们说的中心话的问题了,但是依然还会有很多问题需要解决我们还需要接着故事进行。

接下来,我们先按照步骤把上面的逻辑缕缕
1. 我们要怎么保存转账记录了

一开始每个人都会获得一个空文件夹。随着时间推进,这十个人都会在他们现在空的文件夹里不断添加记录交易信息的纸张。

2. 当交易发生时

交易网络中的每个人都带着纸和笔坐下来,记录下在这个系统中发生的每一笔交易。
假设,2 号想给 9 号 10 美元。为了完成这笔交易,2 号大声地告诉每个人:“我要转 10 美元给 9 号。请大家都在自己的纸上记下来。”然后每个人都检查确认 2 号是不是有 10 美元及以上的余额能够转给 9。如 2 号余额足够,那么大家都在空白纸上记录下这笔交易。这笔交易这样就算完成了。


交易

3. 持续发生的交易

随着时间的流逝,这个交易网络中出现交易需求的人越来越多。无论何时他们产生交易需求,都会通知网络中的每个人。只要有人听到了这个通知,TA就会在他们各自的纸上记录下来。

这个过程会持续进行,直到这张纸上的空间不足。假设每张纸只能记录 10 次交易,那么只要第 10 次交易完成,每个人纸上的空间也就随之耗尽。

当白纸被填满

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

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

在把纸张放进文件夹之前,我们需要对这张纸上面记录的内容进行盖戳,类似于骑缝章吧。总之目的就是不能再修改了。

并且如果每个人都相信这个 “封印”,那么也就意味着每个人都绝对信任这张纸上的内容。这种密封方式也是区块链的关键所在。

以前第三方或中间人都会说服我们相信无论他们在注册表中记录了什么,里面的内容都不会发生改变。但在现在这个分布式的、去中心化的系统中,这个印章(密钥)就为我们建立了这种信任机制。

故事的高潮

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

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

假设我们现在有一个机器,如果你把一个里面装着东西的盒子从左边放进去,这个魔法机器会从右边吐出一个装着其它东西的盒子。


魔法机器

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

魔法机器(即哈希函数

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

如果已知条件是输出结果为 “dcbea”,要想知道从左边输入的是什么基本上是不可能的。但是每次如果你把 4 放进去,最终的输出结果“dcbea” 是肯定的。

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

哈希(26)=94c8e

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


魔法机器

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

“如果我想从右边得到一个以 3 个零为开头的结果(如 000ab、00098、000fa 等),那么我应该从机器的左边放入什么内容?”


魔法机器

预测输入的内容

这个机器有一个单向性的属性:给出右边的预期结果后,我们无法计算出左边放入的内容。那是不是意味着这个问题无解?倒也未必。

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

image.png

没有好的办法,只能是把每个数字都尝试一遍

通过成千上万次的尝试最终找到了这个符合我们输出要求的数字。

image.png

通过上面我们可以知道如果通过输出结果来找到输入数字这种逆向计算的确非常困难。但是如果我们得到了预测的输入内容,验证该输入是否能得出我们想要的结果就非常非常容易了,只要通过我们魔法机器就马上知道了。记住,这个机器最大的特点就是每个TA输出的结果,最终只能对应到一个输入的数字绝无例外的。

如果我给你 72533 这个数字,然后问你:“这个数字输入魔法机器后会不会输出以 3 个零为开头的结果?” 这个问题就简单到简直在侮辱我们的智商了。

因此这个机器最最最重要的属性是——知道结果,要想算出输出非常困难,但是如果我们知道输入的数字和输出结果,验证两者是否匹配很简单。

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

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

假设我给了你两个盒子。第一个盒子里面有数字 20893,你能不能想出一个数字,这个数字与第一个盒子里的数字相加后的结果放入魔法机器后,我们能够得到一个以 3 个零为开头的字符结果。

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

经过几千次的尝试,我们会在 21191 这个数字这里停下,21191+20893=42084,把 42084 放入这个机器后所得到的结果正是我们想要的。

在这个案例中,21191 这个数字就是 20893 这个数字的 “封印”。假设有张纸上写着 20893 这个数字。为了密封这张纸(即没有人能够再对其内容作改动),我们把带有 21191 标签的徽章贴在纸上,密封完成。


密封的数字

被密封的数字
用来密封的数字实际被称为 “工作证明(Proof Of Work)”,因为这个数字是通过努力计算得来的。本文为了简单易懂,我们称它为 “密封数字”。

无论谁想验证这个页面是否被改动过,只要把页面上的内容与密封号码叠加后放入魔法机器。如果机器输出的内容是以 3 个零为开头的,那么该页面内容是没有被 “污染” 过的。但如果结果不满足这个特点,我们就应果断丢弃

这个页面,因为上面的内容已经被改动、已经失效。

密封过程总结

要想密封记录整个交易网络中交易流水的页面,我们需要找到那个加入交易内容并输入机器后会得到以 3 个零为开头的字符的关键数字。

image.png

注意:“以 3 个零为开头的字符” 只是一个举例,简单地反应哈希函数的工作原理。实际问题处理起来会复杂得多。

只要花费一定的时间,交易网络中的参与者就能够计算出这个数字,该页面也就随之密封。一旦有人更改了页面上的内容,任何人都能够通过这个密封号码来验证这个页面的完整性。

故事的高潮 二

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

当这个页面上记不下更多的交易记录时,交易网络中的每个人都会停下来计算该页面的密封数字,然后将其放入文件夹。如果第一个人算好了密封数字,他就会向所有人公布。


image.png

听到密封号码后,大家都去验证这个数字是否能满足输出需求。如是,则在他们的页面上贴上这个标签,再把这个页面放进文件夹。

但是如果 7 号算出了密封号码并 “昭告了天下”,但结果大家发现这个数字并不满足他们的输出需求怎么办?这样的情况也很常见。原因可能有以下几点:

  • 公布交易信息时听错了;

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

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

不管出于什么原因,7 号只有一种选择——丢弃自己这张纸,然后从别人那里复制一份副本放进他自己的文件夹。如果不把这个页面放进文件夹,他就不能继续记录接下来的交易记录,这也就相当于把他从这个交易网络中踢掉了。

说到这里,我相信有的人脑海里又出现了一个疑惑:既然有人计算好密封号码后会公布,为什么我们每个人还要花费那么多时间都去计算一遍?其他人为什么不歇着、坐等公布?

Good question! 区块链含有特有的奖励机制,网络中每个人都有资格获得奖励。第一个计算出密封号码的人能够获得一定奖励

我们再来简单地假设一下,如果 5 号第一个算出了页面的密封号码,并获得了 1 美元的金额奖励,那么这 1 美元就是凭空出现的。换句话说,假如他账户里本来余额 5 美元,现在增加了 1 元,但是这 1 元没有从其它任何人的账户里扣除,

即没有减少任何人的账户余额。

这就是比特币的起源。它是在区块链(分布式账目)上发生交易的第一种货币。如果在这个交易网络上持续努力,你同样也能获得回报,这个过程就是我们所说的 “挖矿”。

拥有比特币的人越来越多,这些人一刻不闲着地开始炒这种虚拟货币,不断扩大市场对比特币的需求,再进一步提高比特币的价值。就这样周而复始地把比特币的价格炒得很高。

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

他们把纸张放进文件夹后,拿出一张新的空白纸张,然后再次重复前面的过程——循环往复、永无止境。

假设文件夹中已经有 5 个被密封的页面。如果我为了谋取私利修改了第二个页面的其中一笔交易会发生什么?前面已经提到过,所有人都可以通过密封号码查出交易内容已经发生改变。但是**如果我根据修改的内容重新计算密

封号码,然后把新号码贴在纸上,出现这样的情况怎么办?**

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

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

还记得之前我假设你有两个盒子,一个包含 20893 这个数字,一个是用于计算的空盒子吗?在区块链中计算密封号码,实际上存在三个盒子,而不是两个,其中两个是有内容的,一个是待计算填充的。

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

一个盒子里是交易记录、一个盒子是密封号码,第三个盒子是通过哈希函数计算出来的前一页的输出结果。

image.png

通过这个小技巧,我们能够确保每一页的密封号码都与前一页的内容相关联。因此如果有人修改了历史页面的内容,他需要改动接下来每一页的密封号码,从而保证整个链路的一致性。

我们假设十个人中有一个人想要恶意修改区块链中的内容(包含记录了交易历史页面的文件夹),那么他需要调整很多页面,计算改动页面之后所有页面的密封号码。我们都知道计算密封号码的工作非常困难。因此,**整个交易网络中的一个叛徒最

终还是会输个剩下的 9 个好人**

从这个叛徒想要更改内容,他就需要在整个网络中创建另一个区块链,但是这个区块链几乎不可能赶上好人们创建的链路——一个人的力量赶不上剩下 9 个人的共同努力。因此,有一点非常明确,区块链规模越大,安全性和可信任度越高

image.png

通过上面的描述我们理解了想要“造假”还是很难的,但是如果 10 个人中有 6 个人都叛变了怎么办?

如果出现这样的情况,这种情况被称为 “51% 攻击”。如果整个网络中的大多数人都商议好要一起造假,欺骗剩下不到半数的人,那么整个账本就可以任由他们去书写了。

这是区块链最大的弱点。尽管这样的情况不可能出现,但我们还是要谨记这个系统的弱点。整个体系都是基于一个假设:整个交易网络中的大多数人都不会叛变。

总结

好了,到这里相信大家对比特币和区块链有一个基本的了解了,再给大家明确两个概念;
比特币:一种基于区块链技术的应用;
区块链:是一种基于互联网的技术,核心是打破了之前中心化的思想,通过大家认可的共识机制构建去中心化应用;

个人微信号有问题交流

原文地址:https://hackernoon.com/wtf-is-the-blockchain-1da89ba19348
原文作者:Mohit Mamoria
翻译编辑:Seven