主页 > imtoken苹果闪退 > 比特币挖矿难度
比特币挖矿难度
比特币挖矿难度列表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
含义:找到一个新区块需要将近一天的时间。
参考: