区块链比特币挖矿及难度调整

Posted 苏豫笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链比特币挖矿及难度调整相关的知识,希望对你有一定的参考价值。

“ 这份区块链笔记根据北京大学肖臻老师的公开课和互联网资料自行整理而来,因篇幅较长,将分为比特币篇和以太坊篇进行更新。非常感谢肖臻老师区块链公开课,使之成为我个人区块链技术学习过程中的一份宝贵财富,有兴趣的朋友可以自行查阅肖臻老师的个人网站:  zhenxiao.com  


1
前言
矿的本质: 不断尝 试nonce,使得区块块头中的哈希值≤目标阈值。
即:H(Block Header) ≤ Target(Target越小,挖矿难度越高)

2
全节点与轻节点
1、全节点:

【区块链】比特币挖矿及难度调整

2、轻节点

【区块链】比特币挖矿及难度调整

扩展:比特币的安全性保证主要有两点。

          1、密码学:因为有私钥的存在,没有私钥就没有签名。

          2、共识机制。


3
挖矿设备
1、CPU
2、GPU(主要用于大规模并行计算)
3、ASIC(目前相对主流的挖矿方式,只能计算HASH值,并不能做全节点能做的其他事)
     (Application Specific Intergrated  Circuit)

4
矿池
问:为什么会出现矿池?
答:对于单个矿工来说,即使使用了ASIC矿机,其算力在整个系统中仍然只占据很少一部分,即使从平均收益看有利可图,但收入很不稳定。

此外,单个矿工除挖矿还要承担全节点其他责任,造成了算力的消耗。

因此,为了解决这些问题,便引入了矿池的概念。矿工只需要不停计算哈希值,而全节点其他职责由矿主来承担。此外,矿池出现解决了单个矿工收益不稳定的问题。当获得收益后,所有矿工对收益进行分配,从而保证了收益的稳定性。

引自CSDN用户: Sinocifengs

【区块链】比特币挖矿及难度调整


上图为矿池与矿工的关系图。其中矿池主要负责全节点的工作,矿工负责计算哈希值。
问:假设矿工来自五湖四海,如何公平分配收益?
思路一:平均分配,假设有100个矿工,那就100个矿工平均分。但这个思路有个问题,这会导致矿工懈怠偷懒,因为不论它是否真的挖矿,最后都会得到收益,所以这个思路无法实现。
思路二:按劳分配,矿工的主要工作就是计算哈希值,也就是寻找nonce。我们假设目前的目标阈值是要求哈希值的前70位是0,但找到随机数nonce,导致最终的哈希值符合前70位为0非常难,所以矿池可以降低一些要求,只要矿工挖到前60位为0的哈希值就可以分配给它一个share,等到全矿池最后真的挖出矿以后,在按照每个矿工手中的额share来分配收益。(share可以理解成工作量证明,因为哈希值前60位为0对于矿池来说毫无意义,因为不符合目标阈值的要求,但可以作为矿池判断矿工工作量的证明。所以我们可以近似的理解为share ≈ almost vaild block)

以下数据均截止至2021.5.5

【区块链】比特币挖矿及难度调整

(球比特币矿池主要分布国)


【区块链】比特币挖矿及难度调整

(球比特币矿池主要份额)


【区块链】比特币挖矿及难度调整

(球比特币矿池主要份额分布)


5
Few Questions
根据上节比特币矿池的份额,我们可以发现没有一个矿池份额超过51%,表面看起来比特币的安全性仍然有保障,但如果几个份额较大的矿池联合起来,他们的份额很有可能超过51%,那么从这个角度而言,矿池的出现很有可能影响比特币系统的安全。 那么我们现在假设,有矿池的份额达到51%,那么拥有这51%的算力可以发起那些攻击?
1、可否发动Forking Attack(分叉攻击)?
答:可以。通常情况下,我们认为6个区块确认后就等于交易不可篡改了。但由于矿池拥有百分之51的算力,矿池中的M仍然有可能发动分叉攻击。如下图所示,M先向A转账,等待6个区块确认以后,M向自己的另一个账户M'转账,由于矿池掌握全网百分之51的算力,下方链的出块时间将比上方链快很多,从而使得下方链成为最长合法链,也就做到了回滚了上方M向A转账的这笔交易,从而达成分叉攻击。

【区块链】比特币挖矿及难度调整


2、可否发动Boycott?例如A想让全网抵制与B有关的任何交易。

答:可以。如果A所在的矿池掌握51%算力,A将有能力通过分叉攻击回滚一切包含A的交易,且一旦A广播全网宣布这么做,其他的小矿工是不敢将含有B的交易打包进入区块,因为A会进行分叉攻击,如果小矿工仍然这么做,那么小矿工就无法得到出款奖励,也就等于白挖矿了。这种情况下B已经等于社会性死亡了。

【区块链】比特币挖矿及难度调整


3、可否盗币?

答:这几乎不可能,除非可以获得被盗账户的私钥。因为即便矿池算力达到51%,但他没有想要去盗币账户的私钥,因此无法达成这个目的。如果强行将非正确签名的交易包含进去区块,其他矿工也不会认可,所以即便这条链再长,其他矿工依然不会认可这条链是最长合法链,因此盗币是几乎不可能实现的。


5
挖矿难度
挖矿难度是指:计算符合给定目标的一个HASH值的困难程度。比特币网络有一个全局的区块难度,有效的区域必须有一个HASH值,该HASH值必须小于给定的目标HASH,简单的说就是哈希值的前n位0的个数是否符合目标阈值的要求。
在中我们提到过,目前比特币的哈希算法是SHA256,即这个哈希值是256位的,输出空间是2的256次方,也就是取值范围是有2的256次方。
挖矿难度的计算公式:

【区块链】比特币挖矿及难度调整

Target: 目标阈值。
Difficulty_1_target: 当挖矿难度(Target)等于1时所对应的目标阈值。
我们知道H(Block Header) ≤ Target是挖矿成功的要求。Target越小,挖矿难度越大。当挖矿难度等于1时,所对应的Target是非常大的。
由此可见挖矿难度与目标阈值成反比。

下面来看几个问题:

1、为什么要调整挖矿难度?

答:假设不调整挖矿难度,系统总算力越来越强,挖矿难度始终不变,那么出块时间越来越短,当算力强大到1秒就可以出块一次时,由于从区块产生到插入到BTC网络存在延时,那么这种时候将会频繁出现分叉,因此必须调整挖矿难度。


2、如果出块时间越来越短会怎么样?(这是对上一个问题的补充)
答:出现分叉,如下图所示。当出块时间过短时,不光会出现2分叉,甚至有可能出现n分叉,这对比特币系统成共识是没有好处的,还有可能影响到系统的安全性。目前比特币的出块时间是10分钟/块。

【区块链】比特币挖矿及难度调整

3、10分钟出块一次是最好的设定吗?
答:当然不是,但10分钟作为一个定值,在比特币系统中为达成共识提供了比较好的基础。相比之下以太坊的出块时间更快,大约15秒,所以以太坊产生分叉的可能性更大,因此以太坊专门设计了新的共识协议ghost用来解决分叉问题,这个我们后面再说。

6
如何调整挖矿难度
首先比特币系统中规定每2016个区块调整一次挖矿难度,根据出块时间间隔为10分钟,我们可以计算出挖矿难度的调整周期:

【区块链】比特币挖矿及难度调整


挖矿难度的计算公式:

【区块链】比特币挖矿及难度调整

目标阈值的计算公式:

【区块链】比特币挖矿及难度调整

Acutal time: 系统产生2016个区块的实际时间。
Expected time系统产生2016个区块的预期时间(14天)。
刚刚我们提到过挖矿难度与目标阈值成反比,有上面的公式可以印证这一点。
注:当Acutal time超过系统预设的最长或最短时间时,全部用预设的最长或字段时间来计算。
最短时间:半周
最长时间:8周
因此我们可以知道,比特币的单次难度调整是有上下限的,不可能一次就调整的无限难或无限简单。

问题:如果出现恶意节点就是不调整挖矿难度会怎么样?
答:如果恶意节点不调整挖矿难度,那么诚实的节点是不会接受这个恶意节点发出的未调整挖矿难度的区块的。

【区块链】比特币挖矿及难度调整

根据上图可以发现挖矿难度和平均算力的增长基本一致

根据上图可以发现出块耗时在近几年基本维持在10分钟左右


7
总结
本篇描述了关于比特币挖矿以及难度调整的相关内容,若有错误还请读者指正,若文中有地方写的不详细,欢迎通过公众号留言告知我或查看肖臻老师的公开课。



关于本人
南京师范大学在读硕士研究生,区块链技术爱好者。
欢迎通过公众号与我留言沟通,愿每个人都可以实现自己的梦想,Peace!
Github: https://github.com/DiaoSuYu/

以上是关于区块链比特币挖矿及难度调整的主要内容,如果未能解决你的问题,请参考以下文章

《区块链100问》第27集:比特币挖矿机进化史

详解比特币挖矿原理

以太坊挖矿比特币挖矿Filecoin挖矿哪一种投资风险小,收益大?

比特币挖矿究竟在计算一个啥问题?手动验证区块链给出答案

Bitcoin挖矿

融链数据|| 比特币挖矿的电费问题会困扰Filecoin吗?