区块链:比特币难度的概念

原帖收藏于IT老兵驿站,传递一个IT老兵在凋零前的光和氧。

区块链:比特币难度的概念。

前言

这篇笔记记录一下对于比特币难度的学习,参考这里,记录下来自己的理解,哩哩啦啦地写了两天,边看边查,还是没有理解到位,等待之后再补充吧。

正文

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进制的目标值则是:

1
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, 那么

1
0x00ffff * 2**(8*(0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000

这个是截断后的目标值,就是上文所说的比特币协议定义的格式,如果没有截断,那么就是:

1
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

所以0x1b0404cb 位置的难度是:

1
2
3
0x00000000FFFF0000000000000000000000000000000000000000000000000000 /
0x00000000000404CB000000000000000000000000000000000000000000000000
= 16307.420938523983 (bdiff)

或者:

1
2
3
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应该是分母,分子的最大值是确定的,上文已经说过了。

在给定难度的情况下,网络hash率是如何得出的

根据10分钟一块的平均速度,产生2016个块应该需要两周。每产生2016个块,会调整一下难度,根据之前产生这2016个块花费的时间,和理论上应该花费的时间–两周做一下对比。

难度为1时的目标值(上文提到的):

1
0xffff * 2**208

难度为D时的目标值应该是:

1
(0xffff * 2**208) / D

所需要的hash计算数(2**256是最大hash计算数,除以当前的目标值,也是一个256位的数,例如上面的0x00000000000404CB000000000000000000000000000000000000000000000000 ,这个地方不是太理解,这样除,就可以算出总共需要的计算数?翻了一些帖子,还是没有找到答案)

1
D * 2**256 / (0xffff * 2**208)

简化为:

1
D * 2**48 / 0xffff

以上是10分钟的hash数,hash率是以秒为单位的,所以:

1
D * 2**48 / 0xffff / 600

最后简化为:

1
D * 2**32 / 600

如果难度为1的话,每秒钟7 Mhashes。
原文写作时,难度是 22012.4941572,那么过去2016个块的hash率是:

1
22012.4941572 * 2**32 / 600 = around 157 Ghashes per second.

参考

https://en.bitcoin.it/wiki/Difficulty。