比特幣挖礦難度與收益計算

前言

近期大家很關心的一個事情,就是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划算,當然,彙集歷史數據,可以通過查看曲線的方式,看到更直接的難度和收益變化。


推薦閱讀:

網下打新收益分析
銀行會破產嗎?
怎樣評價貝米錢包 ?
為什麼場內市場的交易量很小,大多的債券都在場外市場交易?

TAG:比特币Bitcoin | 挖矿 | 收益 |