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

白话“区块链技术”之延伸阅读——比特币与挖矿

区块链系统可视为一个精心设计的加密账本。这个账本产生一个记录帐目的块(Block),就与上一个块记录链接起来,这就构成了区块链。区块链的账本是分布式的,所有人都可以作为记账机构来记录交易,最后大家竞争,谁的账本记录的最好,谁就成为大家公认的Block,并广泛认可,然后其他人放弃自己的计算结果,接受并记录这个Block(各节点均按此同步),并进入下一次记账竞争。【这个“好”只是通俗的解释,详情可百度】

由于必须保证区块链中各节点之间的同步,因此新区块的添加速度不能太快。试想一下,你刚刚同步了一个区块,准备基于它生成下一个区块,但这时别的节点又有新区块生成,你不得不放弃做了一半的计算,再次去同步。因为每个区块的后面,只能跟着一个区块,你永远只能在最新区块的后面,生成下一个区块。所以,你别无选择,一听到信号,就必须立刻同步。

所以,比特币的发明者中本聪(这是假名,真实身份至今未知),故意让添加新区块变得很困难。他的设计是,平均每10分钟,全网才能生成一个新区块,一小时也就六个。生成新区块的速度不是通过命令达成的,而是故意设置了复杂的HASH函数,也就是说,只有通过海量计算才能求得当前区块的有效哈希值,从而把新区块添加到区块链。谁算的又快又好,就会成为竞争胜利者。

当有节点宣称成功生成新区块时,其他计算机节点会读取该区块(副本),开始校验其有效性,校验成功后,会停止自己的挖矿进程,并将该区块(副本)追加到自己区块链的末尾。作为对竞争胜利者的奖励,系统会分配给其一定数量的比特币,而这个参与竞争的过程就是我们所说的挖矿(mining)。这名字很形象,因为计算有效哈希值的难度,好比沙里淘金。计算哈希的机器就叫做矿机,操作矿机的人就叫做矿工。

中本聪设定的比特币的总数是2100万个,随着时间增加,挖矿难度越来越大,而得到的比特币数量却越来越少。按照比特币产出的运算公式,几乎每4年产出就会减半,最终达到极值2100万个。比特币游戏自诞生以来,矿工们每次分享的奖励从50枚比特币变为今天的12.5枚。

挖矿的过程,本质上是通过网络进行数学运算的过程,需要耗费大量的计算资源,高配的比特币挖矿机多采用针对挖矿算法进行优化的“GPU+FPGA”阵列的定制硬件方式工作,计算能力强、耗电量较大。当然,也可以将自己的挖矿机通过网络加入别人的计算集群,针对分配给自己的数据集运行特定算法,合作完成计算任务。提供服务的矿工可按完成的任务所占比例从产出的比特币中分享一定数量作为奖励。

补充:为什么随着时间的增加,挖矿难度越来越大?

人们都说采矿很难,可是采矿不就是用计算机算出一个哈希吗,这正是计算机的强项啊,怎么会变得很难,迟迟算不出来呢?原来不是任意一个哈希都可以,只有满足条件的哈希才会被区块链接受。这个条件特别苛刻,使得绝大部分哈希都不满足要求,必须重算。

原来,区块头包含一个难度系数(difficulty),这个值决定了计算哈希的难度。举例来说,第100000个区块的难度系数是14484.16236122。区块链协议规定,使用一个常量除以难度系数,可以得到目标值(target)。只有小于目标值的哈希才是有效的,否则哈希无效,必须重算。显然,难度系数越大,目标值就越小,哈希小于该值的机会就更渺茫,可能计算10亿次,才算中一次。这就是采矿如此之慢的根本原因。

前面说过,当前区块的哈希由区块头唯一决定。如果要对同一个区块反复计算哈希,就意味着,区块头必须不停地变化,否则不可能算出不一样的哈希。区块头里面所有的特征值都是固定的,为了让区块头产生变化,中本聪故意增加了一个随机项,叫做Nonce。矿工的作用其实就是猜出Nonce的值,使得区块头的哈希可以小于目标值,从而能够写入区块链。Nonce非常难猜,目前只能通过穷举法一个个试错。根据协议,Nonce是一个32位的二进制值,即最大值可以达到几十亿(2^32)。可以理解成,矿工从开始穷举,运气好的话,也许一会儿就找到了Nonce;运气不好的话,可能算完了2^32次,都没有发现合适的Nonce使得算出的哈希能够满足条件。这时,协议允许矿工改变区块体,开始新的计算。

工作量证明PoW(Proof of Work)

上述过程需要耗费大量的时间和算力,大家常见的术语PoW其实就体现在上述过程中。工作量证明系统主要特征是客户端需要做一定难度的工作得出一个结果,验证方却很容易通过结果来检查出客户端是不是做了相应的工作。这种方案的一个核心特征是不对称性:工作对于请求方是困难的,对于验证方则是易于验证的。

再举个例子,给定一个基本的字符串"Hello, world!",我们给出的工作量要求是,在这个字符串后面添加一个叫做nonce的整数值,对变更后(添加nonce)的字符串进行SHA256哈希运算,如果得到的哈希结果(以16进制的形式表示)是以"0000"开头的,则验证通过。为了达到这个工作量证明的目标,我们需要不停的递增nonce值,对得到的新字符串进行SHA256哈希运算。按照这个规则,我们需要经过4251次计算才能找到恰好前4位为的哈希散列。而验证方只需要按照客户端提供的数据,重算一次HASH值即可验证真假。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券