區塊鏈: 技術驅動金融 - 第5章 比特幣挖礦

    這一章將着重討論比特幣挖礦(bitcoin mining)。前面章節討論了比特幣是如何依賴這些礦工們而運行的——他們查證交易記錄、製造和存儲全部的區塊、對被寫入區塊鏈的區塊達成共識、從中獲取一些獎勵。可是還有一些問題:這些礦工是誰?他們是如何進入這個行業的?他們是怎麼運做的?他們的商業模式是什麼?他們對環境形成什麼影響?本章將回答這些問題。編程

5.1 比特幣礦工的任務數組

    要成爲比特幣礦工,你必須加入比特幣網絡並與其餘節點相連,創建鏈接後,你還須要完成六個任務:安全

  • 監聽交易廣播。監聽網絡上的交易廣播,而後驗證它們的簽名是正當有效的,交易輸出沒有被重複支付。
  • 維護區塊鏈網絡和監聽新的區塊。必須先維護區塊鏈。爲此,一開始你能夠要求其餘節點把區塊鏈上的歷史記錄同步過來。而後,監聽那些被廣播到網絡上的新區塊。你的任務是驗證你收到的每一個區塊,這裏的驗證是指保證區塊裏的每筆交易都是有效的,且這個區塊包含了一個有效的臨時隨機數。
  • 組裝一個備選區塊。一旦擁有最新的所有區塊鏈數據備份,你就能夠開始製造本身的區塊了。你要把監聽到的交易進行組合並放進一個新的區塊,而後把該區塊排在這個鏈條中最新的區塊的後面。你必須保證你創建的新區塊中每筆交易都是正當有效的。
  • 找到一個讓你的區塊有效的臨時隨機數。這一步工做量很大,也是礦工工做中最難的一個環節。
  • 但願你的區塊被全網接受。即時你找到了一個區塊,也不能保證該區塊會成爲共識鏈(consensus chain)的一部分。這取決於其餘礦工是否接受你的區塊,並在此基礎上接龍下去。
  • 利潤。若是全部其餘礦工接受了你的區塊,那你就能得到區塊獎勵和交易費。

    礦工的任務能夠分爲兩類:1.驗證交易和區塊。這是比特幣網絡賴以生存和運轉的基礎,這些任務也是比特幣協議須要礦工的首要緣由。2.和其餘礦工競爭。爭取找到區塊並得到獎勵,不是比特幣網絡存在所必須的,而是爲了鼓勵礦工去完成第一類任務而設置的。固然,這兩類任務都是使比特幣成爲一個數字貨幣的必要條件,由於礦工必須得到獎勵纔會去完成這些重要任務。網絡

尋找有效區塊函數

    在第3章中咱們看到,區塊鏈主要有兩層基於哈希函數的結構。1.區塊鏈上,每一個區塊頭部都有一個哈希指針指向前一個區塊。2.每個區塊裏,包括全部交易的默克爾樹。性能

    做爲礦工,首先須要從你的交易池中選出一系列有效的交易而且編譯成默克爾樹。而後,組裝出一個新的區塊,讓它的頭部指向區塊鏈的上一個區塊。在新區塊的頭部,有一個32位的隨機數區域。你須要嘗試不一樣的臨時隨機數,直到該隨機數能使整個區塊的哈希值小於目標值。這個目標值通常體如今以0開始的特定位數的數值。做爲一名礦工,你可能使隨機數從0開始,每次增長1,直到該隨機數能使區塊有效爲止,以下圖所示。區塊鏈

5.1.1 尋找有效區塊。礦工嘗試了一串都是0的隨機數,但沒有產生有效的哈希值,因此礦工繼續嘗試其餘不一樣的臨時隨機數spa

    若是你在嘗試了全部32爲可能的取值後,仍然不能產生一個有效的哈希值,那麼你就必須作出更多改變。注意,上圖中(前面章節也有提到過)幣基交易(coinbase)中還有一個隨機數能夠改動,你能夠改變這個隨機數,好比加1,而後就能夠從新改變區塊頭部的隨機數來尋找有效的哈希值。設計

    改變幣基裏的隨機數後,整個默克爾樹上交易的哈希值都會改變,由於幣基值的改變會向上傳遞,因此改變幣基的隨機數比改變區塊頭部的隨機數代價要大。因此,通常而言,礦工都是更改頭部隨機數,除非在頭部找不到有效的隨機數,纔會選擇改變幣基裏的隨機數。3d

    當你堅持足夠長的時間,你總能找到一對正確的臨時隨機數組合——頭部隨機數和幣基隨機數,用來產生一個符合哈希值要求的新區塊,而後當即宣佈,就有但願得到相應區塊的獎勵和交易費。

決定難度

    每挖出2016個區塊,挖礦難度就會改變一次,而一個區塊的產平生均須要10分鐘,所以,大約兩個星期挖礦難度會調整一次,以維持產生有一個區塊所需的平均時間是10分鐘,調整的方式以下公式:

下一個難度=(上一個難度 * 2016個區塊 * 10分鐘)/ 產生2016個區塊所花費的時間

    挖礦難度改變的週期是兩週,並無什麼特比的含義,只是一個權衡的結果。週期過短,難度會隨着每個週期找到的區塊數目不一樣而波動(機率問題);週期太長,整個網絡的哈希算力會與難度大大地失去平衡。

    每一個礦工獨立地計算難度,只接受達到這個難度的區塊。兩個在不一樣分叉上的礦工可能會有不一樣的計算難度,可是在同一個區塊上工做的礦工必定會對計算難度達成共識。

5.2 挖礦所需硬件

    礦工所要作的計算是十分困難的,其核心在於,對SHA-256哈希函數的運算。SHA-256SHA-2這個家族裏的一員,是目前被公認的最安全的哈希函數。固然,不排除隨着時間的推移,其安全性可能會下降。

    礦工的任務就是儘量快地進行SHA-256函數運算,並且,在比特幣中,這個運算還要進行兩輪。爲何要進行兩輪,緣由並不清楚,可是這就是比特幣的個性,做爲比特幣礦工只能服從。

    比特幣挖礦工做經歷了好幾代的發展歷程。

    1.CPU挖礦。假如一個高端我的電腦每秒計算大約2千萬次哈希函數(20MH/s),根據2015年早期的難度水平(267次方),大概須要幾十萬年來找到一個有效區塊。因此,經過CPU挖礦,不可能賺到錢。

    2.GPU挖礦。第二代礦工使用GPU來挖礦,由於GPU具備高吞吐量和高並行處理能力。可是,大量GPU堆放在一塊兒,冷卻處理是一個突出的問題,並且GPU也很是耗電。假如一個很是高端的顯卡通過超頻後能達到每秒計算大約2億次哈希函數(200MH/s),那麼,100個顯卡一塊兒,在2015年早期,仍須要幾百年才能找到一個有效區塊。所以,GPU挖礦也不賺錢。

    3.FPGA挖礦(現場可編程門陣列挖礦)。FPGAGPU性能好,特別是在數位操做方面。精心使用FPGA可使運算速度達到每秒計算大約10億次哈希函數(1GH/s),那麼,100FPGA一塊兒,在2015年早期,平均仍須要100年的時間才能找到一個有效區塊。所以,FPGA挖礦也只是曇花一現,沒有持續多久。

    4.ASIC挖礦(專用集成電路技術挖礦)。專門爲比特幣挖礦而生產的ASIC礦機,由專門的供應商製造和出售。

    現在,挖礦已經從我的領域轉到了大型專業的挖礦中心,這些中心能夠購買大量的ASIC礦機進行挖礦,從而維持利潤。

將來

    如今,用ASIC挖礦是惟一一種能夠賺錢的比特幣挖礦手段,而這對於個體礦工來講,是十分不友好的。人們不由要問,將來如何發展?小規模礦工是否永遠不可能再參與挖礦過程?更重要的是,如今使用ASIC和專業挖礦中心是否已經違反了比特幣當初的設計初衷:一個徹底去中心化的系統,全部人均可以用本身的電腦去挖礦。這些問題將在第8章中探討。

5.3 能源消耗和生態環保

    比特幣挖礦須要消耗大量的能源,這種「浪費」能源的形式常常被人詬病,由於SHA-256的運算沒有其餘任何用處。可是,咱們必須認識到,任何一種支付系統都須要能源和電力的消耗。如紙幣印刷、ATM機器運行、硬幣分類器、點鈔機、支付服務系統、運行現鈔和金條的運鈔車,無一不在消耗各類能源。你也能夠同樣說這些能源除了維護整個貨幣系統外,沒有任何其餘用處。因此,若是咱們承認比特幣做爲一個有用的貨幣體系,那麼支持比特幣體系的能耗就不能認爲是浪費。

5.4 礦池

    對於單個礦工來講,挖礦就是一個賭博遊戲,你可能一年都找不到一個區塊,而白白浪費成本,也有可能一年以內你找到了好幾個區塊,而後賺了一筆錢。

礦池

    歷史上,當小商人遇到大風險時,會自發組建一個互助保險公司來下降風險。對於比特幣礦工來講,也能夠採起相似的方式。

    礦池應運而生——礦池就是一個比特幣礦工互相之間的保險。一組礦工能夠造成一個礦池共同挖礦,並指定一個幣基接受人。這個接受人就是礦池管理員。只要有人找到一個有效區塊,礦池管理員就會收到這個區塊的獎勵,繼而根據每一個參與人貢獻的工做量按比例分配給全部礦池的參與者。

挖礦工分(mining shares)

    挖礦工分用於衡量每一個參與人的貢獻。工分,就是那些接近有效區塊的區塊。好比,目標值是個前面67位是0的數字,輸出的哈希值必需要低於這個目標纔算有效。在尋找這個哈希值的過程當中,礦工可能會找到其餘一些區塊,它們的哈希值也有許多0,可是達不到67個。礦工們能夠用這些區塊來證實他們確實在工做,一個合格的工分可能要求40-500,這取決於礦池的要求。

    有了工分以後,管理員就能夠按照工分來分配獎勵。最多見最簡單的分配方式有工分分成和按實際比例分成。

礦池跳換(pool hopping)

    礦工在具備不一樣分配方案的礦池之間進行切換,以得到更高的收益。

歷史和標準化

    礦池興起於2010年比特幣的GPU時代。已有不少礦池管理協議應運而生。甚至有人建議這些礦池管理協議應該被標準化,做爲比特幣自己的一部分。

51%礦池

    2015年早期,絕大部分礦工都經過加入礦池來挖礦,只有不多的礦工還在單獨挖礦。20146月,網絡裏最大的礦池GHash.IO,其算力甚至超過了比特幣全網算力的50%,主要是由於這個礦池給礦工優厚的獎勵,以致於你們都想加入。

    一個礦池掌握了全網51%的算力是比特幣社區裏一個使人擔心的問題,GHash也所以遭到反擊,到20148月,GHash再也不接受新用戶而主動下調了一些比例。

    不管如何,礦池有可能會掩蓋一個事實:實際上的算力集中在幾個大的挖礦機構手上,這些大的機構能夠同時參與多個不一樣的礦池以掩蓋它們的真實規模。這種作法稱爲「洗算力」(laundering hashes,相似於洗錢)。由於礦池的緣由,發現洗算力變得很是困難,這也使得外人沒法知曉礦機的實際物理控制有多集中。

礦池是有益的嗎

    礦池的一大問題就是中心化管理。礦池管理員實際掌握了多少算力是一個問題。此外,這減小了比特幣網絡中全節點的數目,即要存儲整個區塊鏈、交易每個交易,如今這些均可以交給礦池管理員了。若是你對礦池的中心化模式感到不安,你可能會問:是否能夠從新設計挖礦流程,你們必須本身進行挖礦。將在第8章討論這個問題。

5.5 挖礦的激勵和策略

    礦工在挑選一個區塊開挖以前,都須要作一些策略上的選擇:

  • 須要包含哪些交易?礦工能夠選擇將哪些交易放進他的區塊裏。默認策略:選擇那些交易費比較高的交易。
  • 對哪個區塊進行挖礦運算?礦工能夠選擇在哪一個區塊上進行挖礦。默認策略:在最長的那條區塊鏈上繼續挖下去。
  • 在同一高度的多個區塊中作選擇。若是兩個不一樣的區塊在同一時間被宣佈發現,這就形成一個分叉,每一個區塊都是能夠被延續下去的,由於它們都符合最長區塊鏈原則。礦工必須選擇在哪個區塊後面接龍下去。默認策略:選擇最早被監聽到的那一個區塊。
  • 何時宣佈區塊?當礦工找到一個有效區塊後,他們要決定何時向比特幣網絡宣佈這一個區塊。默認策略:馬上宣佈。

    下面看看幾種不一樣的策略,有可能會使得挖礦收益更高。

分叉攻擊(forking attack)

    分叉攻擊,即重複支付。一個惡意礦工給受害者Bob發送了一些比特幣購買服務,Bob看到了這筆交易被放進了最長鏈,甚至還等到了6次確認,因而開始提供服務。可是,如今這個礦工建立了一個包含另外一個交易——雙重支付交易的更長的分叉。以下圖所示。

5.5.1 分叉攻擊

    擁有51%算力的礦工能夠經過發起分叉攻擊來得到更高的收益。

經過賄賂來進行分叉攻擊

    經過購買足夠的礦機來發起分叉攻擊,是很困難且很是昂貴的。相反,能夠經過賄賂那些有能力的礦工來爲你工做而發起分叉攻擊,是有可能的。

臨時保留區塊攻擊(temporary block-withholding attacks)

    攻擊場景:當你找到一個區塊後,你不是馬上宣佈,而是在此基礎上繼續尋找下一個區塊。若是你的運氣很好,在其餘礦工找到下一個區塊以前,你連續找到了兩個區塊,而且祕密保留它們。這時候,當一個其餘礦工宣佈找到一個區塊以後,你就馬上同時宣佈你找到的兩個區塊,這樣,另外一個礦工的那個區塊就會成爲孤島,由於你的兩個區塊是更長的分叉,其餘礦工會在你的區塊後面接龍下去。這樣,就致使了另外一個礦工的算力浪費。這種行爲成爲自私挖礦(selfish mining),以下圖所示。

5.5.2 自私挖礦。1是攻擊以前的區塊鏈,23是攻擊者的兩個區塊,4是非攻擊者的區塊,會成爲孤島。

黑名單和懲罰分叉攻擊

    若是一個礦工想把一個來自地址X的交易列入黑名單,換句話說,想凍結從該地址出來的錢。傳統觀點都認爲在比特幣裏這種黑名單沒有辦法實施,由於即便有些礦工拒絕把交易放進區塊鏈,其餘一些礦工仍是會放進區塊鏈。可是,若是你擁有網絡的大部分算力,你能夠對全部礦工宣佈:我將拒絕在包含來自該地址的交易的區塊鏈上工做。這是由於你擁有網絡的大部分算力,區塊鏈的延展基本是你說了算,若是有的礦工執意要把這些交易(來自地址X)放進區塊鏈,那麼他們的區塊必將是區塊鏈的分叉,而最終成爲孤島,浪費算力。

羽量級分叉

    若是你沒有那麼大的算力,那麼你的宣佈就是自找麻煩。由於,若是其餘礦工沒有按照你宣佈的意願來,那麼你就可能會被排除在最長的共識鏈以外。一個重要的緣由是,你的說法——我將拒絕在包含來自該地址的交易的區塊鏈上工做——太絕對了,這會致使一個硬分叉。因此,你應該對其餘礦工宣佈:我將嘗試發起分叉,但過一段時間我可能會放棄封殺的嘗試。例如,你能夠宣佈:當k個區塊證明從地址X出來的交易是正當的,那麼我就回到最長共識鏈上。

   這種狀況下,只要你有必定的算力,你就有可能說服其餘礦工來加入你,一塊兒拒絕來自地址X的交易。只要你把你的計劃公佈出來,其餘礦工就會知道:若是他們膽敢把這個來自地址X的交易放入本身的區塊,那麼就有必定的可能會喪失本身已經發現的區塊【被你的羽量級分叉攻擊(feather forking)所消滅】。

    最終就演化成:其餘礦工通過理性思考,將決定是否加入你對X地址的封殺行動。因此,這個攻擊,即封殺地址X,要想成功,關鍵在於確保其餘礦工相信你將會進行分叉攻擊。

逐漸轉移到用交易費來獎勵挖礦

    隨着挖礦獎勵逐漸發完,交易費將變得愈來愈重要,由於若是一筆交易沒有交易費,那麼礦工不會打包這筆交易,或者最後再打包。

未解的問題

    1.礦工能夠自由選擇挖礦策略,可是目前,大多數礦工仍是選擇默認策略,如今比特幣運行得很好,也很穩定,可是在理論上,咱們暫時沒法論證這是一個穩定的機制。

    2.默認策略可以在實際中一直保持有效,咱們沒有把握。

    3.這個系統將如何演化,是尚不清楚的。基於博弈論對此進行預測也是一個很是有趣的前沿研究領域

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息