im钱包官网首页|比特币如何调整挖矿难度

作者: im钱包官网首页
2024-03-12 16:23:28

一文读懂BTC挖矿难度调整 - 知乎

一文读懂BTC挖矿难度调整 - 知乎首发于比特币/Bitcoin切换模式写文章登录/注册一文读懂BTC挖矿难度调整柠檬不萌S当我第一次了解比特币挖矿的时候,我认为它很简单,就像坐在家里,做着我想做的事情,而我的电脑会投入工作,在我睡觉的时候赚钱。但不完全是。事实证明,还有很多原因使得上述情况完全不可能发生。但为了理解其中的原因,我们首先必须理解挖矿的整个概念,以及它在加密货币方面的意义。挖矿是什么?从本质上讲,挖矿就是创建新的区块,用交易记录填充它们,并将它们添加到区块链中,让每个人都能看到,并就特定的货币是如何使用的这件事达成一致。然而,为了添加一个区块,矿工必须解决一个“加密谜题”,或者用更专业的术语来说,他们必须得到一个有效的块Hash。我不会讲太多的Hash函数相关的知识,但简单地说,Hash是拿到区块的所有信息,然后把它处理,直到它返回一个与此前内容没有任何关系的随机的字母和数字64位十六进制数。如果你改变了区块上的任何数据,随机数将会有很大的不同,但如果什么都没有改变,它将总是返回相同的内容。但是如何知道Hash值是否有效呢?这就是难度目标的由来。目标描述一个阈值,并且要使Hash有效,该值必须小于目标。你可能会问,如果不能更改交易信息,如何获得不同的Hash值呢?在创建Hash时,区块中还有另一个因素要考虑进去——你可以修改它,它被称为nonce。资料来源:Khaled Salah矿工们一直在为了这个数字努力,直到输出的Hash值小于目标值。因为Hash值是随机的,所以目标越低,就越难找到一个有效的Hash值。就像掷骰子一样,掷一个小于3的数字比掷一个小于4的数字更难。那么你如何确定目标的价值呢?这个问题的答案就是我们今天要讨论的话题:挖矿难度。什么是挖矿难度?这是不言自明的,但是挖矿的难度仅仅是指为区块找到一个有效的Hash值有多么困难和耗时。一个更好的问题应该是,为什么挖矿一开始就需要有难度?区块链的全部意义在于在网络中的多个个体之间建立共识,也就是说在一个真理上达成一致。它们是如何做到这一点的呢?它们取网络中最长的有效链,这取决于向它投入了多少工作(计算Hash值所花费的时间),并接受它作为构建的主链。有了这个难度,就可以确保网络的安全性,因为它可以防止欺诈。如果添加区块很容易,那么有人可能会发送欺诈性交易,然后向网络发送垃圾邮件,以创建他们自己的最长链。然而,由于挖矿困难,为了防止垃圾信息,添加块的过程变慢,平均需要10分钟来挖掘一个块。这里的棘手之处在于,攻击者可以通过寻找增加计算能力的方法轻松绕过这一困难。幸运的是,我们提前想好了,想出了一种方法让系统控制困难。挖矿难度如何确定?定期调整难度,以确保总是平均需要10分钟来挖掘一个区块。在每添加2016个区块后,系统会查看创建这些2016个区块所花的时间。正常情况下,需要2周左右,或20160分钟。如果超过两周,难度就会降低,如果不到两周,难度就会增加。难度可以如下确定。推导出新难度的公式正如你可以从反比函数中看到的,如果花费的时间超过2周,分数将小于1,新难度将会减少。如果花的时间超过2周,分数就会大于1,新的难度就会增加。如果难度降低,目标值就会增加,从而更容易找到有效的散列,反之亦然。最大目标值为1,由此可见难度也与目标值成反比。难度与目标的关系为了防止突然的变化,难度的增加或减少不能在一次调整中超过4倍。但回到我们如何想出目标的问题上,我们需要探索影响挖掘区块所需时间的不同因素。有两件事可能会影响这段时间:计算能力网络中个体的数量计算能力在比特币的早期,你可能已经能够成功地进行挖矿,就像我过去认为的人们所做的那样——用他们的个人电脑。然而,矿工很快被迫升级。由于挖矿本质上是一场竞赛,人们竞相首先找到Hash值并获得奖励,那些拥有更强大计算机的人将能够在同一时间内做出更多计算结果,因此获胜的机会也会更高。升级一开始只是简单的从CPU到显卡的转换,但近年来,升级的幅度要大得多,现在所谓的ASIC(特定应用集成电路)--一种专门为挖矿而设计的器件--已经是能够参与竞争所需的最低限度。但即便如此,你也不太可能赚到任何东西。目前,你可能需要40年才可以开采一个区块。如果你想赚钱,你可能必须加入一个矿池——矿工们联合起来增加他们获胜的可能性。考虑到所有这些进步和计算机不断变得越来越快的事实,为了跟上它们并保持10分钟的平均速度,挖矿难度必须补偿这一点。网络的规模等等,但我们并不是每两周就有更快的电脑,对吧?虽然计算机的不断改进是需要调整机制的主要原因,但该系统也对网络中的个体数量进行了补偿。矿工越多,找到一个有效Hash值所花的时间就越少,因为在相同的时间内会进行更多的计算结果。因此,当有更多矿工在场时,困难增加,当矿工更少时,困难减少。总结所以回到我们一开始的地方--在今天这个时代,用你的PC挖比特币几乎是不可能的,原因是由于设备升级和网络规模增大所做的补偿,导致挖矿难度不断增加。你的PC根本没有计算能力再跟上其他人的脚步,所以你能够成功挖出一个区块的几率非常非常低。即使系统的设计是为了降低难度,但很少会这样做。更快、更强大的设备不断被开发出来,同时越来越多的人加入了比特币网络。事实上,自2009年1月比特币诞生到2020年11月,已经有250次难度增加,只有53次难度降低。算力比特币挖矿形同猜数字谜,矿工要找出一个随机数(Nonce)参与哈希运算 1Hash(Block+Nonce),使得区块哈希值符合难度要求。算力则指计算机每秒可执行哈希运算的次数,也称为哈希率(hashrate)。下图是当前比特币算力图表 2。到 2017 年时,比特币挖矿所需算力疯涨。这与不断研发出的新型矿机投入市场有关——这些矿机利用新的技术,拥有更强的运算能力,即单位成本下的算力在快速增长,由此带来了整体算力的提升。算力单位算力每隔千位划为一个单位,最小单位 H=1 次,其他分部是:1 H/s = 每秒可执行一次哈希运算。1 KH/s = 每秒 1,000 哈希(一千次)。1 MH/s = 每秒 1,000,000 次哈希(百万次)。1 GH/s = 每秒 1,000,000,000 次哈希(十亿次)。1 TH/s = 每秒 1,000,000,000,000 次哈希(万亿次)。1 PH/s = 每秒 1,000,000,000,000,000 次哈希。1 EH/s = 每秒 1,000,000,000,000,000,000 次哈希。如果不清楚单位简称,可以查看下面国际单位的前缀表。挖矿难度计算动态调整挖矿难度 Difficulty为什么算力会变化呢?这和比特币协议设计有关。中本聪设计比特币时,加入挖矿难度调整机制是为了使得比特币出块时间能理想的恒定在 10 分钟左右。比特币协议规定每隔 2016 个区块,将根据过去最近 2016 个区块出块总时间调整,自动调整下一个 2016 个区块的挖矿难度。理想情况下 2016 个块需要两周(2016*10s)时间,如果实际用时不到两周则增加难度,如果超过两周就降低难度。原本中本聪设计的是一个公平的完全去中心化的一个数字货币系统,每个人都可以使用个人电脑进行挖矿。然而,有利可图时大量新算力不断加入,矿工竞争激烈,使得单个矿工的挖矿成功率几乎为零。2011 年起矿池出现,大量矿工纷纷加入矿池,以稳定收入,摊薄成本。大量算力融入,使得比特币挖矿难度越来越大。数字货币挖矿业形同军事竞备,挖矿设备不断更新迭代,不再遵循摩尔定律。专业矿机专门针对哈希算法、散热、耗能进行优化,这脱离了比特币网络节点运行在成千上万的普通计算中并公平参与挖矿的初衷。矿池的算力占据,也使得比特币风险一直存在:51% 算力攻击。挖矿难度计算公式需要多少算力才能找出一个随机数,由当前区块的挖矿难度决定,难度越大所需算力越多。但挖矿难度并不在区块信息中,只在网络节点中依据规则动态计算,公式如下:D=T1 /TT 字母是 Target 的缩写,D 字母是 DiFFiculty 缩写。 T1 和 T 均是一个 256 位的大数字 (bignumber),其中 T1 为一个非常大的常数 2 256−32−1。依据公式,T越小,挖矿难度 D 越大。依据公式,当 T=0时,D 无穷大,标志着无法计算出结果。幸运的是, T 不会为 0,最小值为 1,此时难度值最大,为 2256−32−1=2224−1。当 T=T1时,难度值为最小值 1。编辑于 2021-01-13 08:14btc挖矿比特币 (Bitcoin)比特币矿机​赞同 4​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录比特币/Bitcoin比特

比特币工作量证明难度值及难度调整详解 - 知乎

比特币工作量证明难度值及难度调整详解 - 知乎首发于区块链技术详解切换模式写文章登录/注册比特币工作量证明难度值及难度调整详解Zarten​计算机技术与软件专业技术资格证持证人作者:Zarten知乎专栏:区块链技术详解知乎ID:Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 !概述在比特币系统中工作量证明是有一定难度的,难度保持在整个系统中平均10分钟才能增加一个区块,那是如何维持这样的一个水平的呢?是通过区块头中的一个难度目标值(target)来决定的。下面讲解比特币系统中的这个难度值和如何调整难度值。难度值在每个区块头中都有一个“Bits”字段,被称为“目标位”,也就是所谓的难度值。如下所示:我们知道,在比特币系统中满足下面公式即为挖矿成功:H(block header) <= target那么这个target是通过Bits得来的。难度目标值(target)计算公式target以指数形式存在,以十六进制表示,总共有8位,前2位为指数,后6位为系数。所以上图中,指数为0x17,系数为0x1320bc计算公式为:难度值(target) = 系数 * 2^(8 * (指数 - 3))因此上图中的难度值为:难度值(target) = 0x1320bc * 2^(8 * (0x17 - 3))这个算出来是个很大的数,结果为:十进制为:1832085838499075985755083973639154607251969422303166464十六进制为:0x1320bc0000000000000000000000000000000000000000在比特币系统中,难度值越小,挖矿难度就越大,因为哈希值可落的范围会越小;反之难度值越大,挖矿难度就越小。难度值调整比特币系统中,难度值是系统动态调整的,目的是使整个系统平均10分钟出一个块。为什么调整难度值随着挖矿设备的进化升级,系统的总算力会越来越强,如果难度值保持不变的话,出块时间会越来越短,一方面是提高了对系统的响应时间和效率的考验,另一个方面是出块时间缩短后在同一时间将会产生多个区块,必然会导致区块链形成多分叉,这样就导致系统的总算力分散到各个分叉链中了,这时系统的安全性大幅度降低,黑客可以集中算力进行分叉攻击等攻击行为。因此,比特币系统需要调整难度值。难度值调整规则目标是:系统平均每10分钟产生一个区块。调整的周期是:每2016个区块产生后会调整一次(大约2周14天)调整的计算公式是:新难度值 = 旧难度值 * (最近2016个区块的真正时间 / 最近2016个区块的预期时间)最近2016个区块的预期时间,当然是:2016 * 10min。从上面公式可以得出,最近2016个区块的真正时间越小,说明系统中出块时间更短了(算力更强了),新难度值也就越小,所以挖矿难度就动态的提升了。但是为了防止难度变化的过快,调整的时候有个4倍的幅度限制,也就是若调整的幅度大于4倍了,就按4倍调整。难度调整源码通过源码可以更好的理解难度调整,如下所示:unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast)

{

const unsigned int nTargetTimespan = 14 * 24 * 60 * 60; // two weeks

const unsigned int nTargetSpacing = 10 * 60;

const unsigned int nInterval = nTargetTimespan / nTargetSpacing;

// Genesis block

if (pindexLast == NULL)

return bnProofOfWorkLimit.GetCompact();

// Only change once per interval

if ((pindexLast->nHeight+1) % nInterval != 0)

return pindexLast->nBits;

// Go back by what we want to be 14 days worth of blocks

const CBlockIndex* pindexFirst = pindexLast;

for (int i = 0; pindexFirst && i < nInterval-1; i++)

pindexFirst = pindexFirst->pprev;

assert(pindexFirst);

// Limit adjustment step

unsigned int nActualTimespan = pindexLast->nTime - pindexFirst->nTime;

printf(" nActualTimespan = %d before bounds\n", nActualTimespan);

if (nActualTimespan < nTargetTimespan/4)

nActualTimespan = nTargetTimespan/4;

if (nActualTimespan > nTargetTimespan*4)

nActualTimespan = nTargetTimespan*4;

// Retarget

CBigNum bnNew;

bnNew.SetCompact(pindexLast->nBits);

bnNew *= nActualTimespan;

bnNew /= nTargetTimespan;

if (bnNew > bnProofOfWorkLimit)

bnNew = bnProofOfWorkLimit;

/// debug print

printf("\n\n\nGetNextWorkRequired RETARGET *****\n");

printf("nTargetTimespan = %d nActualTimespan = %d\n", nTargetTimespan, nActualTimespan);

printf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString().c_str());

printf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString().c_str());

return bnNew.GetCompact();

}

全网难度走势图来源:Difficulty - BTC.com从上图可看到,从2018年开始挖矿难度一路上升,在2018年10月-12月有一小段下坡,总体来说挖矿难度是越来越大,这跟挖矿设备越来越先进相关,同时比特币价格的猛涨也让更多的人参与到挖矿中了。发布于 2020-04-09 22:44比特币 (Bitcoin)区块链技术区块链(Blockchain)​赞同 8​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录区块链技术详解区块链技术深

什么是比特币的难度调整机制? - 知乎

什么是比特币的难度调整机制? - 知乎切换模式写文章登录/注册什么是比特币的难度调整机制?辉神gzqh5588专注于数字货币区块链合约技术面走势分析比特币的挖矿难度是如何调整的?难度调整会带来哪些影响?3月12日的市场暴跌,把比特币砸到了四千美元以下,同时也引发了“矿难”:蚂蚁S9、阿瓦隆A851等老矿机纷纷关机,比特币全网算力(七天平均)从暴跌前的116EHs下跌至最低点94EHs。随后几天发生的比特币挖矿难度调整,难度下调了15.95%,这是比特币历史上的第二大调整幅度。很多人有疑问,想知道比特币的难度调整机制是如何运转的?对矿工而言,有哪些影响?1、什么是比特币的难度调整机制?北京时间5月12日凌晨3点23分,比特币达到63万区块高度,比特币区块奖励顺利减半。其实,“比特币每四年减半”的说法并不准确,因为减半时间是根据区块高度来决定的:比特币每21万区块经历一次区块奖励减半。所以,比特币的第一次区块奖励减半发生在区块高度21万,第二次发生在区块高度42万,今年5月份的史上第三次减半发生在区块高度63万。那为什么大家常说“每四年减半”呢?因为比特币平均每10分钟出一个区块,21万个区块大约需要4年时间:210000 ÷(365x24x6)≈ 4那么,比特币如何保证平均每10分钟出一个区块的呢?这就要归功于难度调整机制了。比特币系统规定,每2016个区块调整一次挖矿难度系数。如果还是按照平均每10分钟一个区块,一小时平均6个区块计算,比特币大概是每14天调整一次挖矿难度系数。2016 ÷(24x6)= 14那么,这个挖矿难度系数如何调整呢?下一周期(2016个区块)的难度系数,取决于当前周期内2016个区块所花的时间。如果这个时间正好等于20160分钟(按照10分钟一个区块,2016个区块的出块时间期望值),则下一周期难度系数保持不变;如果大于20160分钟,则按比例下调,但最多下调75%;如果小于20160分钟,则难度按比例增加,但最大不能超过4倍。依据的公式如下:下一周期的难度系数=当前周期的难度系数 * (20160分钟÷当前周期2016个区块的实际出块时间)举个例子,如果当前周期的难度系数是15T,2016个区块的实际出块时间是10080分钟,那么下一个周期的难度系数就是30T:下一周期的难度系数 = 15T *(20160 ÷ 10080)= 30T2、难度调整机制对挖矿的影响由于比特币是每2016个区块调整一次难度系数,所以比特币的挖矿难度滞后于实际的算力变化。举个例子,3月12日比特币暴跌后,一些老矿机比如蚂蚁S9陆陆续续关机下架,全网算力开始下跌,但3月9日~3月26日(区块高度620928~622943)这一周期内的挖矿难度一直是 16.55T。在挖矿难度维持不变的一个周期内,如果BTC的价格下跌,挖矿的理论收益就会减少,一些机枪池会立马把一部分算力切换到相同算法但挖矿收益更高的币种去(比如BCH、BSV)。如果挖矿难度不变,但币价上涨,一些机枪池又会把算力切过来。机枪池的存在,会把BTC、BCH、BSV的挖矿收益差距逐渐抹平。比特币的挖矿难度也是一个风向标。在难度小或者持续下跌的时候,说明全网算力在下降,整个挖矿行业在变冷;挖矿难度大或者持续上升的时候,说明有更多的矿机上架运行,市场信心十足,整个挖矿行业在回暖。对于想要入场挖矿的矿工而言,由于挖矿难度、全网算力、币价这三个因素是动态变化的,所以在决定入场时间时,不妨关注下挖矿收益这个参数。▲ BTC、BCH近两年的挖矿收益走势图长远来看,挖矿行业会趋于完全竞争的成熟市场,挖矿收益也会逐渐下降,但目前挖矿行业距离成熟市场还很远,依旧有利可图。3、小结比特币每2016个区块调整一次挖矿难度,调整的幅度是这2016个区块的实际出块时间与理论时间20160分钟的比值。因为难度调整机制的存在,才使得比特币能维持平均每10分钟出一个区块。比特币的难度调整滞后于实际算力的变化,但由于机枪池的存在,BTC、BCH、BSV的挖矿收益会趋于一致。目前,挖矿行业还远未成熟,挖矿依然有利可图。发布于 2020-06-16 16:13btc挖矿虚拟货币比特币矿池​赞同 3​​1 条评论​分享​喜欢​收藏​申请

一文读懂比特币挖矿难度调整 | CoinVoice

一文读懂比特币挖矿难度调整 | CoinVoice

风险提示:请理性看待区块链,树立正确的货币观念和投资理念,不要盲目跟风投资,本站内容不构成投资建议,请谨慎对待。

免责声明:本站所发布文章仅代表个人观点,与CoinVoice官方立场无关

AC Capital

链声实验室

|

寻求报道

|

App下载

Toggle navigation

首页

快讯

专栏

所有专栏

申请入驻专栏

活动

专题

独角兽

微信扫一扫

下载APP

登录

Toggle navigation

立即登录

首页

快讯

专栏

所有专栏

申请入驻专栏

活动

专题

独角兽

×

欢迎登录COINVOICE

请输入正确的手机号

密码必须包含大小写字母,包含数字,包含8-32个字符

>> 按住滑块,拖拽到最右边

忘记密码

登录

×

注册

使用已有账号登录

请输入正确的手机号

发送验证码 请输入正确的验证码

密码必须包含大小写字母,包含数字,包含8-32个字符

重复密码不一致

为了您的账户安全,密码必须

包含大写字母,包含小写字母,包含数字,包含8-32个字符

我已阅读并同意《COINVOICE服务条款》和 隐私政策

注册

×

重置密码

请输入正确的手机号

发送验证码 请输入正确的验证码

密码必须包含大小写字母,包含数字,包含8-32个字符

重复密码不一致

为了您的账户安全,密码必须

包含大写字母,包含小写字母,包含数字,包含8-32个字符

重置

一文读懂比特币挖矿难度调整

加密谷Live

2021年01月09日

分享

本文来自

加密谷Live,

经作者 加密谷Live 授权转载。

自 2009 年 1 月比特币诞生到 2020 年 11 月,已经有 250 次难度增加,只有 53 次难度降低。

作者:Samantha Ouyang 翻译 / 编辑:Sherrie

当我第一次了解比特币挖矿的时候,我认为它很简单,就像坐在家里,做着我想做的事情,而我的电脑会投入工作,在我睡觉的时候赚钱。

但不完全是。事实证明,还有很多原因使得上述情况完全不可能发生。

但为了理解其中的原因,我们首先必须理解挖矿的整个概念,以及它在加密货币方面的意义。

挖矿是什么?

从本质上讲,挖矿就是创建新的区块,用交易记录填充它们,并将它们添加到区块链中,让每个人都能看到,并就特定的货币是如何使用的这件事达成一致。

然而,为了添加一个区块,矿工必须解决一个「加密谜题」,或者用更专业的术语来说,他们必须得到一个有效的块 Hash。

我不会讲太多的 Hash 函数相关的知识,但简单地说,Hash 是拿到区块的所有信息,然后把它处理,直到它返回一个与此前内容没有任何关系的随机的字母和数字 64 位十六进制数。

如果你改变了区块上的任何数据,随机数将会有很大的不同,但如果什么都没有改变,它将总是返回相同的内容。

但是如何知道 Hash 值是否有效呢?这就是难度目标的由来。目标描述一个阈值,并且要使 Hash 有效,该值必须小于目标。

你可能会问,如果不能更改交易信息,如何获得不同的 Hash 值呢?在创建 Hash 时,区块中还有另一个因素要考虑进去——你可以修改它,它被称为 nonce。

资料来源:Khaled Salah

矿工们一直在为了这个数字努力,直到输出的 Hash 值小于目标值。因为 Hash 值是随机的,所以目标越低,就越难找到一个有效的 Hash 值。就像掷骰子一样,掷一个小于 3 的数字比掷一个小于 4 的数字更难。

那么你如何确定目标的价值呢?这个问题的答案就是我们今天要讨论的话题:挖矿难度。

什么是挖矿难度?

这是不言自明的,但是挖矿的难度仅仅是指为区块找到一个有效的 Hash 值有多么困难和耗时。一个更好的问题应该是,为什么挖矿一开始就需要有难度 ?

区块链的全部意义在于在网络中的多个个体之间建立共识,也就是说在一个真理上达成一致。它们是如何做到这一点的呢?它们取网络中最长的有效链,这取决于向它投入了多少工作(计算 Hash 值所花费的时间),并接受它作为构建的主链。

有了这个难度 ,就可以确保网络的安全性,因为它可以防止欺诈。如果添加区块很容易,那么有人可能会发送欺诈性交易,然后向网络发送垃圾邮件,以创建他们自己的最长链。然而,由于挖矿困难,为了防止垃圾信息,添加块的过程变慢,平均需要 10 分钟来挖掘一个块。

这里的棘手之处在于,攻击者可以通过寻找增加计算能力的方法轻松绕过这一困难。幸运的是,我们提前想好了,想出了一种方法让系统控制困难。

挖矿难度如何确定?

定期调整难度,以确保总是平均需要 10 分钟来挖掘一个区块。在每添加 2016 个区块后,系统会查看创建这些 2016 个区块所花的时间。正常情况下,需要 2 周左右,或 20160 分钟。如果超过两周,难度就会降低,如果不到两周,难度就会增加。难度可以如下确定。

推导出新难度的公式

正如你可以从反比函数中看到的,如果花费的时间超过 2 周,分数将小于 1,新难度将会减少。如果花的时间超过 2 周,分数就会大于 1,新的难度就会增加。

如果难度降低,目标值就会增加,从而更容易找到有效的散列,反之亦然。最大目标值为 1,由此可见难度也与目标值成反比。

难度与目标的关系

为了防止突然的变化,难度的增加或减少不能在一次调整中超过 4 倍。

但回到我们如何想出目标的问题上,我们需要探索影响挖掘区块所需时间的不同因素。

有两件事可能会影响这段时间:计算能力和网络中个体的数量。

计算能力

在比特币的早期,你可能已经能够成功地进行挖矿,就像我过去认为的人们所做的那样——用他们的个人电脑。然而,矿工很快被迫升级。

由于挖矿本质上是一场竞赛,人们竞相首先找到 Hash 值并获得奖励,那些拥有更强大计算机的人将能够在同一时间内做出更多计算结果,因此获胜的机会也会更高。

升级一开始只是简单的从 CPU 到显卡的转换,但近年来,升级的幅度要大得多,现在所谓的 ASIC(特定应用集成电路)--一种专门为挖矿而设计的器件--已经是能够参与竞争所需的最低限度。

但即便如此,你也不太可能赚到任何东西。目前,你可能需要 40 年才可以开采一个区块。如果你想赚钱,你可能必须加入一个矿池——矿工们联合起来增加他们获胜的可能性。

考虑到所有这些进步和计算机不断变得越来越快的事实,为了跟上它们并保持 10 分钟的平均速度,挖矿难度必须补偿这一点。

网络的规模

等等,但我们并不是每两周就有更快的电脑,对吧?虽然计算机的不断改进是需要调整机制的主要原因,但该系统也对网络中的个体数量进行了补偿。

矿工越多,找到一个有效 Hash 值所花的时间就越少,因为在相同的时间内会进行更多的计算结果。因此,当有更多矿工在场时,困难增加,当矿工更少时,困难减少。

总结

所以回到我们一开始的地方--在今天这个时代,用你的 PC 挖比特币几乎是不可能的,原因是由于设备升级和网络规模增大所做的补偿,导致挖矿难度不断增加。你的 PC 根本没有计算能力再跟上其他人的脚步,所以你能够成功挖出一个区块的几率非常非常低。

即使系统的设计是为了降低难度,但很少会这样做。更快、更强大的设备不断被开发出来,同时越来越多的人加入了比特币网络。事实上,自 2009 年 1 月比特币诞生到 2020 年 11 月,已经有 250 次难度增加,只有 53 次难度降低。

声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。

来源:加密谷Live

#比特币

#区块链

#矿工

评论0条

加密谷Live

简介:分享区块链领域专业、前沿、有趣的内容

作者文章

新兴公链 Fantom:从数据角度来看 Fantom 暴涨之因

「边玩边赚」是游戏业的下一个大事件?

Layer 2 时代:照亮 Play to Earn 游戏的前路

解析 DID 去中心化身份:寻求解决的挑战有哪些?前景如何?

查看更多

专栏

更多>>

链上追踪:洗币手法科普之波场 TRON

TRON 上没有混币器,黑客又是如何洗币?

RenrenBit 第二季度安全与隐私建设工作通过慢雾科技安全审计

慢雾科技完成对RenrenBit 第二季度安全与隐私建设工作的安全审计,整体安全建设工作为“优秀”

数据:中心化交易所比特币余额正在耗尽,过去4个月100亿美元比特币流出

越来越多人开始选择囤币了。

2021开年,英国启动两项“最严”加密货币政策

2021开年,英国启动两项“严苛”加密货币政策。

imToken 推出独立去中心化交易所 Tokenlon

去中心化钱包 imToken 宣布其内置交易平台 Tokenlon 升级为独立的去中心化交易所。Tokenlon 基于 0x 协议开发,采用创新机制打造的新版去中心化交易所,区别于过去 imToken 直接集成 Kyber 协议的做法。据官方公告显示,Tokenlon 在 Beta 阶段交易 ...

DeFi | 如何设置一个 AAVE 的清算机器人?

AAVE 是一个 DeFi 去中心化贷款协议,人们可以使用多种加密资产作为抵押,向其申请贷款。目前能够作为抵押资产的加密资产包括 ETH、DAI、USDT、LINK 等十几种。作为一个贷款协议,系统本身运行健康与否很大程度上取决于使用该协议进行的各种贷款是否健康。当所有的借款人都有足够的抵押品抵 ...

IOTA 推出去中心化交易验证机制 促成其代币价格上涨

据外媒报道,物联网区块链网络 IOTA 已经完成了进一步分散其交易验证的准备工作。根据该公司发布的新闻稿和博客文章,其协调机制现在将向一个名为“Coordicide”的新工具提供帮助。Coordicide 将管理交易安全性,确保交易处理过程和相同的资金不会被花费两次。据执行人员说,这一举 ...

为什么扎克伯格和多尔西都开始青睐区块链技术?

现在的科技巨头,在自互联网出现成为了社会主导者后,首次发现他们“集中化”的模式已经遇到了瓶颈。

波场天赋神权即将来袭

人生就像是一场赛跑,选择赛道永远比努力奔跑更重要。因为一旦做错一个选择,费尽力气奔跑也是徒劳,而且还有...

Gacube官网开启全球IDO,不容错过的机会

这波牛市,DeFi与NFT爆发前发生曾发生过大量融资,此后便出现的DeFi Summer与NFT Au...

关注金融科技新变量

关于我们

商务合作

关于我们

加入我们

免责声明

联系我们

邮箱

coinvoice@163.com

微信

VOICE-V

关注我们

微信公众号

扫码关注

CoinVoice

Copyright © 2020 CoinVoice. 沪ICP备18017380号-1

关注金融科技新变量,提供优质、原创、深度的新金融科技资讯,传递新金融科技价值,致力于服务全球金融科技创新者。

风险提示:本站所发布文章仅代表个人观点,与CoinVoice官方立场无关,请理性看待区块链,树立正确的投资理念,增强反诈意识,不要盲目跟风投资,本站内容不构成投资建议,请谨慎对待。

关注金融科技新变量

下载App

[比特币]比特币中的挖矿难度 - 落雷 - 博客园

[比特币]比特币中的挖矿难度 - 落雷 - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

落雷

博客园

首页

新随笔

联系

订阅

管理

[比特币]比特币中的挖矿难度

挖矿难度

\[H(version,target,nonce,Hash_{pre},MerkleTreeRoot) <= target

\]比特币中使用的Hash算法是SHA-256,产生的Hash值是256位。即整个输出空间是\(2^{256}\)。比特币的挖矿难度的调整,就是调整目标空间占输出空间的比例,通俗来讲就是Hash值前面要有多少个0。比如对于256位的Hash值,要称为合法的区块,要求算出来的Hash值前面至少有70个0。

挖矿的难度跟目标阈值成反比,即目标阈值越大,挖矿难度越小。

那么为什么要调整挖矿难度呢?如果不调整挖矿难度会有什么问题?

随着系统中的总算力越来越强,如果不调整挖矿难度,那么出块时间会越来越短。假如不到一秒就出一个块,但区块在网络上传播的时间可能就需要几十秒。别的节点在没有收到这个块之前还会继续沿着已有的区块链往下扩展。如果有两个节点同时发布一个区块,这时就会出现分叉。

出块时间越短,分叉越容易出现,不仅会出现二分叉,还会出现更多的分叉。假如同时有10个块被挖出,那么系统可能会出现10分叉。

分叉过多,对于系统达成共识没有任何好处,而且还会威胁到系统的安全性。比特币协议是假设大部分算力是掌握在诚实的矿工手里,这种情况下,系统中总算力越强,系统安全性就越高。因为系统总算力越强,恶意节点想掌握51%算力就越困难。

出块过快,不可避免的会出现分叉。分叉过多会导致算力分散,此时恶意节点发动攻击成功的概率就很大,因为并不需要掌控51%的算力,甚至可能10%的算力就可以发动攻击。

比特币中出块时间大约为10min。那么10min的出块时间是不是最优的?答案是不一定,改成其它值也可以,间隔只是说应该有个常数范围。例如以太坊的出块时间在15s左右。

如何调整挖矿难度

在比特币协议中规定,没2016个区块后就要调整目标阈值,大概是每两星期调整一次,公式如下:

difficulty = difficulty_1_target/target

difficulty_1_target指挖矿难度为1时的目标阈值,此时挖矿难度为1,target是个非常大的数。

\[target = target * (actual \quad time/expected \quad time)

\]

actual time指产生2016个区块实际用时,expected time指产生2016个区块应该花费的时间,即 2016 * 10min

从上面的公式可以看出,如果平均出块时间大于10min,则target值会相应增大,挖矿难度则会相应减小。

实际上,上调和下调都有四倍的限制,即实际时间超过8个星期,也只能按4倍算,目标阈值增大最多只能增大4倍。

目标阈值如何同步

计算target的方法是写在比特币系统的源码里面,每生成2016个区块,系统就会自动进行调整。

那如果有恶意节点故意不调呢?

nBits是target编码后的版本,在blocke header里没有直接存储target的域。因为target的域是256位,直接存储的话要32个字节,nBits只有4个字节,所以可以认为nBits是target编码后的。

如果有恶意节点在该调的时候不调,它生成的区块在发布到网络上时,其它节点会先检查该区块的合法性。检查的内容就包括nBits,检查不通过,其它节点就不会接受该区块。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

posted @

2020-08-28 10:24 

落雷 

阅读(654) 

评论(0) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

公告

Copyright © 2024 落雷

Powered by .NET 8.0 on Kubernetes

BTC-6-挖矿难度调整 - YuChen-zeta - 博客园

BTC-6-挖矿难度调整 - YuChen-zeta - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

YuChen-zeta

博客园

首页

新随笔

联系

订阅

管理

BTC-6-挖矿难度调整

Difficulty, target and nBits.

之前有提到比特币系统中,区块链的出块时间保持在平均10min。可见随系统算力的变化,挖矿的难度需要相应调整。

挖矿难度调整原因

挖矿的本质就是不断调整nonce,使block header的哈希值小于等于目标阈值。

即 H(block header) ≤ target(目标阈值),目标阈值越小,挖矿难度越大。调整挖矿的难度就是调整目标空间在整个输出空间中所占的比例。

挖矿难度和目标阈值成反比,difficulty = difficulty_1_target / target,其中difficulty_1_target为挖矿难度为1时的target,即最小挖矿难度,是个非常大的数

比特币用的哈希算法是SHA-256,产生的哈希值是256位的,所以整个输出空间为2^256,调整目标空间所占比例,通俗的说,就是要求哈希值前面要有多少个0.

如果不调整挖矿难度,会有什么问题?

系统总算力越来越强,挖矿难度不变的话,出块时间会越来越短。

出块时间越来越短,会有什么问题?

出块时间变短,交易可以更快被写入区块链,提高了系统效率。

上一节中说到区块在比特币网络上传播时间比较慢,可能需要几十秒才能使全网大部分节点收到,这时若出块时间很快,比如不到一秒就出一个区块,别的区块没有收到之前还是会延原来区块链继续扩展。这样出现分叉会成为常态,不仅会出现二分叉,可能会出现很多的分叉。分叉过多对系统达成共识是没有好处的,而且造成算力分散,使攻击者发动分叉攻击的成本大大降低(不用掌握51%的算力就有较大几率发动攻击)

10分钟的出块时间是最优的吗?

显然不是的,目前好像没有文章专门研究出块时间并取得较为理想的结果的,但可以确定的是,出块时间需要维持在一个常数范围内。

以太坊系统中出块时间就降低到了15s,(在此稍作介绍,后续文章会介绍以太坊),时间大幅降低后,由以上分析得系统的安全性得不到保证,所以以太坊就要设计新的共识协议Ghost,在该协议中,被丢弃的orphan block就不能简单废除掉了,而是也要给他们一些奖励,叫uncle reward.以太坊中也要调整挖矿难度,使出块时间保持在15s

BTC中如何调整挖矿难度

比特币协议中规定,每2016个区块就要调整目标阈值,按10min的平均出块时间来计算,大概是14天(两周)调整一次目标阈值。

调整公式:target = target * actual time / expected time

actual time指产生2016个区块实际花费的时间,expected time指产生2016个区块应该花费的时间,即2016x10min

实际上,上调和下调都有四倍的限制,假如实际时间超过了8个星期,计算公式也只能按8个星期算,少于0.5个星期也一样。

如何让所有矿工同时调整目标阈值呢?

计算target的算法写在比特币系统的代码里,每挖到2016个区块会自动进行调整。

如果有恶意节点故意不调整,会怎么样?

不调整目标阈值的节点发布的区块,诚实节点是不会认的。

block header中有一个nBits的域,nBits是target的一个编码版本,block header中没有直接存储target,因为target为256位,直接存需要32个字节,nBits为32位,只占4个字节,可以认为它是一种压缩编码。

其他节点收到恶意节点未调整目标阈值的区块时,在独立验证区块合法性的时候会对nBits域进行检查,不合法的话就不会被认可。

本系列文章为个人学习笔记,文章的所有内容均不构成任何投资比特币或其他数字货币的意见和建议,也不赞成个人炒作任何数字货币!

posted @

2021-02-01 06:06 

YuChen-zeta 

阅读(375) 

评论(0) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

公告

Copyright © 2024 YuChen-zeta

Powered by .NET 8.0 on Kubernetes

NiceHash - Leading Cryptocurrency Platform for Mining and Trading

NiceHash - Leading Cryptocurrency Platform for Mining and Trading

We're sorry but client doesn't work properly without JavaScript enabled. Please enable it to continue.

挖矿原理 - 廖雪峰的官方网站

挖矿原理 - 廖雪峰的官方网站

Index

廖雪峰的官方网站

Blog

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

More

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

 

Profile

Passkey

Sign Out

Sign In

English

简体中文

Index

区块链教程

比特币

区块链原理

P2P交易原理

私钥

公钥和地址

签名

挖矿原理

可编程支付原理

多重签名

UTXO模型

Segwit地址

HD钱包

钱包层级

助记词

地址监控

以太坊

账户

区块结构

交易

智能合约

编写合约

部署合约

调用合约

编写Dapp

常用合约

ERC20

Wrapped Ether

关注公众号不定期领红包:

加入知识星球社群:

关注微博获取实时动态:

挖矿原理

Last updated: ...

/

Reads: 3275971

Edit

在比特币的P2P网络中,有一类节点,它们时刻不停地进行计算,试图把新的交易打包成新的区块并附加到区块链上,这类节点就是矿工。因为每打包一个新的区块,打包该区块的矿工就可以获得一笔比特币作为奖励。所以,打包新区块就被称为挖矿。

比特币的挖矿原理就是一种工作量证明机制。工作量证明POW是英文Proof of Work的缩写。

在讨论POW之前,我们先思考一个问题:在一个新区块中,凭什么是小明得到50个币的奖励,而不是小红或者小军?

当小明成功地打包了一个区块后,除了用户的交易,小明会在第一笔交易记录里写上一笔“挖矿”奖励的交易,从而给自己的地址添加50个比特币。为什么比特币的P2P网络会承认小明打包的区块,并且认可小明得到的区块奖励呢?

因为比特币的挖矿使用了工作量证明机制,小明的区块被认可,是因为他在打包区块的时候,做了一定的工作,而P2P网络的其他节点可以验证小明的工作量。

工作量证明

什么是工作量证明?工作量证明是指,证明自己做了一定的工作量。例如,在驾校学习了50个小时。而其他人可以简单地验证该工作量。例如,出示驾照,表示自己确实在驾校学习了一段时间:

比特币的工作量证明需要归结为计算机计算,也就是数学问题。如何构造一个数学问题来实现工作量证明?我们来看一个简单的例子。

假设某个学校的一个班里,只有一个女生叫小红,其他都是男生。每个男生都想约小红看电影,但是,能实现愿望的只能有一个男生。

到底选哪个男生呢?本着公平原则,小红需要考察每个男生的诚意,考察的方法是,出一道数学题,比如说解方程,谁第一个解出这个方程,谁就有资格陪小红看电影:

因为解高次方程没有固定的公式,需要进行大量的计算,才能算出正确的结果,这个计算过程就需要一定的工作量。假设小明率先计算出了结果x=2.5,小红可以简单地验证这个结果是否正确:

可以看出,解方程很困难,但是,验证结果却比较简单。所以,一个有效的工作量证明在于:计算过程非常复杂,需要消耗一定的时间,但是,验证过程相对简单,几乎可以瞬间完成。

现在出现了另一个问题:如果其他人偷看了小明的答案并且抢答了怎么办?

要解决这个问题也很容易,小红可以按照男生的编号,给不同的男生发送不同的方程,方程的第一项的系数就是编号。这样,每个人要解的方程都是不一样的。小明解出的x=2.5对于小军来说是无效的,因为小军的编号是3,用小明的结果验证小军的方程是无法通过验证的。

事实上如果某个方程被验证通过了,小红可以直接从方程的第一项系数得知是谁解出的方程。所以,窃取别人的工作量证明的结果是没有用的。

通过工作量证明,可以有效地验证每个人确实都必须花费一定时间做了计算。

在比特币网络中,矿工的挖矿也是一种工作量证明,但是,不能用解多项式方程来实现,因为解多项式方程对人来说很难计算,对计算机来说非常容易,可以在1秒钟以内完成。

要让计算机实现工作量证明,必须找到一种工作量算法,让计算机无法在短时间内算出来。这种算法就是哈希算法。

通过改变区块头部的一个nonce字段的值,计算机可以计算出不同的区块哈希值:

直到计算出某个特定的哈希值的时候,计算结束。这个哈希和其他的哈希相比,它的特点是前面有好几个0:

hash256(block data, nonce=0) = 291656f37cdcf493c4bb7b926e46fee5c14f9b76aff28f9d00f5cca0e54f376f

hash256(block data, nonce=1) = f7b2c15c4de7f482edee9e8db7287a6c5def1c99354108ef33947f34d891ea8d

hash256(block data, nonce=2) = b6eebc5faa4c44d9f5232631f39ddf4211443d819208da110229b644d2a99e12

hash256(block data, nonce=3) = 00aeaaf01166a93a2217fe01021395b066dd3a81daffcd16626c308c644c5246

hash256(block data, nonce=4) = 26d33671119c9180594a91a2f1f0eb08bdd0b595e3724050acb68703dc99f9b5

hash256(block data, nonce=5) = 4e8a3dcab619a7ce5c68e8f4abdc49f98de1a71e58f0ce9a0d95e024cce7c81a

hash256(block data, nonce=6) = 185f634d50b17eba93b260a911ba6dbe9427b72f74f8248774930c0d8588c193

hash256(block data, nonce=7) = 09b19f3d32e3e5771bddc5f0e1ee3c1bac1ba4a85e7b2cc30833a120e41272ed

...

hash256(block data, nonce=124709132) = 00000000fba7277ef31c8ecd1f3fef071cf993485fe5eab08e4f7647f47be95c

比特币挖矿的工作量证明原理就是,不断尝试计算区块的哈希,直到计算出一个特定的哈希值,它比难度值要小。

比特币使用的SHA-256算法可以看作对随机输入产生随机输出,例如,我们对字符串Hello再加上一个数字计算两次SHA-256,根据数字的不同,得到的哈希是完全无规律的256位随机数:

hash256("Hello?") = ????????????????????????????????????????????????????????????????

大约计算16次,我们可以在得到的哈希中找到首位是0的哈希值,因为首位是0出现的概率是1/16:

hash256("Hello1") = ffb7a43d629d363026b3309586233ab7ffc1054c4f56f43a92f0054870e7ddc9

hash256("Hello2") = e085bf19353eb3bd1021661a17cee97181b0b369d8e16c10ffb7b01287a77173

hash256("Hello3") = c5061965d37b8ed989529bf42eaf8a90c28fa00c3853c7eec586aa8b3922d404

hash256("Hello4") = 42c3104987afc18677179a4a1a984dbfc77e183b414bc6efb00c43b41b213537

hash256("Hello5") = 652dcd7b75d499bcdc61d0c4eda96012e3830557de01426da5b01e214b95cd7a

hash256("Hello6") = 4cc0fbe28abb820085f390d66880ece06297d74d13a6ddbbab3b664582a7a582

hash256("Hello7") = c3eef05b531b56e79ca38e5f46e6c04f21b0078212a1d8c3500aa38366d9786d

hash256("Hello8") = cf17d3f38036206cfce464cdcb44d9ccea3f005b7059cff1322c0dd8bf398830

hash256("Hello9") = 1f22981824c821d4e83246e71f207d0e49ad57755889874d43def42af693a077

hash256("Hello10") = 8a1e475d67cfbcea4bcf72d1eee65f15680515f65294c68b203725a9113fa6bf

hash256("Hello11") = 769987b3833f082e31476db0f645f60635fa774d2b92bf0bab00e0a539a2dede

hash256("Hello12") = c2acd1bb160b1d1e66d769a403e596b174ffab9a39aa7c44d1e670feaa67ab2d

hash256("Hello13") = dab8b9746f1c0bcf5750e0d878fc17940db446638a477070cf8dca8c3643618a

hash256("Hello14") = 51a575773fccbb5278929c08e788c1ce87e5f44ab356b8760776fd816357f6ff

hash256("Hello15") = 0442e1c38b810f5d3c022fc2820b1d7999149460b83dc680abdebc9c7bd65cae

如果我们要找出前两位是0的哈希值,理论上需要计算256次,因为00出现的概率是162=256,实际计算44次:

hash256("Hello44") = 00e477f95283a544ffac7a8efc7decb887f5c073e0f3b43b3797b5dafabb49b5

如果我们要找出前3位是0的哈希值,理论上需要计算163=4096次,实际计算6591次:

hash256("Hello6591") = 0008a883dacb7094d6da1a6cefc6e7cbc13635d024ac15152c4eadba7af8d11c

如果我们要找出前4位是0的哈希值,理论上需要计算164=6万5千多次,实际计算6万7千多次:

hash256("Hello67859") = 00002e4af0b80d706ae749d22247d91d9b1c2e91547d888e5e7a91bcc0982b87

如果我们要找出前5位是0的哈希值,理论上需要计算165=104万次,实际计算158万次:

hash256("Hello1580969") = 00000ca640d95329f965bde016b866e75a3e29e1971cf55ffd1344cdb457930e

如果我们要找出前6位是0的哈希值,理论上需要计算166=1677万次,实际计算1558万次:

hash256("Hello15583041") = 0000009becc5cf8c9e6ba81b1968575a1d15a93112d3bd67f4546f6172ef7e76

对于给定难度的SHA-256:假设我们用难度1表示必须算出首位1个0,难度2表示必须算出首位两个0,难度N表示必须算出首位N个0,那么,每增加一个难度,计算量将增加16倍。

对于比特币挖矿来说,就是先给定一个难度值,然后不断变换nonce,计算Block Hash,直到找到一个比给定难度值低的Block Hash,就算成功挖矿。

我们用简化的方法来说明难度,例如,必须计算出连续17个0开头的哈希值,矿工先确定Prev Hash,Merkle Hash,Timestamp,bits,然后,不断变化nonce来计算哈希,直到找出连续17个0开头的哈希值。我们可以大致推算一下,17个十六进制的0相当于计算了1617次,大约需要计算2.9万亿亿次。

17个0 = 1617 = 295147905179352825856 = 2.9万亿亿次

实际的难度是根据bits由一个公式计算出来,比特币协议要求计算出的区块的哈希值比难度值要小,这个区块才算有效:

Difficulty = 402937298

= 0x18 0455d2

= 0x0455d2 * 28 * (0x18 - 3)

= 106299667504289830835845558415962632664710558339861315584

= 0x00000000000000000455d2000000000000000000000000000000000000000000

注意,难度值的数值越小,说明哈希值前面的0越多,计算的难度越大。

比特币网络的难度是不断变化的,它的难度保证大约每10分钟产生一个区块,而难度值在每2015个区块调整一次:如果区块平均生成时间小于10分钟,说明全网算力增加,难度也会增加,如果区块平均生成时间大于10分钟,说明全网算力减少,难度也会减少。因此,难度随着全网算力的增减会动态调整。

比特币设计时本来打算每2016个区块调整一次难度,也就是两周一次,但是由于第一版代码的一个bug,实际调整周期是2015个区块。

根据比特币每个区块的难度值和产出时间,就可以推算出整个比特币网络的全网算力。

比特币网络的全网算力一直在迅速增加。目前,全网算力已经超过了100EH/每秒,也就是大约每秒钟计算1万亿亿次哈希:

所以比特币的工作量证明被通俗地称之为挖矿。在同一时间,所有矿工都在努力计算下一个区块的哈希。而挖矿难度取决于全网总算力的百分比。举个例子,假设小明拥有全网总算力的百分之一,那么他挖到下一个区块的可能性就是1%,或者说,每挖出100个区块,大约有1个就是小明挖的。

由于目前全网算力超过了100EH/s,而单机CPU算力不过几M,GPU算力也不过1G,所以,单机挖矿的成功率几乎等于0。比特币挖矿已经从早期的CPU、GPU发展到专用的ASIC芯片构建的矿池挖矿。

当某个矿工成功找到特定哈希的新区块后,他会立刻向全网广播该区块。其他矿工在收到新区块后,会对新区块进行验证,如果有效,就把它添加到区块链的尾部。同时说明,在本轮工作量证明的竞争中,这个矿工胜出,而其他矿工都失败了。失败的矿工会抛弃自己当前正在计算还没有算完的区块,转而开始计算下一个区块,进行下一轮工作量证明的竞争。

为什么区块可以安全广播?因为Merkle Hash锁定了该区块的所有交易,而该区块的第一个coinbase交易输出地址是该矿工地址。每个矿工在挖矿时产生的区块数据都是不同的,所以无法窃取别人的工作量。

比特币总量被限制为约2100万个比特币,初始挖矿奖励为每个区块50个比特币,以后每4年减半。

共识算法

如果两个矿工在同一时间各自找到了有效区块,注意,这两个区块是不同的,因为coinbase交易不同,所以Merkle Hash不同,区块哈希也不同。但它们只要符合难度值,就都是有效的。这个时候,网络上的其他矿工应该接收哪个区块并添加到区块链的末尾呢?答案是,都有可能。

通常,矿工接收先收到的有效区块,由于P2P网络广播的顺序是不确定的,不同的矿工先收到的区块是有可能的不同的。这个时候,我们说区块发生了分叉:

在分叉的情况下,有的矿工在绿色的分叉上继续挖矿,有的矿工在蓝色的分叉上继续挖矿:

但是最终,总有一个分叉首先挖到后续区块,这个时候,由于比特币网络采用最长分叉的共识算法,绿色分叉胜出,蓝色分叉被废弃,整个网络上的所有矿工又会继续在最长的链上继续挖矿。

由于区块链虽然最终会保持数据一致,但是,一个交易可能被打包到一个后续被孤立的区块中。所以,要确认一个交易被永久记录到区块链中,需要对交易进行确认。如果后续的区块被追加到区块链上,实际上就会对原有的交易进行确认,因为链越长,修改的难度越大。一般来说,经过6个区块确认的交易几乎是不可能被修改的。

小结

比特币挖矿是一种带经济激励的工作量证明机制;

工作量证明保证了修改区块链需要极高的成本,从而使得区块链的不可篡改特性得到保护;

比特币的网络安全实际上就是依靠强大的算力保障的。

Comments

Make a comment

Sign in to

make a comment

Index

区块链教程

比特币

区块链原理

P2P交易原理

私钥

公钥和地址

签名

挖矿原理

可编程支付原理

多重签名

UTXO模型

Segwit地址

HD钱包

钱包层级

助记词

地址监控

以太坊

账户

区块结构

交易

智能合约

编写合约

部署合约

调用合约

编写Dapp

常用合约

ERC20

Wrapped Ether

廖雪峰的官方网站

©Copyright 2019-2021

Powered by iTranswarp

Feedback

License

共识算法PoW之算力与挖矿难度 | 登链社区 | 区块链技术社区

共识算法PoW之算力与挖矿难度 | 登链社区 | 区块链技术社区

文章

问答

讲堂

专栏

集市

更多

提问

发表文章

活动

文档

招聘

发现

Toggle navigation

首页 (current)

文章

问答

讲堂

专栏

活动

招聘

文档

集市

搜索

登录/注册

共识算法PoW之算力与挖矿难度

开发者七哥

更新于 2018-12-04 10:13

阅读 10602

大家好,我是虞双齐,这篇文章是关于区块链共识算法系列课文章。上一篇文章《共识算法PoW之由来》中,我们讲解了工作量证明的基本原理,核心是采取穷举法暴力寻找出一个符合难度值的随机数。这篇文章讲解比特币算力,通过本节学习,你可以掌握算力概念并能理解算力引发的悲剧。

大家好,我是[虞双齐](https://learnblockchain.cn/people/43),这篇文章是关于区块链共识算法系列课文章。上一篇文章[《共识算法PoW之由来》](https://learnblockchain.cn/2018/12/02/pow-consensus/)中,我们讲解了工作量证明的基本原理,核心是采取穷举法暴力寻找出一个符合难度值的随机数。这篇文章讲解比特币算力,通过本节学习,你可以掌握算力概念并能理解算力引发的悲剧。

![](https://img.learnblockchain.cn/2019/12/15775418364496.jpg)

## 算力

比特币挖矿形同猜数字谜,矿工要找出一个随机数(Nonce)参与哈希运算[1]

```

Hash(Block+Nonce)

```

使得区块哈希值符合难度要求。 **算力**则指计算机每秒可执行哈希运算的次数,也称为哈希率(**hashrate**)。

![比特币算力](https://img.learnblockchain.cn/2019/12/15775419153149.jpg)

上图是当前比特币算力图表[2]。到2017年时,比特币挖矿所需算力疯涨。这与不断研发出的新型矿机投入市场有关——这些矿机利用新的技术,拥有更强的运算能力,即单位成本下的算力在快速增长,由此带来了整体算力的提升。

### 算力单位

算力每隔千位划为一个单位,最小单位 `H=1次`,其他分部是:

* 1 H/s = 每秒可执行一次哈希运算。

* 1 KH/s =每秒1,000哈希(一千次)。

* 1 MH/s =每秒1,000,000次哈希(百万次)。

* 1 GH/s =每秒1,000,000,000次哈希(十亿次)。

* 1 TH/s =每秒1,000,000,000,000次哈希(万亿次)。

* 1 PH/s =每秒1,000,000,000,000,000次哈希。

* 1 EH/s =每秒1,000,000,000,000,000,000次哈希。

如果不清楚单位简称,可以查看下面国际单位的前缀表[3]:

| Factor | Name | Symbol |

| --- | --- | --- |

| 10^24 | yotta | Y |

| 10^21 | zetta | Z |

| 10^18 | exa | E |

| 10^15 | peta | P |

| 10^12 | tera | T |

| 10^9 | giga | G |

| 10^6 | mega | M |

| 10^3 | kilo | k |

| 10^2 | hecto | h |

| 10^1 | deka | da |

## 挖矿难度计算

### 动态调整挖矿难度 Difficulty

![](https://img.learnblockchain.cn/2019/12/15775421859483.jpg)

上图红色线是比特币从上线到现在的难度值变化图表。可以看到难度一直在增大,难度越大意味着矿工找出那个随机数,所需要的时间也就越长。同时可以观察到难度值是周期性调整,这是因为比特币协议期望每十分钟出一个区块,2016个区块需要两周时间完成。每出2016个区块,全网节点自动根据前面2016个出块的出款时间调整难度值。如果用时超过两周,则降低难度,反之则增加难度。 以便维持一个区块是10分钟。更多图表数据可以到[bitcoinwisdom网站](https://bitcoinwisdom.com/bitcoin/difficulty)查看。

难度值代表着寻找随机数耗时程度,耗时越长意味着计算机所需要执行哈希计算的次数越多。一台普通笔记本电脑,每秒可以执行800次哈希运算,配置中端显卡可以算2000多次。

中本聪在自己电脑上挖出创世区块(比特币区块链的第一个区块)。原本中本聪设计的是一个公平的完全去中心化的一个数字货币系统,每个人都可以使用个人电脑进行挖矿(他也预料网络会出现挖矿的服务商(矿池))。然而,有利可图时大量新算力不断加入,矿工竞争激烈,使得单个矿工的挖矿成功率几乎为零。2011年起矿池出现,大量矿工纷纷加入矿池,以稳定收入,摊薄成本。大量算力融入,使得比特币挖矿难度越来越大。数字货币挖矿业形同军事竞备,挖矿设备不断更新迭代,不再遵循摩尔定律。 专业矿机专门针对哈希算法、散热、耗能进行优化,这脱离了比特币网络节点运行在成千上万的普通计算中并公平参与挖矿的初衷。矿池的算力占据,也使得比特币风险一直存在:51%算力攻击。

### 挖矿难度计算公式

需要多少算力才能找出一个随机数,由当前区块的挖矿难度决定,难度越大所需算力越多。但挖矿难度并不在区块信息中,只在网络节点中依据规则动态计算,公式如下:

$D = T_1/T $

T 字母是 Target 的缩写,D 字母是 DiFFiculty 缩写。$T_1$ 和 T 均是一个256位的大数字(big number),其中 $T_1$ 为一个非常大的常数 $2^{256-32}-1=2^224-1$ 。依据公式, T 越小,挖矿难度D 越大。

依据公式,当 T = 0 时, D 无穷大,标志着无法计算出结果。幸运的是,

T 不会为 0,最小值为 1,此时难度值最大,为 $2^{256-32}-1=2^224-1$。当

$T = T_1$ 时,难度值为最小值 1。

### 目标值 Target 与挖矿难度转换

为了方便人类直观估算难度,比特币协议将大数字 T 压缩为一个浮点数记录在区块头中,字段为`bits`。

如果一个区块目标值是 0x1b0404cb,则转化成 Target 值为 $$0x0404cb * 256^{0x1b-3}$$

T 使用类浮点数的一种压缩表示法[4]进行压缩,压缩计算过程如下:

1. 将数字转换为 256 进制。

2. 如果第一位数字大于 127(0x7f),则前面添加 0。

3. 压缩结果中的第一位存放该256进制数的位数。

4. 后面三个数存放该256进制数的前三位,如果不足三位,从后补零。

例如,将数字1000压缩,先转换为256进制数:$$1000=0x03 * 256^{2-1} + 0xe8 * 256^{1-1}$$ 结果为[0x03,0xe8]。第一个数未超过 0x7f,则不需填 0。但长度两位低于三位,在后面补零,最终表示为:0x0203e800。

又比如数字 $$2^{256-32}-1$$,转换为256进制为:

```

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

```

第一位数字 0xFF 大于 0x7f,故前面添加零后,变成:

```

00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

```

其长度等于 28+1=29 (0x1d),且长度超过三位,无需补零,则压缩结果为:0x1d00FFFF。因为压缩存储容量只有才4个字节,前两字节已经被长度和添加的 00 所占用,只剩下2个字节来存储数字,这样后面的26个 FF 值被丢弃。

如果我们将压缩结果 0x1d00FFFF 解压还会是原值吗? 实际上结果是: $$T=0x00FFFF × 256 ^{0x1b−3}$$ =

```

0x00000000FFFF0000000000000000000000000000000000000000000000000000

```

解压时这个数字被截断了,不再是原来的 $$2^{256-32}-1$$,比特币的 $$T_1$$ 值就是这个 0x1d00FFFF ,如果区块中 bits 为 0x1d00FFFF 则说明该区块挖矿难度为最小挖矿难度 1。

实际上,专业的矿池程序会保留被截断的FF:

```

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

```

称上面数字为矿池难度 1(pool diFFiculty 1)。因此根据公式,区块目标值为 0x1b0404cb 的挖矿难度在挖机上看到的是:

```

D = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF /

0x00000000000404CB000000000000000000000000000000000000000000000000

= 16307.669773817162 (pdiFF)

```

称为 pdiFF。但是一些比特币客户端可能无法精确到这么大,所以不保留尾部的FF:

```

0x00000000FFFFFF0000000000000000000000000000000000000000000000000000

```

此时,该挖矿难度为:

```

D = 0x00000000FFFF0000000000000000000000000000000000000000000000000000 /

0x00000000000404CB000000000000000000000000000000000000000000000000

= 16307.420938523983 (bdiFF)

```

称为 bidFF。

### 在哪可以查看当前比特币挖矿难度

你可以在一些提供服务的网站上查看图表数据,如:

* [https://bitcoinwisdom.com/bitcoin/diFFiculty](https://bitcoinwisdom.com/bitcoin/diFFiculty)

* [https://data.bitcoinity.org/bitcoin/diFFiculty/5y?t=l](https://data.bitcoinity.org/bitcoin/diFFiculty/5y?t=l)

* [https://btc.com/stats/diFF](https://btc.com/stats/diFF)

下图是写此文章时,比特币[区块 546336](https://btc.com/0000000000000000000d8FF2d0a2b90e2edf0ec7830ed7d5805e4d8a5cf4bd84) 的摘要。

### 根据难度值如何计算算力

现在我们知道挖矿难度是如何计算的,那么为了挖出一个区块,需要执行多次哈希运算才能找到随机数,使得区块的哈希值小于目标值呢?

前面已确定 $T_1=0x1d00FFFF$,解压为 $:0xFFFF × 2 ^ 208$ ,对于 难度 D 的目标值:

![](https://img.learnblockchain.cn/2019/12/15775432853883.jpg)

因此,挖出难度为 D 的区块预计需要计算的哈希次数为:

![](https://img.learnblockchain.cn/2019/12/15775433328614.jpg)

目前难度计算速度要求是在10分钟内找到,即在600秒内完全计算,意味着网络算力最低必须是:

![](https://img.learnblockchain.cn/2019/12/15775433599735.jpg)

依上计算,当 D=1 时,需要每秒计算7158278次哈希,即: 7.15 Mhahs/s。

### 目标值计算源代码

在调整难度时,调整的是目标值。目标值计算公式如下,但在实际计算时有些特别处理,将目标值控制在一定范围内。

```

新目标值= 当前目标值 * 实际2016个区块出块时间 / 理论2016个区块出块时间(2周)。

```

* 判断是否需要更新目标值( 2016的整数倍),如果不是则继续使用最后一个区块的目标值

* 计算前2016个区块出块用时

* 如果用时低于半周,则按半周计算。防止难度增加4倍以上。

* 如果用时高于8周,则按8周计算。防止难度降低到4倍以下。

* 用时乘以当前难度

* 再除以2周

* 如果超过最大难度限制,则按最大难度处理

计算过程,Go代码如下。点击[查看bticoin C++源码](https://github.com/bitcoin/bitcoin/blob/master/src/pow.cpp#L49)

```go

var (

bigOne = big.NewInt(1)

// 最大难度:00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,2^224,0x1d00FFFF

mainPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 224), bigOne)

powTargetTimespan = time.Hour * 24 * 14 // 两周

)

func CalculateNextWorkTarget(prev2016block, lastBlock Block) *big.Int {

// 如果新区块(+1)不是2016的整数倍,则不需要更新,仍然是最后一个区块的 bits

if (lastBlock.Head.Height+1)%2016 != 0 {

return CompactToBig(lastBlock.Head.Bits)

}

// 计算 2016个区块出块时间

actualTimespan := lastBlock.Head.Timestamp.Sub(prev2016block.Head.Timestamp)

if actualTimespan < powTargetTimespan/4 {

actualTimespan = powTargetTimespan / 4

} else if actualTimespan > powTargetTimespan*4 {

// 如果超过8周,则按8周计算

actualTimespan = powTargetTimespan * 4

}

lastTarget := CompactToBig(lastBlock.Head.Bits)

// 计算公式: target = lastTarget * actualTime / expectTime

newTarget := new(big.Int).Mul(lastTarget, big.NewInt(int64(actualTimespan.Seconds())))

newTarget.Div(newTarget, big.NewInt(int64(powTargetTimespan.Seconds())))

//超过最多难度,则重置

if newTarget.Cmp(mainPowLimit) > 0 {

newTarget.Set(mainPowLimit)

}

return newTarget

}

```

测试代码如下,计算的是对高度为[497951+1](https://btc.com/000000000000000000139d2fc37814f5efdc637a6c8e1b202f9ee12365b01403)出块时计算的新目标值。

```go

func TestGetTarget(t *testing.T) {

firstTime, _ := time.Parse("2006-01-02 15:04:05", "2017-11-25 03:53:16")

lastTime, _ := time.Parse("2006-01-02 15:04:05", "2017-12-07 00:22:42")

prevB := Block{Head: BlockHeader{Height: 497951, Bits: 0x1800d0f6, Timestamp: lastTime}}

prev2016B := Block{Head: BlockHeader{Height: 495936, Bits: 0x1800d0f6, Timestamp: firstTime}}

result := CalculateNextWorkTarget(prev2016B, prevB)

bits := BigToCompact(result)

if bits != 0x1800b0ed {

t.Fatalf("expect 0x1800b0ed,unexpected %x", bits)

}

}

```

* * *

1. 比特币哈希算法采用的是[SHA256](https://zh.wikipedia.org/wiki/SHA-2)进行[工作量证明](https://en.bitcoin.it/wiki/Proof_of_work)。

2. 在bitcoin[实时查看比特币算力](https://charts.bitcoin.com/btc/chart/hash-rate)。

3. [https://physics.nist.gov/cuu/Units/prefixes.html](https://physics.nist.gov/cuu/Units/prefixes.html)

4. [IEEE二进制浮点数算术标准(IEEE 754)](https://en.wikipedia.org/wiki/IEEE_754)

大家好,我是虞双齐,这篇文章是关于区块链共识算法系列课文章。上一篇文章《共识算法PoW之由来》中,我们讲解了工作量证明的基本原理,核心是采取穷举法暴力寻找出一个符合难度值的随机数。这篇文章讲解比特币算力,通过本节学习,你可以掌握算力概念并能理解算力引发的悲剧。

算力

比特币挖矿形同猜数字谜,矿工要找出一个随机数(Nonce)参与哈希运算[1]

Hash(Block+Nonce)

使得区块哈希值符合难度要求。 算力则指计算机每秒可执行哈希运算的次数,也称为哈希率(hashrate)。

上图是当前比特币算力图表[2]。到2017年时,比特币挖矿所需算力疯涨。这与不断研发出的新型矿机投入市场有关——这些矿机利用新的技术,拥有更强的运算能力,即单位成本下的算力在快速增长,由此带来了整体算力的提升。

算力单位

算力每隔千位划为一个单位,最小单位 H=1次,其他分部是:

1 H/s = 每秒可执行一次哈希运算。

1 KH/s =每秒1,000哈希(一千次)。

1 MH/s =每秒1,000,000次哈希(百万次)。

1 GH/s =每秒1,000,000,000次哈希(十亿次)。

1 TH/s =每秒1,000,000,000,000次哈希(万亿次)。

1 PH/s =每秒1,000,000,000,000,000次哈希。

1 EH/s =每秒1,000,000,000,000,000,000次哈希。

如果不清楚单位简称,可以查看下面国际单位的前缀表[3]:

Factor

Name

Symbol

10^24

yotta

Y

10^21

zetta

Z

10^18

exa

E

10^15

peta

P

10^12

tera

T

10^9

giga

G

10^6

mega

M

10^3

kilo

k

10^2

hecto

h

10^1

deka

da

挖矿难度计算

动态调整挖矿难度 Difficulty

上图红色线是比特币从上线到现在的难度值变化图表。可以看到难度一直在增大,难度越大意味着矿工找出那个随机数,所需要的时间也就越长。同时可以观察到难度值是周期性调整,这是因为比特币协议期望每十分钟出一个区块,2016个区块需要两周时间完成。每出2016个区块,全网节点自动根据前面2016个出块的出款时间调整难度值。如果用时超过两周,则降低难度,反之则增加难度。 以便维持一个区块是10分钟。更多图表数据可以到bitcoinwisdom网站查看。

难度值代表着寻找随机数耗时程度,耗时越长意味着计算机所需要执行哈希计算的次数越多。一台普通笔记本电脑,每秒可以执行800次哈希运算,配置中端显卡可以算2000多次。

中本聪在自己电脑上挖出创世区块(比特币区块链的第一个区块)。原本中本聪设计的是一个公平的完全去中心化的一个数字货币系统,每个人都可以使用个人电脑进行挖矿(他也预料网络会出现挖矿的服务商(矿池))。然而,有利可图时大量新算力不断加入,矿工竞争激烈,使得单个矿工的挖矿成功率几乎为零。2011年起矿池出现,大量矿工纷纷加入矿池,以稳定收入,摊薄成本。大量算力融入,使得比特币挖矿难度越来越大。数字货币挖矿业形同军事竞备,挖矿设备不断更新迭代,不再遵循摩尔定律。 专业矿机专门针对哈希算法、散热、耗能进行优化,这脱离了比特币网络节点运行在成千上万的普通计算中并公平参与挖矿的初衷。矿池的算力占据,也使得比特币风险一直存在:51%算力攻击。

挖矿难度计算公式

需要多少算力才能找出一个随机数,由当前区块的挖矿难度决定,难度越大所需算力越多。但挖矿难度并不在区块信息中,只在网络节点中依据规则动态计算,公式如下:

$D = T_1/T $

T 字母是 Target 的缩写,D 字母是 DiFFiculty 缩写。$T_1$ 和 T 均是一个256位的大数字(big number),其中 $T_1$ 为一个非常大的常数 $2^{256-32}-1=2^224-1$ 。依据公式, T 越小,挖矿难度D 越大。

依据公式,当 T = 0 时, D 无穷大,标志着无法计算出结果。幸运的是,

T 不会为 0,最小值为 1,此时难度值最大,为 $2^{256-32}-1=2^224-1$。当

$T = T_1$ 时,难度值为最小值 1。

目标值 Target 与挖矿难度转换

为了方便人类直观估算难度,比特币协议将大数字 T 压缩为一个浮点数记录在区块头中,字段为bits。

如果一个区块目标值是 0x1b0404cb,则转化成 Target 值为 $$0x0404cb * 256^{0x1b-3}$$

T 使用类浮点数的一种压缩表示法[4]进行压缩,压缩计算过程如下:

将数字转换为 256 进制。

如果第一位数字大于 127(0x7f),则前面添加 0。

压缩结果中的第一位存放该256进制数的位数。

后面三个数存放该256进制数的前三位,如果不足三位,从后补零。

例如,将数字1000压缩,先转换为256进制数:$$1000=0x03 256^{2-1} + 0xe8 256^{1-1}$$ 结果为[0x03,0xe8]。第一个数未超过 0x7f,则不需填 0。但长度两位低于三位,在后面补零,最终表示为:0x0203e800。

又比如数字 $$2^{256-32}-1$$,转换为256进制为:

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

第一位数字 0xFF 大于 0x7f,故前面添加零后,变成:

00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

其长度等于 28+1=29 (0x1d),且长度超过三位,无需补零,则压缩结果为:0x1d00FFFF。因为压缩存储容量只有才4个字节,前两字节已经被长度和添加的 00 所占用,只剩下2个字节来存储数字,这样后面的26个 FF 值被丢弃。

如果我们将压缩结果 0x1d00FFFF 解压还会是原值吗? 实际上结果是: $$T=0x00FFFF × 256 ^{0x1b−3}$$ =

0x00000000FFFF0000000000000000000000000000000000000000000000000000

解压时这个数字被截断了,不再是原来的 $$2^{256-32}-1$$,比特币的 $$T_1$$ 值就是这个 0x1d00FFFF ,如果区块中 bits 为 0x1d00FFFF 则说明该区块挖矿难度为最小挖矿难度 1。

实际上,专业的矿池程序会保留被截断的FF:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

称上面数字为矿池难度 1(pool diFFiculty 1)。因此根据公式,区块目标值为 0x1b0404cb 的挖矿难度在挖机上看到的是:

D = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF /

0x00000000000404CB000000000000000000000000000000000000000000000000

= 16307.669773817162 (pdiFF)

称为 pdiFF。但是一些比特币客户端可能无法精确到这么大,所以不保留尾部的FF:

0x00000000FFFFFF0000000000000000000000000000000000000000000000000000

此时,该挖矿难度为:

D = 0x00000000FFFF0000000000000000000000000000000000000000000000000000 /

0x00000000000404CB000000000000000000000000000000000000000000000000

= 16307.420938523983 (bdiFF)

称为 bidFF。

在哪可以查看当前比特币挖矿难度

你可以在一些提供服务的网站上查看图表数据,如:

https://bitcoinwisdom.com/bitcoin/diFFiculty

https://data.bitcoinity.org/bitcoin/diFFiculty/5y?t=l

https://btc.com/stats/diFF

下图是写此文章时,比特币区块 546336 的摘要。

根据难度值如何计算算力

现在我们知道挖矿难度是如何计算的,那么为了挖出一个区块,需要执行多次哈希运算才能找到随机数,使得区块的哈希值小于目标值呢?

前面已确定 $T_1=0x1d00FFFF$,解压为 $:0xFFFF × 2 ^ 208$ ,对于 难度 D 的目标值:

因此,挖出难度为 D 的区块预计需要计算的哈希次数为:

目前难度计算速度要求是在10分钟内找到,即在600秒内完全计算,意味着网络算力最低必须是:

依上计算,当 D=1 时,需要每秒计算7158278次哈希,即: 7.15 Mhahs/s。

目标值计算源代码

在调整难度时,调整的是目标值。目标值计算公式如下,但在实际计算时有些特别处理,将目标值控制在一定范围内。

新目标值= 当前目标值 * 实际2016个区块出块时间 / 理论2016个区块出块时间(2周)。

判断是否需要更新目标值( 2016的整数倍),如果不是则继续使用最后一个区块的目标值

计算前2016个区块出块用时

如果用时低于半周,则按半周计算。防止难度增加4倍以上。

如果用时高于8周,则按8周计算。防止难度降低到4倍以下。

用时乘以当前难度

再除以2周

如果超过最大难度限制,则按最大难度处理

计算过程,Go代码如下。点击查看bticoin C++源码

var (

bigOne = big.NewInt(1)

// 最大难度:00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,2^224,0x1d00FFFF

mainPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 224), bigOne)

powTargetTimespan = time.Hour * 24 * 14 // 两周

)

func CalculateNextWorkTarget(prev2016block, lastBlock Block) *big.Int {

// 如果新区块(+1)不是2016的整数倍,则不需要更新,仍然是最后一个区块的 bits

if (lastBlock.Head.Height+1)%2016 != 0 {

return CompactToBig(lastBlock.Head.Bits)

}

// 计算 2016个区块出块时间

actualTimespan := lastBlock.Head.Timestamp.Sub(prev2016block.Head.Timestamp)

if actualTimespan < powTargetTimespan/4 {

actualTimespan = powTargetTimespan / 4

} else if actualTimespan > powTargetTimespan*4 {

// 如果超过8周,则按8周计算

actualTimespan = powTargetTimespan * 4

}

lastTarget := CompactToBig(lastBlock.Head.Bits)

// 计算公式: target = lastTarget * actualTime / expectTime

newTarget := new(big.Int).Mul(lastTarget, big.NewInt(int64(actualTimespan.Seconds())))

newTarget.Div(newTarget, big.NewInt(int64(powTargetTimespan.Seconds())))

//超过最多难度,则重置

if newTarget.Cmp(mainPowLimit) > 0 {

newTarget.Set(mainPowLimit)

}

return newTarget

}

测试代码如下,计算的是对高度为497951+1出块时计算的新目标值。

func TestGetTarget(t *testing.T) {

firstTime, _ := time.Parse("2006-01-02 15:04:05", "2017-11-25 03:53:16")

lastTime, _ := time.Parse("2006-01-02 15:04:05", "2017-12-07 00:22:42")

prevB := Block{Head: BlockHeader{Height: 497951, Bits: 0x1800d0f6, Timestamp: lastTime}}

prev2016B := Block{Head: BlockHeader{Height: 495936, Bits: 0x1800d0f6, Timestamp: firstTime}}

result := CalculateNextWorkTarget(prev2016B, prevB)

bits := BigToCompact(result)

if bits != 0x1800b0ed {

t.Fatalf("expect 0x1800b0ed,unexpected %x", bits)

}

}

比特币哈希算法采用的是SHA256进行工作量证明。

在bitcoin实时查看比特币算力。

https://physics.nist.gov/cuu/Units/prefixes.html

IEEE二进制浮点数算术标准(IEEE 754)

学分: 20

分类: 科普与研究

标签:

POW 

挖矿难度 

点赞 0

收藏 0

分享

Twitter分享

微信扫码分享

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

你可能感兴趣的文章

【登链公开课】直播预告:有用的 PoW 算法推演 3.2日(周四)晚8点

1444 浏览

比较:以太坊 PoS 和 PoW 安全性

1332 浏览

Web3系列教程之入门篇---4. 什么是工作量证明(POW)?

1999 浏览

ETH 挖矿算法

1918 浏览

共识算法对比:PoW vs PoS vs PoH

4298 浏览

Vitalik:权益证明的好处

1747 浏览

相关问题

0 条评论

请先 登录 后评论

开发者七哥

关注

贡献值: 505

学分: 21960

区块链项目商业合作请联系微信 triple721

文章目录

关于

关于我们

社区公约

学分规则

Github

伙伴们

DeCert

ChainTool

GCC

合作

广告投放

发布课程

联系我们

友情链接

关注社区

Discord

Twitter

Youtube

B 站

公众号

关注不错过动态

微信群

加入技术圈子

©2024 登链社区 版权所有 |

Powered By Tipask3.5|

粤公网安备 44049102496617号

粤ICP备17140514号

粤B2-20230927

增值电信业务经营许可证

×

发送私信

请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!

发给:

内容:

取消

发送

×

举报此文章

垃圾广告信息:

广告、推广、测试等内容

违规内容:

色情、暴力、血腥、敏感信息等内容

不友善内容:

人身攻击、挑衅辱骂、恶意行为

其他原因:

请补充说明

举报原因:

取消

举报

×

如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!