比特币挖矿:难度值

很多朋友在第一次看到“挖矿”这个词时都很疑惑,包括本人。比特 币不是一个软件吗?通过软件来挖矿是什么意思?从字面上来看,应当 是通过投入某种工作,然后能得到一个“宝贝”,也就是矿。当然 了,“挖矿”自然不是我们通常认为的那个挖矿,它只是一套算法,在介 绍算法过程前,我们先来了解下挖矿在比特币软件中主要都有哪些用 途:

  • 抢夺区块打包权

  • 验证交易事务

  • 奖励发行新币

  • 广播新区块

我们知道,比特币是一个对等网络,每个节点都可以独立维护自己 的数据副本,那么问题就来了,怎么来保证彼此之间的数据一致呢?既 然没有一个中心服务器,自然也就没有一个传统意义上的权威数据来源 了。这就得有一个约定的规则,大家共同按照这个规则来进行竞争,谁 竞争成功了谁就有数据的打包权,也就是记账权,打包完成后广播给别 人,别人只要验证一下有无问题即可,没有问题就存入到自己的数据文 件中。这个思路不错,等于就是大家来竞争临时中心服务器的资格,那 么比特币中实行了一种什么样的规则呢?那就是被称为工作量证明 (Proof of Work,PoW)的一种算法,其实就是类似于掷骰子的一种游 戏。比如大家约定掷出一个10位长度的数字,前面6位要都是0,后面的 4位数得小于某个值,看谁先掷出符合要求的数字出来,谁就抢得了打 包权(记账权)。我们来看下比特币中具体是怎么来掷这个骰子的。

难度值

首先,既然是大家都在竞争掷骰子,那掷出来的数字必然是要符合 一个难度的,这个难度就是一个门槛,在比特币软件中,规定一个256 位的整数:

作为难度1的目标值。在比特币诞生初期,当时的全网算力,大约 需要10分钟左右的运算能得到一个符合这个难度1要求的值,这也是我 们常常说比特币网络每隔大约10分钟出一个区块的来源。我们在查询创 世区块(也就是0号区块)的信息时,可以看到当时的难度就是1。那 么,所谓符合这个难度为1的要求的值是什么意思呢?就是说通过工作 量证明算法,也就是比特币中的挖矿算法来计算出一个结果,这个结果 要小于这个难度目标值,我们来看下0号区块的难度信息:

"nonce": 2083236893, "bits": "1d00ffff", "difficulty": 1,

这些信息可以通过比特币支持的JSON-RPC中的getblock命令方法获 得,其中的difficulty就是指难度级别。0号区块的难度值是1,nonce是一 个随机数,是挖矿计算得到的一个数字,这个等会儿再介绍,bits是用 来存储难度的十六进制目标值的,这个难度目标值是存储在区块的头部 的,在源码中被定义为一个4字节长度的字段,4字节也就是32位,要用 来存储256位长度的难度目标值,因此这256位长度的值需要经过压缩处 理后才能放到这个字段中。以这个难度1的目标值来说,我们查询区块 信息后,看到的值是1d00ffif,那么,这个值是怎么压缩而来的呢?规 则其实很简单,我们一共有4个字节来存储,这4个字节的最高位字节用 来存储难度值的有效字节数。什么叫有效字节数?就是从第一个不全为 0的字节开始的部分,比如难度1的值有效位是0x00FFFF......。等等,

比特币挖矿:难度值

怎么前面有2个0呢?这是因为在压缩规则中,规定了如果难度值有效位 的最高位为1 (大于0x80),则需要在前面补上一个0x00,这里的最高 位是F,也就是二进制的1111,因此是符合这个规则的。难度1的目标值 中,有4个字节长度的0,减掉这些0的长度共32bit,剩余256-32=224, 也就是28个字节,加上补的0x00,因此,有效位总计29个字节,29的十 六进制是1D,另外3个字节中存储的是目标值有效位的最高3个字节,

此时的目标值有效位前面已经加上了2个0,因此最高3个字节为 0x00FFFF,合起来压缩后的值就是0x1D00FFFF。对于这样的一个压缩 后的十六进制4字节难度目标值,前2位通常称为幕或者指数,后面6位 称为系数。

那么,有朋友问了,压缩是可以,那还原出来呢?我们看个公式:

我们就以这个0x1D00FFFF为例来说明,系数是后面6位也就是 00FFFF,指数是前面2位也就是1D,代入进去就是:

0x00FFFF*2A (8* (0x1D-3)),计算后得到的值是:

0x00000000FFFF00000000000000000000000000000000000000000000

有朋友可能疑惑了,不对吧,这个跟规定的那个难度1的值不一样 了啊,精度少了很多,确实是的,存储在bits中的值是一个精度截断的 近似值。

我们以200000号区块为例,查询一下难度值,得到如下:

"nonce": 4158183488,

"bits": "1a05db8b",

"difficulty": 2864140.507810974,

我们来看看这个difficulty的值是怎么来的,0号区块的难度是1,对 应的目标值是0x1D00FFFF,200000号区块的难度目标值是 0x1A05DB8B,将两者的目标值按照上述公式进行转换后相除便能得到 这个2864140.507810974的难度值,我们发现,200000号区块的difficulty

比0号区块的大许多,而bits的大小却比0号区块的小许多。这其实是表 明了一个特点,随着全网算力越来越强,difficulty难度值就会越来越 大,而bits表示的目标值会越来越小,这两者成反比,目标值越小就越 难挖矿。

刚才也提到了,难度值并不是一成不变的,比特币差不多每两周会 调整一下新的难度值,因为计算的算力是会变化的,为了维持差不多10 分钟出一个区块的节奏,难度要跟随算力变化而调整,不得不说比特币 的设计还是相当完整的。

新难度值的计算公式是这样的:新难度值=当前难度值X (最近的 2016个区块的实际出块时间/20160分钟)。2016个区块的意思是:假设 按照理论的10分钟出一个块,2周也就是14天的时间,应该出2016个区 块,可以看到实际上就是计算一下实际与理论上的时间差值,弥补上这 个差值即可。

玖壹区块链声明

加微信:469649885区块链培训教程
还可免费获取区块链培训班试学名额

分享:

扫一扫在手机阅读、分享本文

区块链评论

玖壹区块链培训

玖壹区块链培训学院简称(玖壹学院http://www.91xiubbs.com/)提供区块链技术培训资料、区块链开发培训视频教程等下载,不过网上自学区块链技术课程必然存在一些缺陷:遇到问题易卡壳、学习周期漫长、无针对性等。区块链培训机构现场面对面的讲授区块链培训课程可以让您和团队在最短时间内掌握正确、系统、高效的区块链实战技术。