上接前篇 《区块链到底是什么?上》
有点意思!那么我们是怎么把纸密封的呢?
下面我们说说怎么密封的。
魔法机器
想象一下,有这么一种机器,它被厚厚的墙包围着。你在一个盒子里装了些东西,然后把这个盒子从机器左边放进去,之后这台机器会吐出一个箱子,这个箱子里装了些另外的东西。
这台机器就是“哈希函数”,但是我们不想把文章写得太学术。所以,还是叫它“魔法机器”吧。
假设,你从左边把数字4放进去,那么我们发现,魔法机器输出了下面的内容:dcbea。
它是怎么把数字4转换称这几个字母的呢?其实没人知道它是怎么转换的。而且,这是个不可逆的过程。就算给你"dcbea",你也不可能知道这台机器从左边接受到的是什么内容。但是,每次你把数字4发送到这台机器,它总是给你输出“dcbea”。
如果我们发送别的数字会怎么样?比如26;
输入26,机器输出了“94c8e”。因缺思婷。
下面我问你个问题:
要想让机器输出以3个0开头的内容,我应该从左边给机器发送什么内容?比如说,我想让机器输出000ab,00098,或者000fa。
想一下这个问题。
我上面说过,这台机器有一个性质,就是即使我们知道它的输出,也无法计算出我们应该输入什么。对于这样的一种机器,我提的那个问题有什么解决办法吗?
我想到了一种解决办法。就是把所有的数字都试一遍,直到最后输出了以3个0开头的内容。
如果运气好的话,试了几千次之后,我们就能得到我们想要的内容:
要想根据输出来推导出输入非常的困难。但是,这样就非常容易验证输入是否能匹配输出。还记得吗,这台机器对于同一个数字的输出都是一样的。
假如给你个数字,比如72533,你觉得把这个数字发送到那台机器里,最终的输出是以3个0开始的内容的难度有多大?
你需要做的只是把那个数字发送到机器里,看看它的输出符不符合要求就行了。就这么简单。
这种机器最重要的性质就是:给定输出,要想推导出输入及其困难;但是给定输入,要想验证输出则非常容易。
请记住这个特性。
如何使用这种机器去进行密封呢?
我们将使用这台魔法机器去把我们的纸给密封起来。让我们从一个想象的情景开始。
想象一下我给你两个盒子。第一个盒子里有一个数字20893.然后我问你:你能不能算出这样一个数字,当把这个数字与第一个盒子里的数字相加,之后发送到那台机器,让机器输出一个以3个0开头的内容?
这和我们之前的问题有点类似,而我们已经知道,只有一种方法能计算出这个数字,那就是一个一个试。
试了几千次之后,我们碰到了一个数字,21191,把它和20893相加,21191+20893 = 42084,然后把它发送给那台机器,输出的内容符合我们的要求。
在本例中,这个数字21191就是数字20893的封条。假设有一张纸上的内容就是数字20893.为了把这张纸封住(这样就没人能篡改里面的内容),我们把“21191”盖在这张纸上。只要把封条数字(21191)盖在纸上,那张纸就被密封了。
那个封条数字就是“工作量证明”,这个数字表示花了多少力气去计算。但是我们还是叫它“封条数字”好了。
如果有人想去验证一下纸里的内容有没有被修改,那么他要做的就是:把纸里的内容加上封条数字然后发送给魔法机器。如果魔法机器输出的内容是以3个0开头的,那么表明纸里的内容没有被修改过。如果魔法机器输出的内容不符合要求,那么我们就可以把那张纸扔掉了,因为它的内容已经被修改了,也就没有用了。
我们将使用一个类似的密封机制来把我们所有的纸都密封起来,最后把他们放到各自的文件夹里。
最后,把我们的纸密封上
为了把这些记录着网络交易信息的纸都密封住,我们需要计算出一个数字,当把这个数字添加到交易列表内容里在发送到魔法机器后,我们能得到一个以3个0开头的内容。
注意,我说“以3个0开头的内容”只是举个例子。只是用来说明哈希函数是怎么运作的。实际的情况要比这个复制得多。
一旦算出那个数字之后,就用那个数字把那张纸密封起来。一旦有人想修改纸里的内容,封条数字就能让任何人去验证纸里的内容。
现在我们知道了如何把纸给密封起来,让我们回到上面的步骤,也就是我们在纸上写了十条交易信息,这时候没有地方记录更多的信息了。
一旦大家的纸都写满了,那么他们就开始计算那个封条数字,以便把纸封到文件夹里去。网络里的每个人都参与计算。第一个算出封条数字的人就大声告诉大家他算出来了。
一旦听到有人算出来了,大家就开始验证这个数字对不对,输出的内容是否符合要求。如果通过验证,那么大家都用这个封条数字把各自的纸密封起来,放到文件夹里去。
假如有人,比如说7号,他验证的时候发现封条数字不符合要求,怎么办?这种情况不太常见。原因可能是:
- 他可能漏掉了一些交易信息
- 他可能把交易信息写错了
- 他可能在记录交易信息的时候,曾经试过作弊或者欺骗
不管原因是啥,7号只有一种选择:扔掉他自己的纸,然后从别人那抄一份,这样他也能把纸放进文件夹里。如果他不把纸放进文件夹里,他就不能继续记录交易信息。也就是无法继续参与这个网络。
那么既然有别人会去计算封条数字了,为什么还要每个人都去算呢?直接坐着等结果就好了
这个问题问得好。这涉及到了激励因素的问题。每个参与区块链网络的人都能获取回报。第一个算出封条数字的人将获得一笔奖金,奖励他的贡献。
比如,如果5号算出了封条数字,那么他将获得一笔奖金,比如1美金。
这就是比特币的基本原理。它是区块链上的第一种货币。作为回报,奖励那些为比特币网络做出贡献的人,他们将获得比特币。
当有足够多的人拥有比特币的时候,它们的价值就会提升,这也会促使其他人想拥有比特币;这又反过来提升了比特币的价值;然后又促使更多的人想拥有比特币;如此循环往复。
一旦所有人都把纸放进文件夹之后,他们就拿出新的纸来,继续重复上面的步骤----直到永远。
可以把一张纸视为一个交易区块,把文件夹当作那些纸的链,这样就构成了区块链.
我的朋友,这就是区块链的工作原理。
然而还有一件事,我没有告诉你。
假如文件夹里已经有五张纸了,这些纸都用封条数字密封着的。如果我去拿了第二张纸,为了自己的私利修改了一个交易,这样的话怎么办?封条数字会让大家监测到有交易被修改了,对吧?但是如果我再狠点心,计算出一个新的封条数字,用这个新数字把那个修改过的纸给封住,这样的话要怎么办?
为了防止这种情况的发生,这就要介绍一下封条数字是怎么计算出来的。
防止修改封条数字
记得上面我说过,我给了你两个盒子,一个装有数字20893,另一个是空的,对吧?在现实情况中,要想计算区块链的封条数字,你有三个盒子而不是两个。
当三个盒子里的内容都被加起来发送到魔法机器里的时候,机器输出的内容必须符合必要的条件。
我们已经知道,一个盒子保存着交易列表信息,一个盒子将用来保存封条数字。第三个盒子保存着魔法机器为上一张纸输出的内容。
通过这个技巧,我们就能保证每张纸的内容其实是依赖于它的前一张纸。因此,如果有人修改了以前的纸的内容,那么他必须把那张纸之后的所有内容和封条数字都改了,才能保证区块链的内容是一致的。
如果有个人(最开始我们说的那十个人中的一个)想作弊,并且篡改区块链的内容(保存着交易信息的文件夹),他必须修改好几张纸的内容,并且计算出这些纸的新的封条数字。而我们已经知道要想计算出封条数字是十分困难的。因此,网络中的一个不诚实的人,是打不赢另外九个诚实的人的。
那个不诚实的人修改了某张纸的内容,这会在网络中创造出另外一条链,但是这条链永远也赶不上那条诚实链-----因为一个人的努力和速度比不上九个人的努力和速度。因此,这就保证了网络中最长的链就是那条诚实链。
假如不是一个人,而是6个人不诚实呢?
这种情况的话,那个协议就会失败。这称之为“51%攻击”。如果网络中的大多数人都选择做不诚实的人,想作弊,想欺骗网络中剩下的诚实的人的话,那么协议就会失败。
这也是区块链会失败唯一原因。虽然这不太可能发生,但是我们必须知道这个系统的缺点。区块链系统是建立在假设多数人都是诚实的这个基础之上的。
这就是区块链的所有知识了。如果你发现有人问“区块链到底是啥子?”,你就可以跟他们解释解释了。
哈希函数的单向性是最重要的原理,写的很通俗易懂,以赞并fo
真是难为你了,想了这么多来解释这个复杂的东西。