主页 > imtoken钱包最新版下载不能 > (转)比特币挖矿难度

(转)比特币挖矿难度

难度

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

难度每 2016 个区块变化一次。计算公式为:难度=难度_1_target/current_target。目标是一个 256 位的值。

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

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

0x0404cb * 2^(8*(0x1b - 3)) = 0x00000000000404CB00000000000000000000000000000000000000000000000

所以当目标HASH为0x1b0404cb时,难度为:

0x00000000FFFF00000000000000000000000000000000000000000000000000/

怎么知道比特币是你的

0x00000000000404CB00000000000000000000000000000000000000000000000

= 16307.420938523983 (bdiff)

或者:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/

0x00000000000404CB00000000000000000000000000000000000000000000000

= 16307.669773817162 (pdiff)

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

怎么知道比特币是你的

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

这里有一个快速计算比特币难度的方法,它的算法使用修改后的泰勒序列(你可以在维基百科上查看教程),并依赖记录来转换难度计算。

#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;
}
如果要看以上一般难度计算的数字原理,以下是python代码:
import decimal, math
l = math.log
e = math.e
print 0x00ffff * 2**(8*(0x1d3)) / float(0x0404cb * 2**(8*(0x1b3)))
print l(0x00ffff * 2**(8*(0x1d3)) / float(0x0404cb * 2**(8*(0x1b3))))
print l(0x00ffff * 2**(8*(0x1d3))) – l(0x0404cb * 2**(8*(0x1b3)))
print l(0x00ffff) + l(2**(8*(0x1d3))) – l(0x0404cb) – l(2**(8*(0x1b3)))
print l(0x00ffff) + (8*(0x1d3))*l(2) – l(0x0404cb) – (8*(0x1b3))*l(2)
print l(0x00ffff / float(0x0404cb)) + (8*(0x1d3))*l(2) – (8*(0x1b3))*l(2)
print l(0x00ffff / float(0x0404cb)) + (0x1d0x1b)*l(2**8)

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

最大难度大约是=maximum_target/1(因为0导致无穷大),这是一个非常大的值,大约2^224;当maximum_target为最小值1时,最小难度值为1。

难度会根据之前 2016 块的生成时间每 2016 块发生变化。预计每 10 分钟产生一个区块,因此产生 2016 个区块需要 2 周时间。如果第一个 2016 块花费了两周以上,难度会降低;否则难度会增加。

为了找到一个新的区块怎么知道比特币是你的,该区块的HASH值必须小于目标HASH,它实际上是一个介于0和2^256-1之间的随机数。难度1的偏移量为:

怎么知道比特币是你的

0xffff * 2^208

难度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,即产生网络HASH率(算力) 2016 块是

D * 2^48 / 0xffff / 600

可以进一步简化为:

D * 2^32 / 600

以上公式准确度更高。

在难度 1 时,哈希率为 7Mhashes/sec。译者翻译这篇文章的难度为5,006,860,589,意思是找到了之前的2016个区块,平均算力为:35.@ >840PHash/s。

5,006,860,589 * 2^32 / 600 = 大约 35.@>840 PHash/s

怎么知道比特币是你的

发现一个区块的平均时间可以使用以下公式估算:

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

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

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

23.85

意思:发现一个新区块需要将近1个小时。

矿机对比,这里有一些统计数据可以帮助你预测你的收入。

收入和支出计算器1,收入和支出计算器2,可以帮助您计算您的收入和支出。

请记住:这只是一种可能性,不能保证您每天都能找到新的区块。建议加入矿池进行挖矿。通过分享区块收益,您可以获得稳定和长期的回报。