當前位置:
首頁 > 最新 > 什麼是「挖礦」?比特幣「挖礦」原理解析

什麼是「挖礦」?比特幣「挖礦」原理解析

通告:

本專欄系列原創文章同步發布在【簡億區塊鏈@簡書】,微信公眾號【簡億區塊鏈】以及【開發者頭條獨家號:簡億區塊鏈】上。


我們在系列文章中的《 比特幣的「區塊」中藏有什麼秘密:區塊鏈區塊結構解析》介紹了什麼是「區塊鏈」以及「區塊」的底層數據結構解析;

本文主要圍繞著網路常用切口「挖礦」來介紹 下「挖礦」的本質和底層原理;

接前言,強調下「區塊鏈」的三個核心特定:

1)凡是被各節點認證過的歷史生成區塊,是絕不會被篡改的;因為區塊鏈的只有append(追加)操作,沒有隨機update(隨機寫)的操作。

2)新生成的區塊,只能鏈接「掛載」在當前鏈條的末端『;

這也就意味著:每個節點在開始運行(或者是運行中)創建新區快這項工作的時候,凡是有新區塊被確認增加到了區塊鏈上,那麼,當前節點就需要停止手頭正在進行的「創建」新區塊的工作,轉而需要先將最新的區塊鏈數據同步到本地,再繼續重新開始試圖「創建」新區塊。

3)新區塊的創建,是一個極其困難複雜的工作;是一個需要符合特定計算規則,計算結果需要滿足特別目標值(這個值很難滿足)時,新區快才算初步創建成功;

「挖礦」的幾個特點

如果非要一句話簡單概括的話:在最新區塊鏈的數據上,生成一個符合條件的區塊,鏈入區塊鏈的過程,就是挖礦。

「挖礦」具有以下幾個特點:

1)「挖礦」的過程 就是運行特定的計算公式,試圖計算出符合特定規則的Hash值的一個過程;

2)「挖礦」的本質是:生成最新區塊,掛在到區塊鏈的末端;其本質也可以理解為:爭奪賬本的記賬權。

3)「挖礦」為什麼叫做「挖礦」,因為「生成新區快」這個操作成功,會獲得大量的獎勵;

4)有「挖礦」,自然有「礦工」,礦工指的是:所有運行(以比特幣為例)比特幣客戶端,鏈接比特幣網路的終端節點,比如CPU,GPU,礦機,礦池組等等

5)為什麼大家對「挖礦」趨之若鶩?

因為能獲得超出成本的大量的獎勵;獎勵包含兩部分:

第一部分是:創建新區塊成功,系統獎賞當前礦工的「獎勵金」(又叫coinBase交易金),這部分佔主要比例;

第二部分是:所生成的新區塊里打包的所有交易的交易傭金(交易費用),這部分佔一小部分;

6)接第五點,比特幣系統為何要獎勵礦工「coinBase交易金」?

對維持「系統」網路穩定,對確認比特幣交易,對參與比特幣認證的節點的獎勵;因為挖礦同時還保護著比特幣系統的安全,防止欺詐交易,避免「雙重支付」;這一點很重要!

PS:

中本聰在設計中規定:

1)新區塊的產生速度是大約每10分鐘一個(這裡面用的大約,不是精確的十分鐘),每一個新區塊的產生都會伴隨著一定數量的新幣發行。每開採210,000個新區塊(中本聰規定的&大約耗時4年),新幣發行速率降低50%,初始獎勵每區塊50BTC,每隔4年獎勵減半,目前獎勵為12.5BTC。

2)十分鐘是一個均值,生產速率每產生2016個新區塊系統會自動調節一次,調節途徑通過調整diffculty參數;

---轉譯自《BitCoin Wiki # Mining》


接上,為什麼要規定每十分鐘挖出一個礦呢?有什麼具體的考量嗎?

首先說明:10 分鐘是系統找到一個有效的交易鏈塊所需要的平均時間(這個時間不是固定的);

基於運氣這個時間實際上會稍長或稍短,比如突然間網路中,算力急速增加,那麼生成新區塊的時間就會變短;這個平均時長"力圖逼近10分鐘",出塊速度會在系統每生成2016個塊之後自動調整的,通過調整難度係數difficulty(前序文章中有講過)

大致參考源代碼:

static const int64 nTargetTimespan = 14 * 24 * 60 * 60;//目標時間窗口長度:兩周

static const int64 nTargetSpacing = 10 * 60;// block頻率,每10分鐘一塊

static const int64 nInterval = nTargetTimespan / nTargetSpacing;// 每兩周的產量2016,也是調節周期

10分鐘--->1分鐘會如何?

1)間隔太短,易導致較多孤塊的出現,不安全,不利於交易確認,還浪費資源;

原因是:每一個「礦工」都需要時刻確認自己是否在主鏈上,那麼就需要礦工之間時刻交流,交流受網速影響(在網路情況不良時,間隔時間越短,這個網路不良的影響對最終的結果影響越大),當有「礦工」生成新的區塊,發現它們不在主鏈上,也就是孤塊,只能丟棄,造成浪費。

2)如果出塊間隔太短,側面的也就說明,出塊的難度太低;

當出塊的頻率變高的時候,塊與塊之間的碰撞頻率也就變高,碰撞次數越高,主鏈被fork(分叉)的概率就越大,fork越多,鏈結構就會變成樹結構。而且每當出現分叉的時候,系統需要花費性能去選出bestChain(bestChain被當做Main鏈,被各節點認可);

PS:fork即為分叉,分叉分為軟分叉和硬分叉,關於分叉和bestChain的選擇相關知識點會在本系列的其他文章中講述。


通俗地講,「挖礦」即生成新區塊的本質是:做一系列的哈希運算,當運算得到的哈希值符合目標規則,即為挖礦成功(其實,就是尋找符合條件的Nonce參數的過程,下文會詳細解釋,此處記住這個概念即可)。

也就是比較倆數值的大小,target目標值(固定)與哈希計算值(礦工每次計算算出來的值),這兩個值的計算公式是什麼呢?

如下圖,為區塊頭(header)結構,結合著圖示,介紹下挖礦的原理。

這裡直介紹兩個關鍵信息:

1)難度係數:difficulty參數,顧名思義用來調節生成區塊的難度的。該值決定了target的大小,

公式為:target=2**(256-Difficulty)

中本聰希望生成每個區塊需要耗時10分鐘,但是實際情況往往多變,生成區塊(算出target)的時間有可能遠小於十分鐘(difficulty偏下)或者遠大於十分鐘(difficulty偏大);

那麼在每2016【2016=14(day)*24(hour)*60(min)/10(min)】個區塊生成完畢之後,系統要自動調節difficulty參數大小;

調整公式為:

New Difficulty= Old Difficulty*(最新的2016區塊實際耗時/ 20160 minutes).即:最新2016個區塊花費時長與20160分鐘(20160分鐘是2016個區塊期望的產出時間)比較所得。

2)隨機數:Nonce參數,也可以理解為POW工作量證明的計數器;

該欄位是最重要的一個欄位,因為其實「挖礦」的過程就是尋找符合條件的Nonce值的過程;我們知道「挖礦」是做一些列的哈希計算的過程,該過程為:對區塊頭和nonce進行哈希運算【sha256(str(header)+str(nonce))】;如果本次所得的哈希值

PS:

1)Nonce叫「隨機數」的原因是因為原則上每次計算當前Nonce值可以隨機產生。但是,實際情況下:什麼方式最容易計算出目標值呢?窮舉法;所以每次計算Nonce從0開始;

2)為什麼說「挖礦」這麼難呢?

target值符合特定的規則:十六進位的以連續0開頭,且連續的0越多越能符合命中規則;

假如當前target值為連續20個0開頭的十六進位數字;

舉個例子:

好比一個不透明的口袋裡有倆形狀一模一樣的乒乓球,一個紅色球,一個藍色球;每次抓鬮抓到藍色則標記位0,紅色標記位1,那麼如果礦工想要「挖礦」成功,就意味著:至少連續20次抓鬮均抓到籃球。是不是瞬間覺得很難呢?

3)接上例子,如果連續2016個區塊的生成時間小於期望的20160分鐘,系統會自動調節Difficulty係數,比如調節Difficulty係數之後,target變成了連續21個0開頭的十六進位數字,此時,礦工想要挖礦成功,則需要連續21次抓到籃球,生成新區塊的時間就會相對變長。是不是更難了呢?

如果連續2016個區塊的生成時間大於期望的20160分鐘,則反向調低難度係數。

以上既是:比特幣「挖礦」的原理解析,僅為個人觀點,歡迎討論指正~

本期【簡億區塊鏈】時間到此結束,敬請期待下期~

下期預告:

主題:《「比特幣」交易打包過程與「區塊鏈」的軟硬「分叉」》

預計發布時間:2018年3月23日(周五) 8點見

【彩蛋來啦】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 簡億區塊鏈 的精彩文章:

TAG:簡億區塊鏈 |