比特币挖矿的难度与收益计算

in cn •  7 years ago 

前言

近期大家很关心的一个事情,就是BCC分叉后,由于难度调整以及价格上涨,矿工们为了获得更高的收益,开始迁移到BCC挖矿,但由于算力的涌入,下个难度周期又会提高难度,矿工又迁移到BTC矿池,如下图所示,两种币的挖矿收益分别计算出来了,按现在的价格,挖BCC的收益会高一点。这是一个很有意思的“跳矿”现象,那么这个现象的背后,到底是什么在起作用呢?

图1-BTC挖矿收益计算器

图2-BCC挖矿收益计算器

这个现象的直接原因是收益,比特币的挖矿收益是和难度有关的,比特币每2016个块调整一次难度,那么这个难度是从何而来,收益又如何被影响的呢?

比特币的难度

首先来看看难度是怎么来的,比特币的挖矿里面,是有一个计算哈希的目标值的,如果这个目标值越小,那么难度越大。简单来说,难度是一个指标,用于标示计算当前的目标值的困难程度。

难度计算公式如下:

diff = diff_1_target / target
目标值是一个很大的数字,这里出现了一个 diff_1_target,这是常数,是一个很大的数字,这个数字也被称作是矿池难度,即矿池挖矿时的最大难度。这个最大难度值是标记为0x1d00ffff的数,这个标记是压缩标记,它的实际值是:

0x00ffff * 2*(8(0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000
计算时,后面三个字节作为底,前面一个字节1d表示的是次方数,最终得出上面这个数字,挖矿时矿池也可以保留的尾数,即

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
而比特币的挖矿难度,根据上面的公式可知,它和diff_1_target及当前网络目标值(target)有关,将diff_1_target值代入,得到:

diff = 0x1d00ffff / target
在调整难度的时候,只需要调整target大小即可,target越小,难度越大,反之,难度越小。矿池一般用后面全是FF的值来代表diff_1_target,计算出来的难度就叫做矿池难度pdiff,如果用后面全是00的值来代表diff_1_target,那么计算出来的难度值是比特币客户端难度bdiff。这里只是说明,它们有两个值,代表不同计算方式,实际上,它们计算出来的难度并不会相差很远。

网络调整难度的目的,是为了调整出块的速度保持在平均10分钟1个块,每2016个块作为一个周期调整,这样刚好2周作为一个周期,如果这2016个块中,平均出块速率快过10分钟1个块,那么难度将会增大到,维持这个难度的情况下,满足10分钟出一个块的水平。什么时候调整难度呢?由于2016的周期从来没有变过,那么该周期内还剩余的区块数量是可以计算出来的:

该周期剩余区块数量 = 2016 - (当前区块高度 % 2016)
以当前最新一个块 #482017 为例

当前高度 % 2016 = 482017 % 2016 = 193

该周期剩余区块数量 = 2016 - 193 = 1823

也即该周期内才出193个区块,得等到1823个块以后才会调整难度,对于BCC来说,也是一样的。

挖矿收益计算

挖矿时,计算出来的区块哈希值,是要小于当前target值的,这个哈希值是一个范围很大的值(从0到(2^256)-1),只有靠矿机的暴力破解,才能算出这个值。

diff_1_target,即0x00000000FFFF0000000000000000000000000000000000000000000000000000 , FFFF后面有26个字节,即8 * 26 = 208位,所以diff_1_target又可以写成 0xffff * (2 ** 208)。

如果当前难度是D的话,那么根据上面我们讲过的公式

diff = diff_1_target / target
那么

target = (0xffff * (2 ** 208)) / D
需要要搜索出这个target值,需要计算的哈希次数是

2 ** 256 / target
将D移到左边,得到

D * (2 ** 256) / (0xffff * (2 ** 208))
将2 ** 208移到左边,得到

D * (2 ** 256) / (2 ** 208) / 0xffff
化简得到

D * (2 ** 48) / 0xffff
也即10分钟(600秒)内要计算这么多次,才能得到一个块,那么平均每秒就是:

D * (2 ** 48) / 0xffff / 600
将0xffff写成十进制是2 ** 16

D * (2 ** 48) / (2 ** 16) / 600
化简得到

D * (2 ** 32) / 600
假设现在全网难度是888171856257,那么平均要计算 6357781793085713285次哈希运算才能得到一个块。我们不妨用现在的算力验证一下,现在的全网算力是5.68 EH/s, 大概接近这个值。

难度和算力的关系我们已经看出来了,难度越大,需要的算力就越大。那么以单位为1Th/s的云合约标准算力来计算,一天的收益能够达到多少呢?

一天能够计算的哈希次数 = 1T * 86400
假设当前难度为D,那么

收益 = 1T * 86400 / D / ( 2 * 32) * 块收益
挖矿收益计算器

基于上面这个公式,获取到网络参数后,你就能计算出现在挖矿的理论收益了,也就可以做一个BTC和BCC的收益计算器了,当然,你如果只是想要理解原理,那么可以使用现成的收益计算器,输入你的算力,将会计算出产出多少个币,乘以币价,就可以计算出当前挖BTC划算还是BCC划算,当然,汇集历史数据,可以通过查看曲线的方式,看到更直接的难度和收益变化。

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

产出是恒定的 人越多算力越高 平均越少