区块链:比特币难度的概念。
这篇笔记记录一下对于比特币难度的学习,参考这里,记录下来自己的理解,哩哩啦啦地写了两天,边看边查,还是没有理解到位,等待之后再补充吧。
Difficulty is a measure of how difficult it is to find a hash below a given target.
Difficulty
是用来衡量找到一个低于给定目标的hash
的困难程度。
difficulty = difficulty_1_target / current_target
(target is a 256 bit number)
有许多不同测量难度的方法,得到的difficulty_1_target可能不同。传统地,它表示一个HASH
值,前32位为0,后面都为1(也就是被称为“矿池难度”或“pdiff”的值),比特币协议把目标HASH
表示成一个有限精度的自定义浮点类型。因而,比特币客户端用该值来估计难度(称之为:“bdiff”)。
每一个区块会用一种压缩的格式(被称为“Bits”)来表示实际的16进制的目标值。目标值通过一个预先定义好的公式,从这个压缩值中得出。举一个例子,压缩值为0x1b0404cb
,16进制的目标值则是:
0x0404cb * 2**(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000
Note that the 0x0404cb value is a signed value in this format. The largest legal value for this field is 0x7fffff. To make a larger value you must shift it down one full byte. Also 0x008000 is the smallest positive valid value.
注意0x0404cb
是一个符号数,最大值是0x7fffff
,这个明白,下面两句就不明白了:如果想生成一个更大的值,你需要向下移动一整个字节。同时,0x008000
是最小的正值(为什么不是0x000001
呢?)。
最大目标难度(1)被定义成0x1d00ffff
, 那么
0x00ffff * 2**(8*(0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000
这个是截断后的目标值,就是上文所说的比特币协议定义的格式,如果没有截断,那么就是:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
所以0x1b0404cb
位置的难度是:
0x00000000FFFF0000000000000000000000000000000000000000000000000000 /
0x00000000000404CB000000000000000000000000000000000000000000000000
= 16307.420938523983 (bdiff)
或者:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF /
0x00000000000404CB000000000000000000000000000000000000000000000000
= 16307.669773817162 (pdiff)
Current difficulty。这个是比特币浏览器提供的接口,给出了当前难度。
There is no minimum target. The maximum difficulty is roughly: maximum_target / 1 (since 0 would result in infinity), which is a ridiculously huge number (about 2^224).
The actual maximum difficulty is when current_target=0, but we would not be able to calculate the difficulty if that happened. (fortunately it never will, so we’re ok.)
不存在最小的目标。最大难度可以粗暴地认为是:maximum_target / 1(因为0会产生无限值),这个数很大,大约是2的224次方。
可以,参考上面的内容。
The minimum difficulty, when the target is at the maximum allowed value, is 1.
当targe是最大允许值的时候,最小难度,也就是1。这里说的target应该是分母,分子的最大值是确定的,上文已经说过了。
根据10分钟一块的平均速度,产生2016个块应该需要两周。每产生2016个块,会调整一下难度,根据之前产生这2016个块花费的时间,和理论上应该花费的时间–两周做一下对比。
难度为1时的目标值(上文提到的):
0xffff * 2**208
难度为D时的目标值应该是:
(0xffff * 2**208) / D
所需要的hash
计算数(2**256是最大hash
计算数,除以当前的目标值,也是一个256位的数,例如上面的0x00000000000404CB000000000000000000000000000000000000000000000000
,这个地方不是太理解,这样除,就可以算出总共需要的计算数?翻了一些帖子,还是没有找到答案)
D * 2**256 / (0xffff * 2**208)
简化为:
D * 2**48 / 0xffff
以上是10分钟的hash
数,hash
率是以秒为单位的,所以:
D * 2**48 / 0xffff / 600
最后简化为:
D * 2**32 / 600
如果难度为1的话,每秒钟7 Mhashes。
原文写作时,难度是 22012.4941572,那么过去2016个块的hash
率是:
22012.4941572 * 2**32 / 600 = around 157 Ghashes per second.