05.24 區塊鏈入門教程第二期:挖礦?

上一期我們講了關於區塊鏈的基本知識,鏈接在這 ,今天我們就來講一下區塊鏈關於挖礦的知識。

區塊鏈入門教程第二期:挖礦?


一、挖礦和礦工

在上一期我們已經說了,區塊鏈是由很多個節點組成的,為了保證節點之間的同步,所以每一個新區塊的添加速度不能太快。試想一下,你剛剛同步了一個區塊,準備基於它生成下一個區塊,但這時別的節點又有新區塊生成,你不得不放棄做了一半的計算,再次去同步。因為每個區塊的後面,只能跟著一個區塊,你永遠只能在最新區塊的後面,生成下一個區塊。所以,你別無選擇,一聽到信號,就必須立刻同步。

所以,區塊鏈的發明者中本聰(這是假名,真實身份至今未知)故意讓添加新區塊,變得很困難。他的設計是,平均每10分鐘,全網才能生成一個新區塊,一小時也就六個。

這種產出速度不是通過命令達成的,而是故意設置了海量的計算。也就是說,只有通過極其大量的計算,才能得到當前區塊的有效哈希,從而把新區塊添加到區塊鏈。由於計算量太大,所以快不起來。

這個過程就叫做採礦(mining),因為計算有效哈希的難度,好比在全世界的沙子裡面,找到一粒符合條件的沙子。計算哈希的機器就叫做礦機,操作礦機的人就叫做礦工。

二、難度係數

讀到這裡,你可能會有一個疑問,人們都說採礦很難,可是採礦不就是用計算機算出一個哈希嗎,而計算也正是計算機的強項啊,怎麼會變得很難,遲遲算不出來呢?

原因為不是任意一個哈希都可以,只有滿足條件的哈希才會被區塊鏈接受。這個條件特別苛刻,使得絕大部分哈希都不滿足要求,必須重算。

因為每一個區塊都包含了一個難度係數(difficulty),這個值決定了計算哈希的難度。舉例來說,第100000個區塊的難度係數是 14484.16236122。我們也可以將difficulty簡單的可以理解為:挖到數據區塊的所用時間多少。

同時難度值 difficulty的計算公式為:難度值 = 最大目標值 / 當前目標值

那什麼是目標值:目標值是當前區塊生成所達成目標值的hash值,用於礦工的工作量證明。礦工挖掘的區塊的頭部hash值必須小於目標值,數據區塊才能被挖掘成功。

當前目標值是指現在產生數據區塊的頭部信息hash值參考指標。最大目標值是一個定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。

由於只有小於目標值的哈希才是有效的,否則哈希無效,必須重算。由於目標值非常小,哈希小於該值的機會極其渺茫,可能計算10億次,才算中一次。這就是採礦如此之慢的根本原因。

上一篇文章也說過,當前區塊的哈希由區塊頭唯一決定。如果要對同一個區塊反覆計算哈希,就意味著,區塊頭必須不停地變化,否則不可能算出不一樣的哈希。區塊頭裡面所有的特徵值都是固定的,為了讓區塊頭產生變化,中本聰故意增加了一個隨機項,叫做 Nonce。

Nonce 是一個隨機值,礦工的作用其實就是猜出 Nonce 的值,使得區塊頭的哈希可以小於目標值,從而能夠寫入區塊鏈。Nonce 是非常難猜的,目前只能通過窮舉法一個個試錯。根據協議,Nonce 是一個32位的二進制值,即最大可以到21.47億。第 100000 個區塊的 Nonce 值是274148111,可以理解成,礦工從0開始,一直計算了 2.74 億次,才得到了一個有效的 Nonce 值,使得算出的哈希能夠滿足條件。

運氣好的話,也許一會就找到了 Nonce。運氣不好的話,可能算完了21.47億次,都沒有發現 Nonce,即當前區塊體不可能算出滿足條件的哈希。這時,協議允許礦工改變區塊體,開始新的計算。

三、難度係數的動態調節

正如上一篇所說,採礦具有隨機性,沒法保證正好十分鐘產出一個區塊,有時一分鐘就算出來了,有時幾個小時可能也沒結果。總體來看,隨著硬件設備的提升,以及礦機的數量增長,計算速度一定會越來越快。

為了將產出速率恆定在十分鐘,中本聰還設計了難度係數的動態調節機制。他規定,難度係數每兩週(2016個區塊)調整一次。如果這兩週裡面,區塊的平均生成速度是9分鐘,就意味著比法定速度快了10%,因此接下來的難度係數就要調高10%;如果平均生成速度是11分鐘,就意味著比法定速度慢了10%,因此接下來的難度係數就要調低10%。

難度係數越調越高(目標值越來越小),導致了採礦越來越難。

但是,有人會問,區塊鏈是一個去中心化的,這個難度是由誰來調節的呢?難度的調整是在每個完整節點中獨立自動發生的。每2,016個區塊中的所有節點都會調整難度。難度的調整公式是由最新2,016個區塊的花費時長與20,160分鐘(兩週,即這些區塊以10分鐘一個速率所期望花費的時長)比較得出的。難度是根據實際時長與期望時長的比值進行相應調整的(或變難或變易)。簡單來說,如果網絡發現區塊產生速率比10分鐘要快時會增加難度。如果發現比10分鐘慢時則降低難度。

這個公式可以總結為:

New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)

四、礦工的收益

既然挖礦不容易,為什麼有人願意做礦工呢?以比特幣舉例。

一是交易的確認離不開礦工。

二是比特幣協議規定,挖到新區塊的礦工將獲得獎勵,一開始(2008年)是50個比特幣,然後每4年減半,目前(2018年)是12.5個比特幣。這也是比特幣的供給增加機制,流通中新增的比特幣都是這樣誕生的。

你可能看出來了,每4年獎勵減半,由於比特幣可以分割到小數點後八位,那麼到了2140年,礦工將得不到任何獎勵,比特幣的數量也將停止增加。這時,礦工的收益就完全依靠交易手續費了。

所謂交易手續費,就是礦工可以從每筆交易抽成,具體的金額由支付方自願決定。你完全可以一毛不拔,一分錢也不給礦工,但是那樣的話,你的交易就會沒人處理,遲遲無法寫入區塊鏈,得到確認。礦工們總是優先處理手續費最高的交易。

目前由於交易數量猛增,手續費已經水漲船高,一個區塊2000多筆交易的手續費總額可以達到3~10個比特幣。如果你的手續費給低了,很可能過了一個星期,交易還沒確認。

一個區塊的獎勵金12.5個比特幣,再加上手續費,收益是相當可觀的。按照目前的價格,可以達到75萬人民幣左右。想想看,運氣好的話,幾分鐘就能挖到一個區塊,拿到這樣一大筆錢,所以人們才對挖礦趨之若鶩。

五、總結

一句話,礦工存在的原因的就是目前現在的收益大於自己的成本,有利可圖這才是人性。

今天的文章就寫到這裡了,明天來寫區塊鏈的代表貨幣比特幣,


分享到:


相關文章: