什么是“挖矿”?比特币“挖矿”原理解析

通告:

本专栏系列原创文章同步发布在【简亿区块链@简书】,微信公众号【简亿区块链】以及【开发者头条独家号:简亿区块链】上。

1.什么是“挖矿”?

我们在系列文章中的《 比特币的“区块”中藏有什么秘密:区块链区块结构解析》介绍了什么是“区块链”以及“区块”的底层数据结构解析;

本文主要围绕着网络常用切口“挖矿”来介绍 下“挖矿”的本质和底层原理;

接前言,强调下“区块链”的三个核心特定:

1)凡是被各节点认证过的历史生成区块,是绝不会被篡改的;因为区块链的只有append(追加)操作,没有随机update(随机写)的操作。

2)新生成的区块,只能链接“挂载”在当前链条的末端‘;

这也就意味着:每个节点在开始运行(或者是运行中)创建新区快这项工作的时候,凡是有新区块被确认增加到了区块链上,那么,当前节点就需要停止手头正在进行的“创建”新区块的工作,转而需要先将最新的区块链数据同步到本地,再继续重新开始试图“创建”新区块。

3)新区块的创建,是一个极其困难复杂的工作;是一个需要符合特定计算规则,计算结果需要满足特别目标值(这个值很难满足)时,新区快才算初步创建成功;

“挖矿”的几个特点

如果非要一句话简单概括的话:在最新区块链的数据上,生成一个符合条件的区块,链入区块链的过程,就是挖矿。

“挖矿”具有以下几个特点:

1)“挖矿”的过程 就是运行特定的计算公式,试图计算出符合特定规则的Hash值的一个过程;

2)“挖矿”的本质是:生成最新区块,挂在到区块链的末端;其本质也可以理解为:争夺账本的记账权。

3)“挖矿”为什么叫做“挖矿”,因为“生成新区快”这个操作成功,会获得大量的奖励;

4)有“挖矿”,自然有“矿工”,矿工指的是:所有运行(以比特币为例)比特币客户端,链接比特币网络的终端节点,比如CPU,GPU,矿机,矿池组等等

5)为什么大家对“挖矿”趋之若鹜?

因为能获得超出成本的大量的奖励;奖励包含两部分:

第一部分是:创建新区块成功,系统奖赏当前矿工的“奖励金”(又叫coinBase交易金),这部分占主要比例;

第二部分是:所生成的新区块里打包的所有交易的交易佣金(交易费用),这部分占一小部分;

6)接第五点,比特币系统为何要奖励矿工“coinBase交易金”?

对维持“系统”网络稳定,对确认比特币交易,对参与比特币认证的节点的奖励;因为挖矿同时还保护着比特币系统的安全,防止欺诈交易,避免“双重支付”;这一点很重要!

PS:

中本聪在设计中规定:

1)新区块的产生速度是大约每10分钟一个(这里面用的大约,不是精确的十分钟),每一个新区块的产生都会伴随着一定数量的新币发行。每开采210,000个新区块(中本聪规定的&大约耗时4年),新币发行速率降低50%,初始奖励每区块50BTC,每隔4年奖励减半,目前奖励为12.5BTC。

2)十分钟是一个均值,生产速率每产生2016个新区块系统会自动调节一次,调节途径通过调整diffculty参数;

---转译自《BitCoin Wiki # Mining》

2.比特币“挖矿”的平均时间为何规定成“10分钟”?

接上,为什么要规定每十分钟挖出一个矿呢?有什么具体的考量吗?

首先说明:10 分钟是系统找到一个有效的交易链块所需要的平均时间(这个时间不是固定的);

基于运气这个时间实际上会稍长或稍短,比如突然间网络中,算力急速增加,那么生成新区块的时间就会变短;这个平均时长"力图逼近10分钟",出块速度会在系统每生成2016个块之后自动调整的,通过调整难度系数difficulty(前序文章中有讲过)

大致参考源代码:

static const int64 nTargetTimespan = 14 * 24 * 60 * 60;//目标时间窗口长度:两周

static const int64 nTargetSpacing = 10 * 60;// block频率,每10分钟一块

static const int64 nInterval = nTargetTimespan / nTargetSpacing;// 每两周的产量2016,也是调节周期

10分钟--->1分钟会如何?

1)间隔太短,易导致较多孤块的出现,不安全,不利于交易确认,还浪费资源;

原因是:每一个“矿工”都需要时刻确认自己是否在主链上,那么就需要矿工之间时刻交流,交流受网速影响(在网络情况不良时,间隔时间越短,这个网络不良的影响对最终的结果影响越大),当有“矿工”生成新的区块,发现它们不在主链上,也就是孤块,只能丢弃,造成浪费。

2)如果出块间隔太短,侧面的也就说明,出块的难度太低;

当出块的频率变高的时候,块与块之间的碰撞频率也就变高,碰撞次数越高,主链被fork(分叉)的概率就越大,fork越多,链结构就会变成树结构。而且每当出现分叉的时候,系统需要花费性能去选出bestChain(bestChain被当做Main链,被各节点认可);

PS:fork即为分叉,分叉分为软分叉和硬分叉,关于分叉和bestChain的选择相关知识点会在本系列的其他文章中讲述。

3.“挖矿”的底层原理是什么?

通俗地讲,“挖矿”即生成新区块的本质是:做一系列的哈希运算,当运算得到的哈希值符合目标规则,即为挖矿成功(其实,就是寻找符合条件的Nonce参数的过程,下文会详细解释,此处记住这个概念即可)。

也就是比较俩数值的大小,target目标值(固定)与哈希计算值(矿工每次计算算出来的值),这两个值的计算公式是什么呢?

如下图,为区块头(header)结构,结合着图示,介绍下挖矿的原理。

这里直介绍两个关键信息:

1)难度系数:difficulty参数,顾名思义用来调节生成区块的难度的。该值决定了target的大小,

公式为:target=2**(256-Difficulty)

中本聪希望生成每个区块需要耗时10分钟,但是实际情况往往多变,生成区块(算出target)的时间有可能远小于十分钟(difficulty偏下)或者远大于十分钟(difficulty偏大);

那么在每2016【2016=14(day)*24(hour)*60(min)/10(min)】个区块生成完毕之后,系统要自动调节difficulty参数大小;

调整公式为:

New Difficulty= Old Difficulty*(最新的2016区块实际耗时/ 20160 minutes).即:最新2016个区块花费时长与20160分钟(20160分钟是2016个区块期望的产出时间)比较所得。

2)随机数:Nonce参数,也可以理解为POW工作量证明的计数器;

该字段是最重要的一个字段,因为其实“挖矿”的过程就是寻找符合条件的Nonce值的过程;我们知道“挖矿”是做一些列的哈希计算的过程,该过程为:对区块头和nonce进行哈希运算【sha256(str(header)+str(nonce))】;如果本次所得的哈希值

PS:

1)Nonce叫“随机数”的原因是因为原则上每次计算当前Nonce值可以随机产生。但是,实际情况下:什么方式最容易计算出目标值呢?穷举法;所以每次计算Nonce从0开始;

2)为什么说“挖矿”这么难呢?

target值符合特定的规则:十六进制的以连续0开头,且连续的0越多越能符合命中规则;

假如当前target值为连续20个0开头的十六进制数字;

举个例子:

好比一个不透明的口袋里有俩形状一模一样的乒乓球,一个红色球,一个蓝色球;每次抓阄抓到蓝色则标记位0,红色标记位1,那么如果矿工想要“挖矿”成功,就意味着:至少连续20次抓阄均抓到篮球。是不是瞬间觉得很难呢?

3)接上例子,如果连续2016个区块的生成时间小于期望的20160分钟,系统会自动调节Difficulty系数,比如调节Difficulty系数之后,target变成了连续21个0开头的十六进制数字,此时,矿工想要挖矿成功,则需要连续21次抓到篮球,生成新区块的时间就会相对变长。是不是更难了呢?

如果连续2016个区块的生成时间大于期望的20160分钟,则反向调低难度系数。

以上既是:比特币“挖矿”的原理解析,仅为个人观点,欢迎讨论指正~

本期【简亿区块链】时间到此结束,敬请期待下期~

下期预告:

主题:《“比特币”交易打包过程与“区块链”的软硬“分叉”》

预计发布时间:2018年3月23日(周五) 8点见

【彩蛋来啦】

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180320G07W5J00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券