主页 > imtoken苹果闪退 > 比特币挖矿难度

比特币挖矿难度

imtoken苹果闪退 2023-07-21 05:18:40

比特币挖矿难度列表1.挖矿

块头

内容大小

版本号

4字节

父块的哈希

32 字节

默克尔根值

32 字节

时间戳

4字节

难度目标值

4字节

随机数

4字节

区块头总是 80 字节长,并在钱包生成交易时传播到相邻节点。节点验证收到的交易并丢弃非法交易。(对于节点来说,验证交易是一种义务。否则,当辛辛苦苦挖出来的矿场在全网广播时,其他节点在验证时会发现这是一个错误信息。)

交易验证包括以下内容:

将符合条件的交易添加到本地交易数据库中,并将合法交易转移到相邻节点。

在挖矿之前,矿工必须形成区块,将coinbase交易打包成块,并将交易池中的高优先级交易打包成块(优先级=交易数量*UTXO深度/交易大小),这样做的原因可能是为了防止扬尘攻击。

挖矿的过程就是不断地改变区块头中的 Nonce 值,使区块头的哈希值小于给定的目标难度值。挖矿成功后比特币挖矿难度调整时间,将计算出的随机数Nonce填入区块头,并广播给相邻节点。

2. 挖矿难度调整

比特币每 2016 个区块调整难度:

新目标值 = 当前目标值 *(过去 2016 个区块的分钟数 / 20160 分钟)

难度目标值:区块头哈希应该小于的值

难度是衡量挖矿难度的指标,即计算出满足给定目标的 HASH 值的难度。比特币网络具有全局区块难度,有效区域的 HASH 值必须小于给定的目标 HASH。矿池还将有一个自定义的共享难度,该难度设置了生成权益的最低难度限制。

难度:难度1的难度目标值/当前难度目标值>=1

计算公式:难度=难度_1_target/current_target。目标是一个 256 位的值。

难度值 1 是中本聪初始挖矿的难度值。

其目标值为

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 是矿工使用的最大目标 HASH 值。

0x0000000000000000000000000000000000000000000000000是比特币网络中使用的浮点编码类型,后面的位数被缩短了。

衡量难度的方法有很多种,得到的难度_1_target可能会有所不同。传统上表示一个HASH值,前32位为0,后面部分为1(称为:矿池难度或pdiff)。比特币协议将目标 HASH 表示为一个固定精度的自定义浮点类型,so ,比特币客户端使用它来估计难度(称之为:bdiff)。

难度往往存储在块中,每个块存储目标HASH的16进制压缩表达式(称为:Bits),目标HASH可以用预先定义的公式计算。例如:如果块中的压缩目标HASH为0x1B0404CB,则十六进制目标HASH如下:

目标值 = 0x0404cb * 2^(8*(0x1b - 3))

=0x00000000000404CB00000000000000000000000000000000000000000000000

因此,当目标HASH为0x1b0404cb时,难度为:

0x00000000FFFF0000000000000000000000000000000000000000000000000000 /

0x00000000000404CB000000000000000000000000000000000000000000000000

= 16307.420938523983 (bdiff)

或者:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/

0x00000000000404CB000000000000000000000000000000000000000000000000

= 16307.669773817162 (pdiff)

其中:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF是矿机使用的最大目标HASH值。

0x0000000000000000000000000000000000000000000000000是比特币网络中使用的浮点编码类型,后面的位数被缩短了。

3. 计算比特币难度

#include 
#include  
inline float fast_log(float val)
{
    int * const exp_ptr = reinterpret_cast <int *>(&val);
    int x = *exp_ptr;
    const int log_2 = ((x >> 23) & 255) - 128;
    x &= ~(255 << 23);
    x += 127 << 23;
    *exp_ptr = x;
    val = ((-1.0f / 3) * val + 2) * val - 2.0f / 3;
    return ((val + log_2) * 0.69314718f);
}
float difficulty(unsigned int bits)
{
    static double max_body = fast_log(0x00ffff), scaland = fast_log(256);
    return exp(max_body - fast_log(bits & 0x00ffffff) + scaland * (0x1d - ((bits & 0xff000000) >> 24)));
}
int main()
{
    std::cout << difficulty(0x1b0404cb) << std::endl;
    return 0;
}

import decimal, math
l = math.log
e = math.e
print (0x00ffff * 2**(8*(0x1d - 3)) / float(0x0404cb * 2**(8*(0x1b - 3))))
print (e**(l(0x00ffff * 2**(8*(0x1d - 3)) / float(0x0404cb * 2**(8*(0x1b - 3))))))
print (l(0x00ffff * 2**(8*(0x1d - 3))) - l(0x0404cb * 2**(8*(0x1b - 3))))
print (l(0x00ffff) + l(2**(8*(0x1d - 3))) - l(0x0404cb) - l(2**(8*(0x1b - 3))))
print(l(0x00ffff) + (8*(0x1d - 3))*l(2) - l(0x0404cb) - (8*(0x1b - 3))*l(2))
print (l(0x00ffff / float(0x0404cb)) + (8*(0x1d  - 3))*l(2) - (8*(0x1b - 3))*l(2))
'''
16307.420938523983
16307.420938523986
9.69937555549194
9.69937555549194
9.69937555549194
9.69937555549194
9.699375555491947
'''

过关可以获得当前难度,过关可以获得下一个难度。可以查看难度变化。

最小难度是难度1对应的目标是最大的目标。

根据前一个 2016 块的生成时间,每 2016 块难度都会发生变化。预计每 10 分钟产生一个区块,因此产生 2016 个区块需要 2 周时间。如果前2016个区块产生超过两周,目标难度值会增加,难度值会减少,挖矿难度会增加,否则难度会增加,目标难度值会变小,挖矿难度会增加。减少。

为了找到一个新的区块,该区块的 HASH 值必须小于目标 HASH,这实际上是一个介于 0 和 2^256-1 之间的随机数。难度1的偏移量为:0xffff * 2^208 [可能现有打包目标的最大值为0x1d00ffff(即难度1对应的目标)]

难度D的偏移量为(0xffff * 2^208)/D

在难度 D 中,我们期望计算的 HASH 量以找到一个新块是

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

要不就

D * 2^48 / 0xffff

难度设置为每10分钟产生2016个区块,所以我们在600秒内计算(D * 2^48 / 0xffff) HASH,也就是说2016个区块产生的网络HASH率(算力)一个块的大小是 D * 2^48 / 0xffff / 600

可以进一步简化为:D * 2^32 / 600

上述公式具有较好的准确性。

在难度 1 下,计算能力为 7Mhashes/sec。写这篇文章的时候比特币挖矿难度调整时间,难度是4940704885521.827,也就是说找到了之前的2016个区块,平均算力是:35366.94PHash/s。

4940704885521.827 * 2^32 / 600 = 大约 35366.94PHash/s

找到一个块的平均时间可以用下面的公式来估计:

时间 = 难度 * 2^32 / 算力

其中,难度为当前难度,你的矿机算力单位为hash/s,时间为你找到的两个区块之间的平均时间。示例:当矿机算力为1Ghashes/s,难度为20000时,使用Python计算出新块的时间,(其中**代表索引):

$ python -c "打印 20000 * 2**32/10**9/60/60.0"

23.85

含义:找到一个新区块需要将近一天的时间。

参考: