比特币 难度值(difficulty)
难度(Difficulty)
难度是对挖矿困难程度的度量,即指:计算符合给定目标的一个HASH值的困难程度。比特币网络有一个全局的区块难度,有效的区域必须有一个HASH值,该HASH值必须小于给定的目标HASH。矿池也会有一个自定义的共享难度用来设定产生股份的最低难度限制。
难度每过2016块改变一次,计算公式:difficulty = difficulty_1_target / current_target。目标(target)是一个256位长的数值。
有许多不同测量难度的方法,得到的difficulty_1_target可能不同。传统地,它表示一个HASH值,前32位为0,后续部分为1(称之为:矿池难度或pdiff),比特币协议把目标HASH表示成一个固定精度的自定义浮点类型,因而,比特币客户端用该值来估计难度(称之为:bdiff)。
难度经常被存贮在区块中,每个块存贮一个十六制的目标HASH的压缩表达式(称之为:Bits),目标HASH可以以预先定义的公式计算出来。例如:如果区块中压缩的目标HASH为0x1b0404cb,那十六进制的目标HASH如下所示:
0x0404cb * 2^(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000
因而目标HASH为0x1b0404cb时,难度为:
0x00000000FFFF0000000000000000000000000000000000000000000000000000 /
0x00000000000404CB000000000000000000000000000000000000000000000000
= 16307.420938523983 (bdiff)
或者:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF /
0x00000000000404CB000000000000000000000000000000000000000000000000
= 16307.669773817162 (pdiff)
其中:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 是挖矿机使用的最大目标HASH值。
而0x00000000FFFF0000000000000000000000000000000000000000000000000000则是比特币网络使用的浮点编码类型,后面的位数被缩短。
下面是一个快速计算比特币难度的方法,它的算法使用修改的泰勒序列(你可以看wikipedia上的教程),并且依赖记录来转换难度计算。
#include <iostream>
#include <cmath>
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*(0x1d – 3)) / float(0x0404cb * 2**(8*(0x1b – 3)))
print 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)
print l(0x00ffff / float(0x0404cb)) + (0x1d – 0x1b)*l(2**8)
目前难度可以通过http://blockexplorer.com/q/getdifficulty来得到,下一个难度可以通过http://blockexplorer.com/q/estimate来获得。难度的变化情况可以查看http://bitcoin.sipa.be/。
最大难度大约=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,这就意味着产生2016个区块的网络HASH速率(算力)是
D * 2^48 / 0xffff / 600
可以进一步简化为:
D * 2^32 / 600
以上公式有较好的精度。
在难度1下,算力是7Mhashes/秒,译者在翻译这篇文章时难度是5,006,860,589,这就意味着以前2016个区块被找到,其平均算力是:35.840PHash/s。
5,006,860,589 * 2^32 / 600 = 大约在35.840 PHash/s
发现一个区块的平均时间,可以用以下公式估计:
时间 = 难度 * 2^32 / 算力
其中,难度是当前的难度,算力你的矿机的计算能力,是hashes/s为单位,时间是你找到的两个区块之间的平均时间。举例:使用Python计算,算力为1Ghashes/s的矿机,难度在20000时,产生一个新区块的时间,(其中**表示指数):
$ python -c “print 20000 * 2**32 / 10**9 / 60 / 60.0”
23.85
意思就是:找到一个新区块要花费近1小时。
挖矿硬件对比,这里有一些统计,可以帮助你预测收入。
收支计算器1,收支计算器2,能帮你计算收支。
记住:这只是可能性,并不能保证你每天都能找到新区块。建议加入矿池挖矿,通过共享区块收益的方式,能得到稳定长期的回报。
比特币 难度值(difficulty)的更多相关文章
- 什么是比特币(bitcoin)
一.什么是比特币? 比特币是一种由开源的P2P软件产生的电子货币,是一种网络虚拟货币.比特币使用遍布整个P2P网络节点的分布式数据库来记录货币的交易,并使用密码学的设计来确保货币流通各个环节安全性.比 ...
- 比特币pow算法介绍
Proof Of Work 工作量证明 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专家亚当.贝克(Adam Back) 用工作量证明系统解决了互联网垃圾邮件问题,它要求计算机在获得发 ...
- 比特币nBits计算
转载:比特币源码分析(二十二) - 挖矿和共识 https://blog.csdn.net/yzpbright/article/details/81231351 CalculateNextWorkRe ...
- 关于POW机制及POW难度调节机制
工作量证明,英文为proof of work,通过或与计算,计算出一个满足规则的随机数,即获得本次记账权,发出本轮需要记录的数据,全网其他节点验证后一起存储.简单理解就是一份证明,用来确认你做过一定量 ...
- 比特币PoW
比特币区块头结构 字段 大小(Byte) 说明 nVersion 4 区块版本号,表示本区块遵守的验证规则 hashPrevBlock 32 前一区块的哈希值,使用SHA256(SHA256(父区块头 ...
- LL谱面分析和难度标定
LL谱面分析和难度标定 先介绍一下LL谱面的存储方式:TimeLine序列(简称TL序列),TL序列中的每一个元素(即音符)可以由一个C语言中的结构体来表示: struct note{ int lin ...
- 【优先队列】-HDU4546比赛难度
比赛难度 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- 【比特币】SPV是如何工作的
SPV是如何工作的 SPV, Bloom 过滤器和检查点 这是一篇技术文章,获取比特币的工作知识. 一个完整的节点,比如比特币核心,知道以下几点: 每一个当前正在围绕网络广播事务处理 每一个曾经被送到 ...
- RNN循环神经网络实现预测比特币价格过程详解
http://c.biancheng.net/view/1950.html 本节将介绍如何利用 RNN 预测未来的比特币价格. 核心思想是过去观察到的价格时间序列为未来价格提供了一个很好的预估器.给定 ...
随机推荐
- zznu-oj-2117 : 我已经在路上了(求函数的原函数的字符串)--【暴力模拟题,花式模拟题,String大法好】
2117 : 我已经在路上了 时间限制:1 Sec 内存限制:256 MiB提交:39 答案正确:8 提交 状态 编辑 讨论区 题目描述 spring是不折不扣的学霸,那可是机房考研中的头号选手,不吹 ...
- Reloading current route in Angular 5 / Angular 6 / Angular 7
问题: angular 从子状态回到当前的父级状态的时候,父级状态不会重新初始化. https://github.com/angular-ui/ui-router/issues/2992 原文:htt ...
- FFmpeg常用命令学习笔记(六)图片与视频互转命令
图片与视频互转命令 1.视频转图片 ffmpeg -i in.mp4 -r 1 -f image2 img-%3d.jpeg -r 1:转换图片帧率为1,也就是1秒转1张.-f image2:将媒体文 ...
- nginx location if 的匹配规则
cation匹配命令 ~ #波浪线表示执行一个正则匹配,区分大小写~* #表示执行一个正则匹配,不区分大小写^~ #^~表示普通字符匹配,不是正则匹配.如果该选项匹配,只匹配该选 ...
- BZOJ 2145: 悄悄话 (打表)
BZOJ 2145 题解 直接代词,所有格,常用副词,助动词,冠词,常用词打表 比较出现次数的多少来决定循环位移了几位. CODE #include <bits/stdc++.h> usi ...
- POJ-3186-Treats for the Cows(记忆化搜索)
链接: https://vjudge.net/problem/POJ-3186 题意: FJ has purchased N (1 <= N <= 2000) yummy treats f ...
- 参数类型 (@Service层) impl
@Override public List<Map<String, Object>> selectAdvListByPosition(String adStructure, P ...
- DRF-解析器组件源码解析
解析器组件源码解析 解析器组件源码解析 1 执行request.data 开始找重装的request中的data方法 2 在dispatch找到重装的request def dispatch(self ...
- windows游戏编程 创建WIN32一个HelloWOrld程序
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22449085 作者:jadeshu 邮箱: jades ...
- Django基础之ORM操作
################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...