作者:全球大搜罗
发布时间:2018年6月15日
网络来源:微信公众号:工作量证明
一、什么是难度值?
难度值(DIFFICULTY)是一个数,用来调节控制矿工挖出一个区块添加到区块链所需的时间。难度值每2周调节一次,以保证平均10分钟左右可以构建出一个区块添加到区块链。
二、为什么难度值很重要?
因为它可以确保区块以基本固定的时间间隔添加到区块链,即使更多的矿工加入比特币网络。如果难度值保持不变,当有很多新矿工加入网络后,构建区块到区块链的时间将会缩短。
三、难度值什么时候改变?
难度值每2016个区块调节一次(大概2周)。
在这个调整时间间隔内,每个节点以2016个区块的预期挖矿时长(2016*10分钟),除以实际挖矿使用的时间(以分钟计数)。
expected / actual = 20160 / actual
如果矿工可以比预期更快的速度构建区块,比如9分钟可以出一个块,套用计算公式:
expected / actual = (2016 *10) / (2016 * 9) = 1.11
每个节点然后使用这个数值来调整下一阶段2016个区块的难度值:
difficulty * 1.11 = new difficulty
如果系数大于1(比如区块出块速度大于预期),难度值将提高;
如果系数小于1(比如区块出块速度小于预期),难度值将降低。
注:难度值最多会调整成4的倍数(以4为奇数的-1倍或1倍之间,也就是0.25~4的系数值),这用来避免从一个难度值突兀的变化到新的值。
四、难度值怎么来控制区块间的时间呢?
我以一个简单的例子来说明这个过程。
1.简单例子
我给你一个1-100之间的数字区间。
现在,你每分钟可以随机的生成一个1-100之间的数字。而你的目标就是生成一个小于我提供的TARGET的数。比如,我设置TARGET = 50。
由于你每分钟可以生成1个1-100之间的数字,达成你的目标可能需要2分钟。
嗯,这个太简单了。现在,我将target调小到20,也就是说每次你有1/5的可能生成一个符合目标的数字,或者说你平均5分钟可以生成一个这样的数。
目标值越小,生成满足条件的数值的越难
因此,基于你每分钟可以生成的数字个数,我可以使用目标的高度来控制你找到“中奖数字”所需要的时长。
引入难度值
对计算机而言,与直接告诉它目标值(TARGET)相比,我发现通过数字范围除以一个新数字可以更容易的给出目标值……
这个新的数字可以控制目标值的高度
这个新数字是难度值,对我来说这是一个比较容易来改变目标高度的方式。
因此,计算目标值的公式为:
target = targetmax / difficulty
此外,我可以使用DIFFICULTY值来帮助我设置target在我想要的任意位置。
难度值越高,目标值越小
如上,我使用DIFFICULTY来控制TARGET。
2.比特币为例
比特币以完全相同的方式来处理难度值(DIFFICULTY):它被用来计算出目标值(TARGET),而矿工们则一直进行哈希计算以希望他们可以幸运的找到小于目标值的区块。
因为矿工每分钟可以产生成上亿的数字(哈希值),比特币系统使用出奇大的数字区间(targetmax)。
比特币系统中的数字跨度更大
比特币网络有非常非常多的矿工都在尝试计算找到一个“胜利数字”,为确保每10分钟找到一个这样的数字,这些“胜利数字”的范围会非常的紧凑。
引入十六进制数字
由于目标数字太大了,计算更倾向于以十六进制处理它们。
尽管里边有一些字母,但它仍然是一个数字(十六进制允许的字符为0-9,a-f)。由于目标值是一个十六进制数值,矿工们则尝试获得一个小于该值的十六进制哈希值。
事实上,你可以很容易的在十进制和十进制之间转换:
奇怪的是,难度值(DIFFICULTY)通常以十进制表示,而哈希值和目标值(TARGET)则以十六进制存储。正如我之前所说,它们都是数字,而且你把它们转换到同一进制仍旧有效。
五、在哪里我可以找到当前区块的难度值?
你可以通过在比特币客户端输入“getdifficulty”命令获取当前的难度值。另外,难度值也在“getmininginfo”命令返回的结果中。
如果你手边没有一个比特币客户端,你依旧可以通过如下链接获取:http://chainquery.com/bitcoin-api/getdifficulty
另外,如果你对历史难度值变化感兴趣的话,你可以在下面的网址获得一个直观的图表:https://bitcoinwisdom.com/bitcoin/difficulty