社区所有版块导航
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学习  »  区块链

15 分钟参透比特币和区块链

算法爱好者 • 6 年前 • 431 次点击  

(点击上方公众号,可快速关注)


来源:  来自 ChenJunXuan 的投稿 

mp.weixin.qq.com/s/JEkjYdvRw2x3PzxKDR7FQQ


区块链就是比特币世界这个村子的账本,谁挖到矿,谁就有权在这个账本翻开新的一页,并在新的一页记下“X年X日,本村某某挖矿得到比特币一枚,并得到奖励的手续费若干”。

比特币又火了。为什么要说又呢?因为比特币在 2013 年已经火过一次了。这次与 2013 年相同的是,比特币的价格一路飙升,让人咂舌。与 2013 年不同的是,这次人们不仅仅关注比特币的价格,也开始关注比特币背后的技术——区块链

一夜之间,区块链从舞台背后站到了聚光灯下,成为了人们追捧的热点。物流、医药、版权…好像哪都可以凭借区块链脱胎换骨。那么,这么神奇的技术,到底是怎么回事?

本文就以最通俗的语言,不涉及任何高等数学和计算机知识,来介绍一下比特币和区块链系统。

说到区块链就不得不说比特币,比特币是区块链技术最好的载体,所以本文就以比特币为例来介绍区块链。

比特币很牛,牛在两个特点:去中心化、电子货币

别小瞧这两点,这两点同时存在可不是一件容易事儿。

首先来说说去中心化,通常去中心化的货币一般都要追溯到很久以前了,远古时代人们自发地使用贝壳、石子做为雏形货币进行交易,这时候的货币可以看作是去中心化的货币——无需中央银行来组织发行、确认交易合法性。

但是使用这类货币的弊端也不必我多说,货币供给不稳定,取决于每年的贝类产量;货币质量不一,有的大有的小,有的是花蛤有的是文蛤;交易很繁琐,大宗交易动不动就要好几车的贝壳,这么多货币运来运去还容易被抢劫。

于是货币进化,信用货币时代到来,货币成了银行账户里的数字,上面的问题都解决了,但是我们必须需要银行来控制货币的发行、防伪,来进行交易结算,我们的财产权全掌握在了银行的手中。银行喜欢动不动搞点QE放点水,我们银行卡里的钱越来越贬值。

这时候,我们就希望能有一种货币,既能像使用贝壳一样无需银行插手,又能符合当前信息时代对货币功能的需求。于是,集这两种特点于一身的比特币诞生了。

比特币的基本原理

做为一种货币,通常就要满足几个特点:得有人发行它,得能持有它,人与人之间可以互相交换它。

持有

持有比特币非常简单,只要有一个收款地址,就可以持有比特币并接受比特币。所持有的比特币数量只是这个地址下的一个数字。

有人会问,这不跟银行账户一样么,确实很像,但实质又很不一样。银行系统是一个中心化的系统,账户的余额是由银行说了算的,哪天银行系统出错余额变成0,那你就真的从ATM机里取不出钱。

比特币不使用这种权威的中心机构,又需要一个稳定的记账系统,所以解决办法是每一个“矿工”都把比特币世界发生过的所有交易记录存在自己的硬盘上。有了全部的交易记录,推算每个人有多少余额也就很容易了。这个被保存在所有人电脑里的交易记录,学名就是区块链。黑客可以黑掉一些人保存的区块链,但是他做不到黑掉全世界大部分人,只要有大部分仍保存着正确的区块链,那么整个系统就可以通过纠错重新恢复正常。

就像打麻将时,我们有时候用记账方式来记录每回合的应收应付,比特币世界也通过记账来交易,每发生一笔交易都会公之于众,然后大家把这笔交易记录在自己的小账本上,这样每家有多少钱,大家在自己的小账本上都能查清楚。只不过当记账由4个人变成全比特币世界的村民时,这就需要一个稍微复杂点的系统了。

发行

再来看看发行。我们先看纸币是怎么发行的,很简单,央行开动印刷机,一瞬间出现大把“毛爷爷”。而做为一种去中心化的电子货币,比特币是没有央行的,那怎么发行呢?

比特币规定,人们可以去解答一个困难的问题,谁最先答出来,谁就可以发行一块比特币,也就是我们所谓的“挖矿”。

这个困难的问题是什么呢?是哈希(hashing)的问题。哈希是一个函数F,对输入X进行一些运算来得到哈希值Y。就是咱们高中学过的Y = F(X)。比特币让你解答的问题就是,告诉你哈希值YF ,求X

这时候你会说了,这不就是个反函数的事么。抱歉,哈希函数这个函数比较特殊,找不到合适的反函数,要想求出X,唯一的方法就是一个一个数来试,把每一个数都代入到F里,看看结果是不是Y,如果恰好蒙对了,那也就把这个问题解答出来了。

所以说所谓的货币发行、挖矿,实际上就是一帮人在用最好的计算机来撞大运蒙这个数。当一名矿工蒙对X后,也就是挖到矿后,他就获得了在原有的区块链末端创造一个新的交易区块的权利,在这个新创建的交易区块上,这位矿工可以附带一个由比特币世界作为付款人,收款人是任何人交易,这样,他就通过这个交易,创造并发行了一枚比特币。

区块链就是由一串交易区块组成的。我们来看看交易区块上包含什么。

一个交易区块会显示谁是它的父区块,包含本区块上的交易记录,以及本区块的哈希值。

 

这样,随着矿工们不断挖矿创建新的交易区块,一个接一个的区块就串成了一串,成为了名副其实的区块链!在比特币世界中,由于某些原因,区块链会发生分叉(为什么会分叉下文会提到),因而比特币世界规定:唯一合法的区块链是当前最长的区块链。

区块链就是比特币世界这个村子的账本,谁挖到矿,谁就有权在这个账本翻开新的一页,并在新的一页记下“X年X日,本村某某挖矿得到比特币一枚,并得到奖励的手续费若干”。这个账本很特殊,并不是由村支书管理,而是所有的村民人手一本,谁挖到矿以后,都可以自己翻页记账,并让全村人按照同样的方式做,以保证全村所有人的账本一致。当全村人的账本出现不一致时,规定谁家的账本最长就听谁的。

发行

比特币的关键点在于交易。对于一个去中心化的电子货币系统,交易是很有风险的。想象一下,你和另一个人的电子货币交易就类似于打欠条,而且这个欠条没有第三方公证人。如果其中一方突然翻脸,欠条的有效性是很难保障的。

由于不能使用类似银行结算中心的第三方公证人(使用了就是中心化系统了),所以比特币干脆就让全世界人做为公证人。

所有比特币的交易都不能偷偷摸摸进行,都需要将这笔交易通过互联网广播到全世界。如果C想给B 0.5个比特币,会向全世界广播“C给了B 0.5个比特币!”,这时所有挖矿的矿工们,会把这条交易记录加到他们正在挖的这个交易区块中。

他们为什么要加呢?因为当矿工挖出矿时,除了规定奖励的一枚比特币外,每加多一条交易记录,还会额外再多给一点点手续费。蚊子肉也是肉,辛勤的矿工们没有不喜欢的。

在把交易记录加到区块的过程中,矿工们首先会验证一下这笔交易合不合法,也就是查查村里的账本,当C名下货币不足0.5个时,这条交易记录就会被拒绝加入到区块中。

加入到区块中并不代表交易已经成功,只有当包含这个交易记录的区块的随机数X被某位矿工发现,并创造了新的交易区块链接在当前区块后,才能被认为是合法交易,这条交易记录也就成为被验证的交易。

B可能会问了,那也就是说C发了给我钱的广播后,我还不能马上确定我是不是收到钱了啊?

没错,C发广播,只相当于C站在村口朝全村人喊了一句 “我给B 五毛钱!”,只有当全村的人都听见,把这件事都记在了个自账本上,并且记下这件事的那页被矿工翻过去以后,B的户头上多了五毛钱这件事才真正得到了全村村民的认可。由于参与比特币挖矿的矿工众多,通常每笔交易所需的验证时间是非常短的,不会给交易带来延迟感。

由此比特币的发行和交易首尾相连扣在了一起。交易通过发布广播的形式进行,矿工们听到广播后把交易写在交易区块中;矿工们通过挖矿来确认历史交易的完成,并由此创建新的区块,延长区块链,发行新的比特币。

区块链的分叉

之前提到了区块链的分叉。为什么区块链会发生分叉呢?原因就在于去中心化

没有中心,大家都各自维护账本,因此受困于网络的延时、交流的不充分,难免有出现分歧的时候。

举两个例子,一个是在挖矿时容易出现的问题:矿工B蒙对了随机数,挖矿成功,延长了区块链,注意,此时矿工B延长的区块链仅仅是自己的,其他人还都不知道这件事。当然,矿工B马上向全世界发布挖矿成功的消息,让大家按照他的方式延长区块链。

但是这时,另一位矿工C也蒙对了随机数,他或者因为网速延迟还没听到B的广播,或者听到广播但不甘心,存心想破坏规则,于是他也把自己的区块链延长了,并开始向全世界发广播。

因为网速的延迟,并不是所有人都先听到B的广播,此时就会出现一部分人按照B的指示更新区块链,一部分人按照C的指示更新区块链,而且因为网速的延迟,大家没办法确定到底是B还是C先发布的广播,从而引起区块链分叉。

就好比村里两位矿工B和C分别住在村东和村西,B和C差不多在同一时间挖矿成功,把自家账本翻页,在新的一页写下属于自己的宣言“X年X月,本村B(C)挖矿得到比特币一枚”,并开始向全村大喊让全村人翻页并写下这句话。由于他们分别住在村子的两头,结果村东头的人先听到B大喊于是按找B的话记账,村西头的人先听到C大喊于是按照C的话记账,导致全村的账本此时出现了两个版本。

第二种情况是双重交易,B与C进行交易,发布广播宣布付给C一枚比特币,但是B同时还跟D勾搭,几乎同时又发布广播宣布付给D一枚比特币,更糟糕的是,B宣布付出的是同一枚。

跟第一种情况一样,由于网速问题,一部分矿工先听到B与C交易的广播,并将这条交易记录计入到当前交易区块中,后听到B与D的交易,并判定不合法,拒不添加到交易区块。而另一部分矿工正相反,只把B与D的交易添加到交易区块中。

这两种情况并不是罕见的,由于比特币世界由全世界各地的人参与,有的地区用的是100M光宽带,有的地方用的是56K拨号上网,网速千差万别,而且又有很多人心怀不轨,存心作恶,因此区块链分叉几乎时时刻刻都在发生。此时,比特币世界的最高原则就起作用了:唯一合法的区块链是当前最长的区块链。

可是就上面两种分叉的情况来看,此时分叉的两个区块链一样长啊?没关系,这两条都合法,也都不合法,咱们搁置争议,继续开挖,看谁挖得快,谁先再蒙对新的X,让自己的区块链再进一步,谁的区块链就变成最长,也就成了唯一合法的了。这么一听,怎么感觉这个区块链系统这么随意,有些不靠谱的样子啊,如果大家都不守规则,随意分叉,世界岂不乱套。

别急,接下来咱们通过分析会发现,最终区块链肯定会恢复成稳定的一条。

让我们回到第一个情况矿工B和矿工C分歧问题中,假设B的链条再进一步,成为了最长链条,这条链条也就成为比特币世界认定的合法链条。此时C有两个选择,一是放弃努力,乖乖的扔掉自己的区块链,使用B的。另一种选择是不甘心失败,扔坚持自己的区块链,希望自己能很快继续追平B并反超。

选择前者是大家都开心的,比特币世界的区块链从此统一,选择后者实际上继续让区块链保持分叉状态。那么从理性角度,C应该如何做呢?实际上C此时应该果断放弃自己的链条。

我们可以分析一下,当B和C的链条分叉时,此时比特币世界存在4种矿工、两种势力,B和拥护B的吃瓜矿工,C和拥护C的吃瓜矿工。此时B势力与C势力大体相当,所以大家各挖各的。

当B势力先一步延长了B的链条后,此时C势力就会发生分化,绝大部分拥护C的吃瓜群众只要听到B链条延长的消息,马上会转投到B链条上,因为此时B链条更长,在更长的链条上继续挖矿显然更有前途。势力马上发生逆转,C会尴尬地发现,全世界都在与他为敌(哭)。所以C不得不放弃。

当然,假设是C的势力先延长了区块链,那么情形正好相反,全世界的矿工都会马上投入C的怀抱。尽管可能确实是B先挖到的矿,但此时B也不得不选择放弃自己的那条已经无人问津的区块链。按照这种理性的假设,全世界大部分矿工都会安分守己的选择在最长的链条上工作,所以偶尔的分叉也不是什么大不了的事。

当然仍存在一种极端情况,即B或C一个人的算力超过全世界算力的50%,这时候他们凭借一己之力就有可能反超。但是事实上,由于全世界都在参与,很难有人或组织有这么强的算力,其次即使C有这么强的算力,他老老实实地在最长链条上挖矿就好了,也没必要硬刚全世界,非要显示霸权只会让全世界都不陪他玩了,最后比特币失去价值,C损失更大。

上面所说的第二种分叉情况的解决办法与第一种情况同理,坚持“唯一合法的区块链是当前最长的区块链”原则不动摇,最终合法的一条区块链只会记录B与C交易或B与D交易的其中一个,具体原因读者可以自己想一想。

讲了这么多,大家可以发现,比特币凭借区块链的巧妙设计,使得交易与发行以一种非常稳定的状态进行,而保持稳定的核心力量是什么呢?就是无数矿工提供的算力。

只要矿工够多,算力够大,验证速度够快,比特币的交易就可以快速地被验证,不小心出现的区块链分叉状态可以很快结束,保证整个系统稳定运行。所以挖矿可不光只是费电,这些电能实际上转化成为维持整个系统稳定的能量!

这也告诉我们为什么比特币可以一个币价值数万,而有些新发行的各种币一文不值,因为比特币做为历史最长、受众最广的电子货币,也拥有数量最多、分布最广泛的矿工和算力,是最稳定的电子货币。

而新发行的货币矿工数量很少,参与的算力低,根本起不到稳定整个系统的作用,算力低也意味着每笔交易的验证时间会变长,从而降低货币的可用性,所以这样的新兴货币一文不值。

好了,关于比特币以及比特币系统所用到的区块链技术就介绍到这里,如有大牛对文中内容有异议,欢迎拍砖探讨!

参考文献:

Satoshi《Bitcoin: A Peer-to-Peer Electronic Cash System》

关于作者:

ChenJunXuan / CC,17 年硕士毕业于上海交大,目前在阿里达摩院做计算机视觉方向/智能医学影像相关的算法开发,喜欢 Python。


觉得本文有帮助?请分享给更多人

关注「算法爱好者」,修炼编程内功


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