社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  区块链

比特币的黑科技区块链(Blockchain)到底是个什么鬼?

青蛙要fly • 7 年前 • 657 次点击  




如果你没有居住在山洞里面的话,我猜你大概已经听说过比特币Blockchain了。毕竟,炒比特币也算是潮流了,也是媒体比较喜欢的话题之一,在小编写稿时,比特币今日价格已经是人民币17500元/枚了(OMG)。即使是从未想到过密码币或者了解过它的运作原理的人也会谈论到比特币。那么今天我就用大白话来解释一下blockchain到底是个什么鬼。


Blockchain:为什么我们需要这个复杂的东西?


“对于每个复杂的问题,都有一个明确,简单和错误的答案。” - HL Mencken


不像网上的其他文章,我不是给Blockchain下一个定义,本文将会解释Blockchain解决了什么问题。


想象一下,Joe是你的好朋友。他正在巴厘岛和女朋友玩耍(留下孤单寂寞的你),他旅行到一半,打电话给你秀恩爱磨磨唧唧半天,然后重点来了--“我 Joe 打钱 ”。虽然此刻的你手中仿佛握着30米的大刀,你还是回答他“马上给你打”。



然后你查询了一下你的账户余额看有没有10000块,由于你非常有钱。你的账户余额有数不清的零,所以你就让你的美女秘书去取一万块打给Joe。你的交易就像下图:


注意: 我们不是在讨论电脑,只为了让事情更简单。


然后你可以给Joe打电话告诉他你已经汇款了。接下来他要做的事情就是去银行把你打的10000块取出来。



刚刚发生了什么?你和Joe都相信银行管理你们的钱。这里没有涉及到任何实际的金钱交易。所需要的只是登记册中的一个条目。或者更准确地说,登记册中的一个条目,既不是你也不是Joe控制或拥有。


这就是目前系统的问题。


要建立我们之间的信任,我们需要依靠第三方。


多年来,我们依靠这些银行和其他第三方来相互信任。你可能会问:“信任第三方有什么问题吗?”


问题就是,银行的数量有限,事实上,是太少了。如果真的黑客想对银行发起攻击,引起社会的混乱,他们只需要让一个人,或者一个组织腐败就好了。已经有很多关于存在银行的钱不翼而飞这样的新闻了。


  • 如果记录交易的注册表被烧毁,该怎么办?
  • 如果你的秘书错误地写了15000而不是10000呢?
  • 如果你的秘书有其他目的呢?


多年来,我们一直把所有的鸡蛋放在一个篮子里,也是把它们放在别人的地方。


那么有没有一个系统,我们 不需要银行就可以转账?

为了回答这个问题,我们需要进一步深入研究,并且问我们一个更好的问题(毕竟更好的问题才能引出更好的回答)。
试想一下,转账意味着什么?就是登记表中的一条记录而已。更好的问题是--
有没有能让我们自己维护登记册,而不是别人为我们做的方法呢?
现在,这是值得探讨的问题。答案是你可能已经猜到的。Blockchain就是是这个问题的答案。
这是一种让我们自己维护这个登记册的方法,而不是依靠别人为我们做这件事。
如果你有看到这里的话, 应该就已经理解区块链的用途了。它就是为了帮助我们自己更好的保护并保管交易信息的,排除了第三者的干扰和不确定性。

好了,现在告诉我Blockchain是怎么运作的?


这个方法实施的条件是必须有足够多的人不想依赖于第三方进行转账的操作。这样这个群体的人才能自己维护登记表。

“It might make sense just to get some Bitcoin in case it catches on. If enough people think the same way, that becomes a self-fulfilling prophecy.” — Satoshi Nakamoto in 2009

有多少人才够呢? 至少三个。打个比方,我们假设10个人不想再依靠银行或者任何第三方来进行交易了。基于一个多方协议,他们24小时互相拥有其他9个人的账户的进出信息(以数字密钥的形式),但并不包含账户主体的隐私细节,例如流水金额,姓名或者密码等。
 

1.始于一个空文件夹


一开始每个人都有一个空的文件夹。当我们开始交易时,这10个个人账户会持续向这个空文件夹中增加页面。然后这个页面集合将形成跟踪交易的寄存器。

2.当一笔交易发生时


当交易发生的时候,事先达成一致的10个人,都会在自己文件夹上进行记录。


例如,#2想转帐100元给#9,那么#2也需要告诉其余8个人,“我准备向9转账100元,请大家在自己的文件上记录一下,谢谢啦”



于是,其余8个人回去检查#2的账户余额里是否有足够的钱可以转给#9,如果有,交易会被执行,所有人也会在自己的文件上记录着交易的信息。


慢慢的,这10个人中有更多人需要进行交易。而当他们每个人进行交易时,都会告诉其余的9个人,而这些交易信息都会记录在每个人的页面上。这时会出现文件夹中当前页写满的情况,这是我们需要重新翻一页,继续记录新的交易信息。


3.交易持续增长


随着时间的增加,在这个网络下的人都会有更多的交易需求。当他们想要做一个交易的时候,他们会告诉其余的人,其余的人听到之后就会在他的页面上做一个记录。


这个步骤将会一直进行,直到每个人都用尽了当前页中的空白处。


这个时候就需要将这个页面封存好放在文件夹中,然后翻到新的一页,再从步骤2 开始做起。


4.翻到新的一页之前


每当我们再翻到新的一页时,要使用之前大家达成一致的密钥,对写满的这一页信息进行封装保护(专业说法是"mining")。封装之后,也就再也没有人可以对之前的信息进行修改了。我们自己保护着自己的交易记录和安全。



那么有趣的事情来了,我们怎么密封这些页面呢?


在我们学习怎么密封页面之前,我们应该了解密封的原理。作为一个先决条件,你应该了解这些。。。。


魔法机器


想象一下我们把事先记录好的交易信息发送到这个机器(专业说法是Hash Function),然后它会吐出一堆没人看的懂得的字符。


假设我们将数字“4”发送到这个机器,你会发现,他翻译出了“dcbea”。



那么这个机器是如何将“4”翻译成了这个字符串的呢?没有人知道。更重要的是,这是一个不可逆转的过程。你再往机器回输“dcbea”,它不会再翻译出“4”。但是你每次输入4,都会翻译出同一个字符串。



让我们来尝试一个其他数字,'26'.


这次输出了'94c8e'!所以这个字符串还可以包含数字。


现在我问你一个问题:如果我想得到以三个0开头的字符,我应该在左边输入什么呢?比如000ab,00098,000fa。


你已经知道了这个机器对于既定好的输出不能倒推出正确的输入是什么。那么摆在你面前的选择就只有。。。。将宇宙中的数字都来尝试一下。嗯,听起来很简单对不对,运气好的话,几万次尝试之后你就可以得出答案了。。。。。。。。


当当当,终于算出来了


计算输出的输入是非常困难的。但同时,如果预测的输入能够产生所需的输出,则总是非常容易地验证。请记住,机器每次都会吐出同一个字数。


如果我给你一个号码,比如说72533,并问你一个问题,“这个号码,放进给机器时,会产生一个从三个前导零点开始的单词吗?


所有你需要做的是,把数字放入机器上,看看输出的是什么而已。


这种机器最重要的特性是 - “给定一个输出,计算输入是非常困难的,但是给出输入和输出,很容易验证输入是否输出。



那么这个机器是如何密封一个页面的呢?


我们将使用这个魔术机器为我们的页面创建一个印章。我们将从虚构的情况开始。


像之前描述的那样,我们还会有一个原数字信息,例如“20893”,你可以把它放在一个盒子里。假设,我们在右边得到编译为“000”开头的字符。与此同时,左侧多了一个封装盒,现在你可以说出,怎样的封装字符,才可以得到“000...”吗?


你只能通过尝试所有的字符组合,运气好的话,几万次后,你终于得到了正确的字符,假设它是“21191”,那么我们有了结论:(封装“21191”+原信息“20893”=42084)送入机器后会得到符合条件的字符。



在这个问题中,这个数字21191就成了数字20893的封装码(专业说法是proof of work)。假设一个页面上写着一个数字20893.为了封装这个页面(没有人能改变里面的内容了),我们将在页面的头部放一个标记着"21191"的徽章。一旦封装数字被戳在了页面上,这个页面就被封装了。



如果任何人想要验证页面是否被更改,那么他所要做的就是 - 使用密封码添加页面的内容并将其提供给魔法机器。如果机器发出三个前导零的单词,说明内容不变。如果出来的单词不符合我们的要求,我们可以丢弃页面,因为它的内容被泄露,没有任何用处。


我们将使用类似的密封机制来密封我们所有的页面,并最终将它们安排在我们各自的文件夹中。


最后,密封我们的页面


要封装包含网络交易的页面,我们需要找出一个数字,当附加到事务列表并发送到机器时,我们得到一个从右边的三个前导零开始的单词。



注意:“以三个零开头的单词”只是我的一个举例,用于阐述Hash Function是如何运作的。事实上,真正的情况比这个复杂多了。


一旦在机器计算出该数字,该页面将被密封。如果有人尝试更改页面的内容,密封码将允许任何人验证页面的完整性。


回到最初我们网络中的10个达成一致的用户,因为每个人都记录了所有人的交易信息,所以他们应该是同时用完了一页的。与此同时,所有人会同时开始计算封装码,因为所记录的信息是一致的,所得到的封装码也应该是一样,当有人率先计算出了封装码,他就会分享给网络中的其他人。




如果这个封装码不适用于某个人的记录的信息,比如#7用这个密封码不能得出正确的输出,那网络中这个人可能是记录了错的信息,或是,他对源数据做了手脚。


这时,出错的这个人,如果现继续与这个世界做交易,只能用大家都一致适用认可的那个封装码,把自己记录错误或作弊的信息修改成正确的。否则,他将被系统剔除。试想当全世界都使用这种交易方式的时候,系统的剔除等于剥夺了一个人使用金钱的能力。


多数人同意的密封码将会成为成为可靠的密封码


你可能就会问:如果计算出的封装码会分享给网络中的所有人(10个),那么为什么每个人要浪费时间精力去算呢?


这是一个好问题。人类的智慧是无穷的,于是在这里就引入了一个新的奖励机制——比特币。在Blockingchain的应用中,每当用户做出贡献,完成计算封装码等任务,就会获得一些奖励。假设,#5用户第一个计算出了正确的封装码并分享给了大家,他就获得1个比特币的奖赏,而这个货币,也不会减少网络中其他人的存款。


这就是比特币的存在。这是在Blockchain(即分布式寄存器)上处理的第一种货币。而作为回报,为了保持网络上的努力,人们获得了比特币。


当足够的人拥有比特币时,他们的价值将会增长,使其他人想要比特币; 使比特币进一步增长; 使更多的人想要比特币; 使他们进一步增长价值; 等等。


回报让每个人都想在网络中做出贡献


当每个人都将已经写满的页面放进文件夹中后,他们再拿出一个新的空白页,然后重复整个步骤。


将单个页面看作一个事务块,将该文件夹视为页面链(块),因此将其转换为Blockchain。


这就是Blockchain工作的原理了

                                              。。。。。


除了有一件小事我还没有告诉你。


想象一下文件夹中已经有五个页面了,全部都用密封码密封过了。如果我回到第二页并修改一个交易来为自己搞点好处呢?密封码会让任何人检测到交易中的不一致,对吧?如果我继续为修改的交易计算一个新的密码,又用该标签来标记页面呢?


为了防止某人回头再修改一个页面(块)以及密封编号,对于密封编号的计算方式有一点扭转。


保护对密封编码的修改


事实上,区块链需要三个条件,才可以计算出编译码:


“源信息”+“当前页封装码”+“上一页的封装码”



有了这个小技巧,我们可以确保每个页面都依赖于前一个页面。因此,如果有谁修改了历史页面的话,他也会修改整个内容和之后的所有密封码。


如果你想作弊,你就需要修改过去所有记录的封装码和编译码,在区块链中会显示你独自计算了一个奇怪的分支。而一个人计算的速度,永远也赶不上网络中其余9个人一起计算的速度。所以那些非常短的分支,一定是一个作弊的链条。




6个人开始作弊作假怎么办?


一个人的计算速度是没有办法赶上9个人的计算速度,那么问题来了,如果网络中6个人商量好一起作弊怎么办?它被称为“51% Attack”。


如果这样的事情真的发生,那么区块链就无法正常运转了。这时区块链唯一的弱点,它是建立在:假设社会上的绝大部分人是诚实可信的。我们在了解某个科技的优势后,也应该搞清楚它的条件和弱点。






那么到这儿,关于Blockchain的所有东西我都介绍完了,相信你看到这儿也一定明白了,是不是很爽!!!!


via  hackernoon.com



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/cOddQPZnF0
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/8579
 
657 次点击