首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

区块演义(三):矿工-区块链的证人

上一篇区块演义讲到,单向函数可以防止区块链的内容被篡改。区块链静态防伪的问题到此就被解决了。但是,如何让网络上的所有用户主动地去承认唯一一条区块链呢?区块链随着它支持的应用的运营而变长,我们又如何保证它不分叉呢,即链条的每一环增长都被所有用户主动去承认呢?在本怪咖的文章中,上述这几个问题概括为一个:即区块链的动态防伪问题。

不错,相信大家也猜到问题的答案,区块链要解决动态防伪问题,靠的是“挖矿”。所谓的挖矿其实是引入一种证明机制,在区块链不断变长的动态过程中确保大家不断对新增区块形成共识。

那这个问题原理上怎么去解决呢?在比特币的区块链中,设计了一种工作量证明机制,英文缩写为POW。此外,其他应用采用另一种叫权益证明的机制,缩写为POW。

先介绍POW。上一篇文章提到,我们做静态防伪时,只需要计算每一个block的hash就可以了。那么问题来了:1.如果制作block的人不诚实,把收集到block中的信息篡改,然后迅速求出hash值呢?怎么防范这种情况?2.如果有黑客或者是搞事的人,虚拟很多制作block的用户(即马甲),然后让这些一大堆的“用户”都承认它的虚假block呢?在比特币中,这是严重的问题:因为如果这些制作block的人能在链形成的过程中修改block的内容,意味着可以修改比特币持有者们的比特币金额了!同理,其他应用也一样要避免上述情况。为此,区块链引入了工作量证明机制:每生成一个区块链,须要完成一定数量的运算才行。对于第一个问题,由于链是不断增长的,要写入block的信息一旦被诚实的block制作人经过一定数量的运算,计算出hash值并写入下一个区块中,不老实的人需要篡改已经在链中的区块,则需要付出大量的运算能力才行。对于第二个问题,这样一来,那些通过改IP或者其他手段虚拟出小号马甲就没辙了,除非它拥有巨大的运算能力,而拥有巨大的运算能力,唯一的方法是拥有数量和性能巨大的硬件设施。

具体的机制是怎么样呢?大家还记得上一篇文章讲到的NONCE和HASH值吗?这里就是关键,关乎到block的制作人需要付出多大的运算能力才能制作出链条,而这个付出计算能力的过程,叫“挖矿”。

当把所有要装入block的信息装入后,block中留下一个位置用来装NONCE值,block制作人(其实就是矿工,下称矿工),需要选择一个适合的NONCE值,使得整个block的hash值小于某个数。

回忆前篇文章的单向函数的概念:

“给定任意两个集合X和Y。 函数f:X Y 称为单向的,如果对每一个x属于X,很容易计算出函数f(x)的值,而对大多数y属于Y, 要确定满足y=f(x)的x是计算上困难的(假设至少有这样一个x存在)。”

单向函数除了有牵一发动全身之外,还有一个重要的性质就是根据函数值而推出自变量,是非常困难的,困难到只能用穷举法(一个一个输入地尝试)找出函数值对应的自变量。如果要让block的hash值小于某一个数,那么在找nonce的时候只能一个一个nonce地尝试,例如nonce是10进制的4位数,那么就有0000-9999共一万个组合,要找出小于某个数值的整个block的hash值,一般就只能够0000-9999逐个尝试。最好的结果是运气大好一下就选到适合的nonce值,但是最坏的情况是尝试到最后一个才有适合的nonce值。但是一般来说,应该平均尝试次数是5000次。那在这个过程中,矿工就进行了这种逐次尝试中付出了运算能力。对于矿工,算出nonce值的好处是,它获得比特币,也就是我们通常说挖到了矿。可以预见,在计算能力分布较为均衡的时候,谁能最先算得适合的nonce,基本上是随机问题,也就是说,没有常胜将军(不然矿都被某些人挖完了)。

当一个矿工计算出适合的nonce值后,它就会向整个网络公布它的结果。其他矿工收到后会停下来验证:1,计算hash是不是合法。2,hash值是不是小于某个数。验证成功后,毫不犹豫地他们会放下自己当前的运算,立刻投入下一个区块的nonce值求解当中,因为他们也希望只要自己先行一步,命运之神就更可能眷顾他们,让他们在下一个区块中解出nonce值。

到此为止,工作量证明的机制原理已经讲完了。喜欢文章的朋友欢迎转载和加关注哦。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180207G1CSA000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券