上一期我們講了關(guān)于區(qū)塊鏈的基本知識,鏈接在這《區(qū)塊鏈入門教程***期:區(qū)塊鏈》,今天我們就來講一下區(qū)塊鏈關(guān)于挖礦的知識。
一、挖礦和礦工
在上一期我們已經(jīng)說了,區(qū)塊鏈?zhǔn)怯珊芏鄠€節(jié)點組成的,為了保證節(jié)點之間的同步,所以每一個新區(qū)塊的添加速度不能太快。試想一下,你剛剛同步了一個區(qū)塊,準(zhǔn)備基于它生成下一個區(qū)塊,但這時別的節(jié)點又有新區(qū)塊生成,你不得不放棄做了一半的計算,再次去同步。因為每個區(qū)塊的后面,只能跟著一個區(qū)塊,你永遠(yuǎn)只能在***區(qū)塊的后面,生成下一個區(qū)塊。所以,你別無選擇,一聽到信號,就必須立刻同步。
所以,區(qū)塊鏈的***中本聰(這是假名,真實身份至今未知)故意讓添加新區(qū)塊,變得很困難。他的設(shè)計是,平均每10分鐘,全網(wǎng)才能生成一個新區(qū)塊,一小時也就六個。
這種產(chǎn)出速度不是通過命令達(dá)成的,而是故意設(shè)置了海量的計算。也就是說,只有通過極其大量的計算,才能得到當(dāng)前區(qū)塊的有效哈希,從而把新區(qū)塊添加到區(qū)塊鏈。由于計算量太大,所以快不起來。
這個過程就叫做采礦(mining),因為計算有效哈希的難度,好比在全世界的沙子里面,找到一粒符合條件的沙子。計算哈希的機器就叫做礦機,操作礦機的人就叫做礦工。
二、難度系數(shù)
讀到這里,你可能會有一個疑問,人們都說采礦很難,可是采礦不就是用計算機算出一個哈希嗎,而計算也正是計算機的強項啊,怎么會變得很難,遲遲算不出來呢?
原因為不是任意一個哈希都可以,只有滿足條件的哈希才會被區(qū)塊鏈接受。這個條件特別苛刻,使得絕大部分哈希都不滿足要求,必須重算。
因為每一個區(qū)塊都包含了一個難度系數(shù)(difficulty),這個值決定了計算哈希的難度。舉例來說,第100000個區(qū)塊的難度系數(shù)是 14484.16236122。我們也可以將difficulty簡單的可以理解為:挖到數(shù)據(jù)區(qū)塊的所用時間多少。
同時難度值 difficulty的計算公式為:難度值 = ***目標(biāo)值 / 當(dāng)前目標(biāo)值
那什么是目標(biāo)值:目標(biāo)值是當(dāng)前區(qū)塊生成所達(dá)成目標(biāo)值的hash值,用于礦工的工作量證明。礦工挖掘的區(qū)塊的頭部hash值必須小于目標(biāo)值,數(shù)據(jù)區(qū)塊才能被挖掘成功。
當(dāng)前目標(biāo)值是指現(xiàn)在產(chǎn)生數(shù)據(jù)區(qū)塊的頭部信息hash值參考指標(biāo)。***目標(biāo)值是一個定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。
由于只有小于目標(biāo)值的哈希才是有效的,否則哈希無效,必須重算。由于目標(biāo)值非常小,哈希小于該值的機會極其渺茫,可能計算10億次,才算中一次。這就是采礦如此之慢的根本原因。
上一篇文章也說過,當(dāng)前區(qū)塊的哈希由區(qū)塊頭唯一決定。如果要對同一個區(qū)塊反復(fù)計算哈希,就意味著,區(qū)塊頭必須不停地變化,否則不可能算出不一樣的哈希。區(qū)塊頭里面所有的特征值都是固定的,為了讓區(qū)塊頭產(chǎn)生變化,中本聰故意增加了一個隨機項,叫做 Nonce。
Nonce 是一個隨機值,礦工的作用其實就是猜出 Nonce 的值,使得區(qū)塊頭的哈??梢孕∮谀繕?biāo)值,從而能夠?qū)懭雲(yún)^(qū)塊鏈。Nonce 是非常難猜的,目前只能通過窮舉法一個個試錯。根據(jù)協(xié)議,Nonce 是一個32位的二進(jìn)制值,即***可以到21.47億。第 100000 個區(qū)塊的 Nonce 值是274148111,可以理解成,礦工從0開始,一直計算了 2.74 億次,才得到了一個有效的 Nonce 值,使得算出的哈希能夠滿足條件。
運氣好的話,也許一會就找到了 Nonce。運氣不好的話,可能算完了21.47億次,都沒有發(fā)現(xiàn) Nonce,即當(dāng)前區(qū)塊體不可能算出滿足條件的哈希。這時,協(xié)議允許礦工改變區(qū)塊體,開始新的計算。
三、難度系數(shù)的動態(tài)調(diào)節(jié)
正如上一篇所說,采礦具有隨機性,沒法保證正好十分鐘產(chǎn)出一個區(qū)塊,有時一分鐘就算出來了,有時幾個小時可能也沒結(jié)果??傮w來看,隨著硬件設(shè)備的提升,以及礦機的數(shù)量增長,計算速度一定會越來越快。
為了將產(chǎn)出速率恒定在十分鐘,中本聰還設(shè)計了難度系數(shù)的動態(tài)調(diào)節(jié)機制。他規(guī)定,難度系數(shù)每兩周(2016個區(qū)塊)調(diào)整一次。如果這兩周里面,區(qū)塊的平均生成速度是9分鐘,就意味著比法定速度快了10%,因此接下來的難度系數(shù)就要調(diào)高10%;如果平均生成速度是11分鐘,就意味著比法定速度慢了10%,因此接下來的難度系數(shù)就要調(diào)低10%。
難度系數(shù)越調(diào)越高(目標(biāo)值越來越?。?,導(dǎo)致了采礦越來越難。
但是,有人會問,區(qū)塊鏈?zhǔn)且粋€去中心化的,這個難度是由誰來調(diào)節(jié)的呢?難度的調(diào)整是在每個完整節(jié)點中獨立自動發(fā)生的。每2,016個區(qū)塊中的所有節(jié)點都會調(diào)整難度。難度的調(diào)整公式是由***2,016個區(qū)塊的花費時長與20,160分鐘(兩周,即這些區(qū)塊以10分鐘一個速率所期望花費的時長)比較得出的。難度是根據(jù)實際時長與期望時長的比值進(jìn)行相應(yīng)調(diào)整的(或變難或變易)。簡單來說,如果網(wǎng)絡(luò)發(fā)現(xiàn)區(qū)塊產(chǎn)生速率比10分鐘要快時會增加難度。如果發(fā)現(xiàn)比10分鐘慢時則降低難度。
這個公式可以總結(jié)為:
New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)
四、礦工的收益
既然挖礦不容易,為什么有人愿意做礦工呢?以比特幣舉例。
一是交易的確認(rèn)離不開礦工。
二是比特幣協(xié)議規(guī)定,挖到新區(qū)塊的礦工將獲得獎勵,一開始(2008年)是50個比特幣,然后每4年減半,目前(2018年)是12.5個比特幣。這也是比特幣的供給增加機制,流通中新增的比特幣都是這樣誕生的。
你可能看出來了,每4年獎勵減半,由于比特幣可以分割到小數(shù)點后八位,那么到了2140年,礦工將得不到任何獎勵,比特幣的數(shù)量也將停止增加。這時,礦工的收益就完全依靠交易手續(xù)費了。
所謂交易手續(xù)費,就是礦工可以從每筆交易抽成,具體的金額由支付方自愿決定。你完全可以一毛不拔,一分錢也不給礦工,但是那樣的話,你的交易就會沒人處理,遲遲無法寫入?yún)^(qū)塊鏈,得到確認(rèn)。礦工們總是優(yōu)先處理手續(xù)費***的交易。
目前由于交易數(shù)量猛增,手續(xù)費已經(jīng)水漲船高,一個區(qū)塊2000多筆交易的手續(xù)費總額可以達(dá)到3~10個比特幣。如果你的手續(xù)費給低了,很可能過了一個星期,交易還沒確認(rèn)。
一個區(qū)塊的獎勵金12.5個比特幣,再加上手續(xù)費,收益是相當(dāng)可觀的。按照目前的價格,可以達(dá)到75萬人民幣左右。想想看,運氣好的話,幾分鐘就能挖到一個區(qū)塊,拿到這樣一大筆錢,所以人們才對挖礦趨之若鶩。
五、總結(jié)