什么是“挖矿”(比特币“挖矿”原理解析)
有朋友反映:"文章篇幅略长,知识点偏多,影响阅读。"以后立志做到,【10分钟】掌握一个知识点!
告知:本专栏系列原创文章同步发布在【简亿区块链@】,微信公众号【简亿区块链】以及【开发者头条独家号:简亿区块链】上。
文章图片
什么是“挖矿”? 1.什么是“挖矿”?
我们在系列文章中的《 比特币的“区块”中藏有什么秘密:区块链区块结构解析》介绍了什么是“区块链”以及“区块”的底层数据结构解析;“挖矿”的几个特点
本文主要围绕着网络常用切口“挖矿”来介绍 下“挖矿”的本质和底层原理;
接前言,强调下“区块链”的三个核心特定:
1)凡是被各节点认证过的历史生成区块,是绝不会被篡改的;
因为区块链的只有append(追加)操作,没有随机update(随机写)的操作。
2)新生成的区块,只能链接“挂载”在当前链条的末端‘;
这也就意味着:每个节点在开始运行(或者是运行中)创建新区快这项工作的时候,凡是有新区块被确认增加到了区块链上,那么,当前节点就需要停止手头正在进行的“创建”新区块的工作,转而需要先将最新的区块链数据同步到本地,再继续重新开始试图“创建”新区块。
3)新区块的创建,是一个极其困难复杂的工作;
是一个需要符合特定计算规则,计算结果需要满足特别目标值(这个值很难满足)时,新区快才算初步创建成功;
如果非要一句话简单概括的话:在最新区块链的数据上,生成一个符合条件的区块,链入区块链的过程,就是挖矿。2.比特币“挖矿”的平均时间为何规定成“10分钟”?
“挖矿”具有以下几个特点:
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》
接上,为什么要规定每十分钟挖出一个矿呢?有什么具体的考量吗?10分钟--->1分钟会如何?
首先说明: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,也是调节周期
1)间隔太短,易导致较多孤块的出现,不安全,不利于交易确认,还浪费资源;3.“挖矿”的底层原理是什么?
原因是:每一个“矿工”都需要时刻确认自己是否在主链上,那么就需要矿工之间时刻交流,交流受网速影响(在网络情况不良时,间隔时间越短,这个网络不良的影响对最终的结果影响越大),当有“矿工”生成新的区块,发现它们不在主链上,也就是孤块,只能丢弃,造成浪费。
2)如果出块间隔太短,侧面的也就说明,出块的难度太低;
当出块的频率变高的时候,块与块之间的碰撞频率也就变高,碰撞次数越高,主链被fork(分叉)的概率就越大,fork越多,链结构就会变成树结构。而且每当出现分叉的时候,系统需要花费性能去选出bestChain(bestChain被当做Main链,被各节点认可);
PS:fork即为分叉,分叉分为软分叉和硬分叉,关于分叉和bestChain的选择相关知识点会在本系列的其他文章中讲述。
通俗地讲,“挖矿”即生成新区块的本质是:做一系列的哈希运算,当运算得到的哈希值符合目标规则,即为挖矿成功(其实,就是寻找符合条件的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))】;如果本次所得的哈希值<=target,则“挖矿”成功;反之,Nonce+1,重复上述过程;
PS:
1)Nonce叫“随机数”的原因是因为原则上每次计算当前Nonce值可以随机产生。但是,实际情况下:什么方式最容易计算出目标值呢?穷举法;所以每次计算Nonce从0开始;
2)为什么说“挖矿”这么难呢?(上文中说的target值符合特定的规则:十六进制的以连续0开头,且连续的0越多越能符合命中规则)
打个比方:当前target值为连续20个0开头的十六进制数字;
一个不透明的口袋里有俩形状一模一样的乒乓球,一个红色(1),一个蓝色(0);每次抓阄抓到蓝色则标记位0,红色标记位1,那么如果矿工想要“挖矿”成功,意味着:至少连续20次抓阄均抓到篮球。是不是瞬间觉得很难呢?
如果连续2016个区块的生成时间小于期望的20160分钟,系统会自动调节Difficulty系数,比如调节Difficulty系数之后,target变成了连续21个0开头的十六进制数字,此时,矿工想要挖矿成功,则需要连续21次抓到篮球,生成时间就会相对变长。是不是更难了呢?
如果连续2016个区块的生成时间大于期望的20160分钟,则调低难度系数。
文章图片
区块头结构 以上既是:比特币“挖矿”的原理解析,仅为个人观点,欢迎讨论指正~
【什么是“挖矿”(比特币“挖矿”原理解析)】本期【简亿区块链】时间到此结束,敬请期待下期~
下期预告:
主题:《“比特币”交易打包过程与“区块链”的软硬“分叉”》
预计发布时间:2018年3月23日(周五) 8点见
欢迎关注微信公众号:【简亿区块链】,新鲜出炉的文章会同时发布!
文章图片
微信公众号
推荐阅读
- 成都白癜风医院(白癜风在治疗上需要重视什么)
- 相忘
- 【111-90】重新定位,我是谁()
- 1.27晚间日记|1.27晚间日记 -回家第3天――踏实
- 《世上最美的离别》丨最辛苦的是妈妈,最被家人忽视的也是妈妈
- 乡愁
- matlab|2、将图像转换为点云
- 李诞还是之前的李诞,只是我看到了他更为完整的一面
- 《红楼梦》之探春:才自精明志自高,凤凰真是出鸦巢
- 而我呢则是那个喜欢煽风点火后顺手补刀的那个贱人